Открыть сервис

JWT

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

Структура

Токен JWT состоит из трёх частей, разделённых точками (.):

  1. Header (заголовок) — содержит метаданные о типе токена и алгоритме подписи (например, HS256 для HMAC с SHA-256 или RS256 для RSA).
  2. Payload (полезная нагрузка) — содержит утверждения (claims) — данные, которые передаются. Традиционно разделяются на зарегистрированные (стандартные, например iss — издатель, exp — срок действия), публичные (определяемые сообществом) и приватные (пользовательские).
  3. Signature (подпись) — создаётся путём применения выбранного алгоритма к закодированным Header и Payload с использованием секретного ключа (для симметричных алгоритмов) или закрытого ключа (для асимметричных). Подпись гарантирует, что токен не был изменён после его создания.

Каждая часть кодируется в формат Base64URL (без символов +, / и =), а затем объединяется. Пример токена: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c.

Типы алгоритмов подписи

Алгоритмы, используемые для создания подписи, делятся на три группы:

Жизненный цикл

JWT обычно создаётся на сервере аутентификации после успешной проверки учётных данных пользователя. Токен возвращается клиенту (например, в ответе HTTP). Клиент сохраняет его (чаще всего в localStorage, sessionStorage или в куки с флагом Secure и HttpOnly) и передаёт в каждом запросе к защищённым ресурсам, как правило, в HTTP-заголовке Authorization: Authorization: Bearer <token>.

Сервер, получив JWT, проверяет его подпись и срок действия, извлекает полезную нагрузку и принимает решение о доступе. Токен остаётся действительным до истечения срока, указанного в поле exp; если нужно досрочно «отозвать» токен, требуются дополнительные механизмы (например, чёрные списки или проверка версии токена на сервере). Для снижения риска утечки токенов время жизни часто устанавливают коротким — от 15 минут до часа.

История и развитие

Стандарт JWT был предложен компанией JSON Web Token (JWT) в качестве замены более громоздким протоколам в корпоративных приложениях. Первая версия RFC 7519 была опубликована в мае 2015 года. JWT является частью семейства протоколов JSON (JSON Web Signature — JWS, JSON Web Encryption — JWE). Широкое распространение получил благодаря платформам, таким как Auth0, Okta, и использованию в OAuth 2.0 и OpenID Connect.

Применение

Аутентификация и авторизация

Основная область применения — однократная аутентификация пользователя с последующим доступом к защищённым ресурсам без необходимости повторной отправки пароля. JWT используется в Single Sign-On (SSO), REST API, GraphQL-эндпоинтах и микросервисных архитектурах.

Безопасный обмен данными

JWT может шифроваться (JWE) или подписываться (JWS), что позволяет передавать конфиденциальные данные (например, права доступа или параметры сессии) между серверами, не опасаясь их изменения.

Протоколы и стандарты

JWT является обязательным элементом протокола OAuth 2.0 с расширением RFC 9068 для аутентификации (JSON Web Token via OAuth 2.0) и используется в OpenID Connect как Bearer Token. Также применяется в SAML 2.0 через преобразование утверждений.

Примеры использования

Преимущества и недостатки

Преимущества

Недостатки

Критика и уязвимости

Основные проблемы безопасности JWT связаны с неправильной реализацией. Наиболее частые уязвимости включают:

  1. Отсутствие проверки подписи — если сервер не проверяет подпись, злоумышленник может подменить payload.
  2. Атаки с изменением алгоритма — при использовании алгоритма none (если не отключён на сервере) подпись не проверяется.
  3. Атаки с подделкой алгоритма — если сервер принимает алгоритм симметричной подписи, а выдан токен с асимметричной подписью, злоумышленник может подписать его тем же секретным ключом.
  4. Истечение срока действия — многие системы устанавливают слишком долгий срок жизни (недели или месяцы), что увеличивает окно атаки.
  5. Хранение в localStorage — JWT, сохраняемый в localStorage, подвержен XSS-атакам, так как JavaScript может прочитать его. Более безопасной альтернативой считается хранение в куки с флагами Secure, HttpOnly и SameSite.

Для смягчения угроз рекомендовано: ограничивать область применения алгоритмов (только RS256 или ES256), устанавливать короткое время жизни (15–60 минут), использовать механизм обновления токенов (refresh token) с длинным временем жизни, хранить токены в защищённых куках, а также следить за обновлениями библиотек, реализующих работу с JWT.

Альтернативы

Основные аналоги: PASETO (Platform-Agnostic Security Tokens) — современный стандарт, спроектированный с учётом недостатков JWT, предлагающий только безопасные комбинации алгоритмов и шифрование payload по умолчанию; SWT (Simple Web Token) — старый формат, используемый в Microsoft Azure; SAML — XML-основанный стандарт, применяемый в корпоративных SSO. JWT остаётся наиболее популярным из-за простоты, широкой поддержки в веб-фреймворках и соответствия современным протоколам (OAuth 2.0, OpenID Connect).

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →