Какой общий алгоритм аутентификации с использованием JWT (JSON Web Token)?

«Какой общий алгоритм аутентификации с использованием JWT (JSON Web Token)?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Алгоритм аутентификации с JWT представляет собой stateless-процесс, где токен сам содержит всю необходимую информацию для проверки подлинности и авторизации.

Типичный поток (алгоритм):

  1. Логин (Аутентификация):

    • Клиент отправляет учетные данные (логин/пароль) на защищенный эндпоинт (например, POST /auth/login).
    • Сервер проверяет учетные данные.
    • В случае успеха сервер генерирует JWT, подписывает его секретным ключом (алгоритмом, например, HS256) или приватным ключом (RS256) и отправляет клиенту.
      // Пример payload (полезной нагрузки) JWT
      {
      "sub": "user123",
      "name": "John Doe",
      "roles": ["USER", "EDITOR"],
      "iat": 1516239022,
      "exp": 1516242622 // Токен истекает через 1 час
      }
  2. Использование токена (Авторизация):

    • Клиент сохраняет JWT (обычно в localStorage или HttpOnly cookie).
    • При каждом последующем запросе к защищенному API клиент включает JWT в заголовок Authorization:
      GET /api/protected-resource HTTP/1.1
      Authorization: Bearer <ваш.jwt.токен>
  3. Верификация токена (на сервере):

    • Сервер извлекает токен из заголовка.
    • Проверяет подпись токена, используя секретный/публичный ключ, чтобы убедиться, что токен не был изменен.
    • Проверяет claims (утверждения):
      • exp (expiration time) – не истек ли срок действия.
      • iss (issuer) – выпущен ли доверенным издателем.
      • aud (audience) – предназначен ли для данного приложения.
    • Если проверки пройдены, сервер извлекает данные пользователя (например, sub, roles) из payload токена и использует их для авторизации доступа к ресурсу. Нет необходимости запрашивать базу данных или сессию.

Ключевые преимущества:

  • Stateless: Серверу не нужно хранить сессию, что упрощает масштабирование.
  • Самоописываемость: Токен содержит все необходимые данные.
  • Универсальность: Легко используется между различными сервисами (микросервисами, мобильными клиентами).

Важные меры безопасности:

  • Всегда используйте HTTPS.
  • Устанавливайте короткое время жизни (exp) токена.
  • Для обновления токенов используйте отдельный refresh token, хранящийся более безопасно.