JWT Token: структура и безопасность
JWT это компактные, самоописывающиеся токены, которые переносят идентичность и права доступа. Их безопасность полностью зависит от правильной подписи и валидации.
Краткое описание
JWT расшифровывается как JSON Web Token и представляет собой широко распространённый формат для передачи Claims между двумя сторонами. Токен состоит из трёх частей: заголовка, полезной нагрузки и подписи, разделённых точками и закодированных в Base64Url. Заголовок содержит метаданные вроде алгоритма и типа токена, полезная нагрузка содержит Claims с информацией об истечении, издателе и ID пользователя, а подпись обеспечивает целостность и аутентичность данных. JWT часто используется для аутентификации API и авторизации, однако при неправильном применении несёт серьёзные риски. Ключевые правила: короткий срок действия, стойкие алгоритмы, корректная проверка издателя и audience, использование HTTPS и никогда не сохраняйте чувствительные данные в полезной нагрузке, поскольку она только кодируется, а не шифруется.
Основные компоненты
Заголовок
Заголовок обычно содержит два параметра: alg для используемого алгоритма и typ для типа токена. Он закодирован в Base64Url. Алгоритм должен быть асимметричным методом типа RS256 или стойким симметричным методом типа HS256 с длинным секретом. Алгоритм none никогда не должен приниматься.
Полезная нагрузка
Полезная нагрузка содержит Claims. Стандартные Claims это sub для субъекта, iss для издателя, aud для целевой аудитории, exp для времени истечения, iat для времени выдачи, nbf для времени, с которого токен действует, и jti для ID токена. Можно добавлять специфичные для приложения Claims вроде roles или permissions. Полезная нагрузка также кодируется в Base64Url и читаема для каждого, кто имеет токен.
Подпись
Подпись создаётся путём объединения заголовка и полезной нагрузки с последующей подписью выбранным алгоритмом и ключом. Она гарантирует, что токен не было изменено. Получатель проверяет подпись, используя открытый или симметричный ключ издателя.
Кодирование Base64Url
Base64Url это безопасный для URL вариант кодирования Base64. Он заменяет плюс и косую черту на другие символы и удаляет padding. Это позволяет компактно представлять JSON-данные в токенах, которые могут передаваться в URL и заголовках.
Алгоритмы подписи
RS256 использует RSA с SHA-256 и пару ключей: приватный и открытый. Издатель подписывает приватным ключом, получатель проверяет открытым ключом. HS256 использует общий секрет. Асимметричные методы лучше подходят для распределённых систем.
Claims и время истечения
Claims это центральные данные в JWT. exp определяет время истечения и особенно важна для ограничения жизненного цикла токена. Короткий срок действия снижает риск в случае кража токена. iat и nbf помогают дополнительно ограничить период действия.
Валидация токена
Resource Server при получении JWT должен проверить как минимум: подпись, время истечения, издателя, audience, алгоритм и необходимые Claims. Пропущенные или неправильные проверки приводят к несанкционированному доступу.
Передача токена
JWT обычно передаются в заголовке Authorization как Bearer Token. Заголовок выглядит примерно так: Authorization: Bearer eyJhbGciOiJIUzI1NiIs… . Передача всегда должна происходить через HTTPS для предотвращения кражи токена.
Риски безопасности
Известные риски включают Algorithm Confusion, когда злоумышленник меняет алгоритм на none, слабые ключи при HS256, длительный срок действия, отсутствие проверки audience и сохранение чувствительных данных в полезной нагрузке. Кроме того, украденные токены можно использовать столько, сколько они остаются действительными, поэтому короткий жизненный цикл критически важен.
JWK и JWKS
JWK расшифровывается как JSON Web Key, JWKS как JSON Web Key Set. JWKS это набор открытых ключей, которые Resource Server использует для валидации JWT. Authorization Server обычно публикует JWKS по известному URL, благодаря чему ключи можно автоматически обновлять.
Практический пример
API-клиент получает JWT Access Token после успешной аутентификации. Токен состоит из трёх частей, закодированных в Base64Url.
Декодированный заголовок:
{
"alg": "RS256",
"typ": "JWT"
}
Декодированная полезная нагрузка:
{
"sub": "user-98765",
"iss": "https://auth.example.com",
"aud": "https://api.example.com",
"exp": 1751300000,
"iat": 1751296400,
"scope": "read:orders write:orders"
}
Полный токен передаётся в заголовке Authorization:
GET /api/v1/orders
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Resource Server проверяет подпись открытым ключом, валидирует exp, iss, aud и scope, затем разрешает доступ. Если токен истёк или подпись неверна, сервер возвращает 401 Unauthorized.
FAQ: JWT Token
1. Что такое JWT?
2. Как устроен JWT?
3. Что такое Claims?
4. Зашифрована ли полезная нагрузка JWT?
5. Что такое подпись JWT?
6. Какая разница между RS256 и HS256?
7. Что значит алгоритм none?
8. Что такое Algorithm Confusion?
9. Что такое JWKS?
10. Почему JWT должен быть недолгоживущим?
11. Что такое Bearer Token?
12. Как валидировать JWT?
13. Что такое Refresh Token?
14. Нужно ли хранить JWT в браузере?
15. Какие типичные ошибки безопасности JWT?
Продолжение обучения API
Следующая статья в курсе API посвящена Аутентификации и авторизации API: основы, различия и методы — разбираем отличия между аутентификацией и авторизацией, а также рассматриваем основные подходы к их реализации.
Источники
- https://datatracker.ietf.org/doc/html/rfc7519
- https://datatracker.ietf.org/doc/html/rfc7517
- https://datatracker.ietf.org/doc/html/rfc7518
Рекомендуемые книги по безопасности API
Если вы хотите углубиться в изучение JWT, безопасности токенов и защиты API, вот несколько книг, которые мы рекомендуем:
Keine Bücher für Kategorie "security" gefunden.



