Какую проблему решает JWT-токен в распределённых системах?

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

Ответ

JWT (JSON Web Token) решает проблему stateless-аутентификации и авторизации в распределённых системах (микросервисах, API).

Проблема без JWT: Серверу необходимо хранить сессию пользователя (в памяти или БД), что усложняет масштабирование и создаёт точку отказа.

Решение с JWT: Токен сам содержит всю необходимую информацию (claims) и криптографическую подпись. Любой сервис, имеющий секретный ключ (или публичный ключ для RSA), может проверить его подлинность без обращения к центральной базе данных.

Структура JWT: Header.Payload.Signature

  • Header: Алгоритм подписи и тип токена.
  • Payload (Утверждения): Данные (например, sub (subject), exp (expiration), кастомные поля role).
  • Signature: Гарантирует, что токен не был изменён.

Пример создания и проверки (Java с библиотекой jjwt):

// Создание токена
String secret = "mySecretKey";
String token = Jwts.builder()
    .setSubject("user456")
    .claim("role", "ADMIN")
    .setExpiration(Date.from(Instant.now().plus(Duration.ofHours(1))))
    .signWith(SignatureAlgorithm.HS256, secret.getBytes())
    .compact();

// Проверка токена на другом сервисе
Claims claims = Jwts.parser()
    .setSigningKey(secret.getBytes())
    .parseClaimsJws(token)
    .getBody();

String username = claims.getSubject(); // "user456"
String role = claims.get("role", String.class); // "ADMIN"

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

  • Масштабируемость: Отсутствие состояния на сервере.
  • Самостоятельность: Токен содержит все данные для авторизации.
  • Безопасность: Подпись защищает от подделки (но токен можно перехватить — всегда используйте HTTPS).

Важно: JWT не шифрует payload по умолчанию (используйте JWE для шифрования). Для немедленного отзыва токенов требуется дополнительная инфраструктура (чёрные списки).