Что такое JWT (JSON Web Token) и для чего он используется?

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

Ответ

JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания токенов доступа, которые позволяют безопасно передавать информацию между сторонами в виде компактного JSON-объекта.

Структура токена (три части, разделенные точками):

  1. Header (Заголовок): Содержит тип токена (JWT) и алгоритм подписи (например, HS256 или RS256).
    {
      "alg": "HS256",
      "typ": "JWT"
    }
  2. Payload (Полезная нагрузка): Содержит утверждения (claims) — данные о пользователе (например, sub — subject, exp — expiration time) и другую информацию.
  3. Signature (Подпись): Создается путем кодирования header и payload с использованием секретного ключа и алгоритма, указанного в header. Подпись обеспечивает целостность токена.

Типичный сценарий использования (аутентификация):

  1. Пользователь входит в систему, сервер проверяет учетные данные.
  2. Сервер создает JWT с данными пользователя (например, userId) и подписывает его.
  3. Токен отправляется клиенту (часто в заголовке Authorization: Bearer <token>).
  4. Клиент отправляет токен с каждым последующим запросом.
  5. Сервер проверяет подпись токена и извлекает данные из payload, не обращаясь к базе данных (stateless-аутентификация).

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

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtExample {
    private static final String SECRET_KEY = "mySuperSecretKey";

    public static String createToken(String username) {
        return Jwts.builder()
            .setSubject(username) // Основное утверждение (claim)
            .setIssuedAt(new Date()) // Время создания
            .setExpiration(new Date(System.currentTimeMillis() + 86400000)) // Срок действия (1 день)
            .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // Подпись
            .compact(); // Генерация строки токена
    }
}

Преимущества: Стандартизация, компактность, самодостаточность (несет в себе данные), не требует хранения состояния на сервере. Недостатки/Риски: Невозможность немедленного отзыва токена (до истечения срока), критическая важность защиты секретного ключа, необходимость безопасной передачи (HTTPS).