Skip to content
IRC-CodingIRC-Coding
JWTJSON Web TokenБезопасность TokenАутентификация APIClaimsПодпись

JWT Token: структура, безопасность и использование в API

JWT Token: заголовок, полезная нагрузка и подпись, Claims, риски безопасности и лучшие практики для API.

S

schutzgeist

5 min read
JWT Token: структура, безопасность и использование в API

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?

JWT это JSON Web Token. Это компактный формат токена, состоящий из заголовка, полезной нагрузки и подписи, который переносит Claims для аутентификации и авторизации.

2. Как устроен JWT?

JWT состоит из заголовка, полезной нагрузки и подписи, разделённых точками. Все три части закодированы в Base64Url.

3. Что такое Claims?

Claims это информация, содержащаяся в полезной нагрузке. Важные стандартные Claims это sub, iss, aud, exp, iat и nbf. Кроме них можно определить специфичные для приложения Claims.

4. Зашифрована ли полезная нагрузка JWT?

Нет, полезная нагрузка только кодируется в Base64Url и поэтому читаема для каждого, кто имеет токен. JWT не должны содержать чувствительные данные, разве только если они зашифрованы как JWE.

5. Что такое подпись JWT?

Подпись обеспечивает защиту заголовка и полезной нагрузки криптографическим алгоритмом и ключом. Она гарантирует, что токен не было изменено с момента выдачи.

6. Какая разница между RS256 и HS256?

RS256 это асимметричный метод с приватным и открытым ключом. HS256 это симметричный метод с общим секретом. RS256 лучше подходит для распределённых API.

7. Что значит алгоритм none?

Алгоритм none означает, что токен не подписан. Серверы никогда не должны принимать такие токены, потому что их легко подделать.

8. Что такое Algorithm Confusion?

Algorithm Confusion это атака, при которой злоумышленник меняет алгоритм в заголовке и использует открытый ключ в качестве симметричного секрета для подделки токена. Серверы должны строго валидировать алгоритм.

9. Что такое JWKS?

JWKS это JSON Web Key Set. Это набор открытых ключей, которые Resource Server использует для валидации JWT. Ключи можно автоматически получать по URL.

10. Почему JWT должен быть недолгоживущим?

Короткий срок действия снижает риск при краже токена. Злоумышленник может использовать украденный токен только в течение его действия. После этого ему нужен новый токен.

11. Что такое Bearer Token?

Bearer Token это токен, передаваемый в заголовке Authorization с предпреиксом Bearer. Тот, кто владеет токеном, считается авторизованным. Bearer Tokens должны быть защищены.

12. Как валидировать JWT?

JWT проверяется на подпись, время истечения, издателя, audience, алгоритм и требуемые Claims. Валидация должна выполняться на сервере и включать все стандартные проверки.

13. Что такое Refresh Token?

Refresh Token это долгоживущий токен, с помощью которого клиент может запросить новый JWT Access Token. Refresh Tokens должны быть особенно защищены и отозваны.

14. Нужно ли хранить JWT в браузере?

Access Tokens в браузере должны быть недолгоживущими и не храниться длительно в локальном хранилище. Лучше использовать защищённые httpOnly cookies или токены с очень коротким жизненным циклом.

15. Какие типичные ошибки безопасности JWT?

Типичные ошибки это принятие алгоритма none, слабые ключи, длительный срок действия, отсутствие проверки audience и издателя, сохранение чувствительных данных в полезной нагрузке и незащищённая передача.

Продолжение обучения API

Следующая статья в курсе API посвящена Аутентификации и авторизации API: основы, различия и методы — разбираем отличия между аутентификацией и авторизацией, а также рассматриваем основные подходы к их реализации.

Источники

  1. https://datatracker.ietf.org/doc/html/rfc7519
  2. https://datatracker.ietf.org/doc/html/rfc7517
  3. https://datatracker.ietf.org/doc/html/rfc7518

Рекомендуемые книги по безопасности API

Если вы хотите углубиться в изучение JWT, безопасности токенов и защиты API, вот несколько книг, которые мы рекомендуем:

Keine Bücher für Kategorie "security" gefunden.

Назад к блогу
Share:

Похожие статьи