Ответ
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания токенов доступа, которые безопасно передают информацию между сторонами в виде компактного JSON-объекта.
Структура токена (3 части, разделенные точками):
- Header (
alg,typ): Определяет алгоритм подписи (например, HS256) и тип токена. - Payload (claims): Содержит утверждения (claims) — данные о пользователе (например,
user_id,roles,exp— срок действия). - Signature: Создается путем кодирования header и payload, их объединения и подписи секретным ключом (HMAC) или приватным ключом (RSA). Подпись верифицирует отправителя и гарантирует целостность данных.
Пример декодированного JWT:
// HEADER: ALGORITHM & TOKEN TYPE
{
"alg": "HS256",
"typ": "JWT"
}
// PAYLOAD: DATA
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622
}
// SIGNATURE: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
Типичный flow аутентификации:
- Пользователь логинится, сервер проверяет учетные данные.
- Сервер генерирует JWT и отправляет его клиенту.
- Клиент включает JWT в заголовок
Authorization: Bearer <token>последующих запросов. - Сервер проверяет подпись и
expв токене, предоставляет доступ к ресурсам.
Преимущества для тестирования безопасности:
- Stateless: Серверу не нужно хранить сессию, что упрощает масштабирование.
- Самостоятельный (self-contained): В токене есть все необходимые данные.
- Уязвимости для проверки: Срок действия токена (
exp), надежность алгоритма подписи, хранение на клиенте (не в localStorage для предотвращения XSS). - Недостаток: Сложность отзыва до выпуска срока действия (решается короткоживущими токенами и refresh-токенами).