Ответ
Алгоритм аутентификации с JWT представляет собой stateless-процесс, где токен сам содержит всю необходимую информацию для проверки подлинности и авторизации.
Типичный поток (алгоритм):
-
Логин (Аутентификация):
- Клиент отправляет учетные данные (логин/пароль) на защищенный эндпоинт (например,
POST /auth/login). - Сервер проверяет учетные данные.
- В случае успеха сервер генерирует JWT, подписывает его секретным ключом (алгоритмом, например, HS256) или приватным ключом (RS256) и отправляет клиенту.
// Пример payload (полезной нагрузки) JWT { "sub": "user123", "name": "John Doe", "roles": ["USER", "EDITOR"], "iat": 1516239022, "exp": 1516242622 // Токен истекает через 1 час }
- Клиент отправляет учетные данные (логин/пароль) на защищенный эндпоинт (например,
-
Использование токена (Авторизация):
- Клиент сохраняет JWT (обычно в
localStorageилиHttpOnlycookie). - При каждом последующем запросе к защищенному API клиент включает JWT в заголовок
Authorization:GET /api/protected-resource HTTP/1.1 Authorization: Bearer <ваш.jwt.токен>
- Клиент сохраняет JWT (обычно в
-
Верификация токена (на сервере):
- Сервер извлекает токен из заголовка.
- Проверяет подпись токена, используя секретный/публичный ключ, чтобы убедиться, что токен не был изменен.
- Проверяет claims (утверждения):
exp(expiration time) – не истек ли срок действия.iss(issuer) – выпущен ли доверенным издателем.aud(audience) – предназначен ли для данного приложения.
- Если проверки пройдены, сервер извлекает данные пользователя (например,
sub,roles) из payload токена и использует их для авторизации доступа к ресурсу. Нет необходимости запрашивать базу данных или сессию.
Ключевые преимущества:
- Stateless: Серверу не нужно хранить сессию, что упрощает масштабирование.
- Самоописываемость: Токен содержит все необходимые данные.
- Универсальность: Легко используется между различными сервисами (микросервисами, мобильными клиентами).
Важные меры безопасности:
- Всегда используйте HTTPS.
- Устанавливайте короткое время жизни (exp) токена.
- Для обновления токенов используйте отдельный refresh token, хранящийся более безопасно.