Ответ
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 для шифрования). Для немедленного отзыва токенов требуется дополнительная инфраструктура (чёрные списки).