Ответ
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания токенов доступа, которые позволяют безопасно передавать информацию между сторонами в виде компактного JSON-объекта.
Структура токена (три части, разделенные точками):
- Header (Заголовок): Содержит тип токена (
JWT) и алгоритм подписи (например,HS256илиRS256).{ "alg": "HS256", "typ": "JWT" } - Payload (Полезная нагрузка): Содержит утверждения (
claims) — данные о пользователе (например,sub— subject,exp— expiration time) и другую информацию. - Signature (Подпись): Создается путем кодирования header и payload с использованием секретного ключа и алгоритма, указанного в header. Подпись обеспечивает целостность токена.
Типичный сценарий использования (аутентификация):
- Пользователь входит в систему, сервер проверяет учетные данные.
- Сервер создает JWT с данными пользователя (например,
userId) и подписывает его. - Токен отправляется клиенту (часто в заголовке
Authorization: Bearer <token>). - Клиент отправляет токен с каждым последующим запросом.
- Сервер проверяет подпись токена и извлекает данные из 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).