JWT
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания токенов доступа, основанных на формате JSON. Представляет собой компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта, который может быть проверен и доверен благодаря цифровой подписи. JWT широко используется в системах аутентификации и авторизации, а также для безопасного обмена данными в распределённых веб-приложениях.
Структура
Токен JWT состоит из трёх частей, разделённых точками (.):
- Header (заголовок) — содержит метаданные о типе токена и алгоритме подписи (например,
HS256для HMAC с SHA-256 илиRS256для RSA). - Payload (полезная нагрузка) — содержит утверждения (claims) — данные, которые передаются. Традиционно разделяются на зарегистрированные (стандартные, например
iss— издатель,exp— срок действия), публичные (определяемые сообществом) и приватные (пользовательские). - Signature (подпись) — создаётся путём применения выбранного алгоритма к закодированным Header и Payload с использованием секретного ключа (для симметричных алгоритмов) или закрытого ключа (для асимметричных). Подпись гарантирует, что токен не был изменён после его создания.
Каждая часть кодируется в формат Base64URL (без символов +, / и =), а затем объединяется. Пример токена: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c.
Типы алгоритмов подписи
Алгоритмы, используемые для создания подписи, делятся на три группы:
- Симметричные (HMAC) — один и тот же секретный ключ используется для создания и проверки подписи. Требуют, чтобы сервер хранил ключ в тайне. Примеры:
HS256,HS384,HS512. - Асимметричные (RSA, ECDSA) — используют пару ключей: закрытый для подписи и открытый для проверки. Это позволяет нескольким сервисам проверять токены без раскрытия закрытого ключа. Примеры:
RS256,RS384,RS512,ES256,ES384,ES512. - Без подписи (none) — алгоритм
noneозначает, что подпись отсутствует. Используется только для отладочных целей или в окружениях с полной изоляцией; в боевых системах не рекомендуется из-за уязвимостей к атакам.
Жизненный цикл
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 через преобразование утверждений.
Примеры использования
- Аутентификация пользователей на веб-сайтах и в мобильных приложениях.
- Авторизация вызовов API в облачных сервисах (Amazon Web Services, Google Cloud Platform, Microsoft Azure) с использованием сервисных аккаунтов.
- Передача прав доступа между микросервисами в системах с JWT-токенами, подписанными общим сертификатом.
Преимущества и недостатки
Преимущества
- Компактность — токен кодируется в компактную строку, что снижает нагрузку на сеть и упрощает передачу в HTTP-заголовках.
- Самодостаточность — все данные (например, идентификатор пользователя, роль, права) хранятся в токене, что уменьшает количество запросов к базе данных.
- Платформонезависимость — JWT работает на любом языке программирования, поддерживающем JSON и Base64URL.
- Безопасность — подпись гарантирует целостность данных; при использовании шифрования (JWE) — также и конфиденциальность.
Недостатки
- Неотзываемость — после выдачи токен действителен до истечения срока; досрочная отмена требует внешних чёрных списков.
- Уязвимость к краже — если злоумышленник перехватит JWT, он сможет использовать его до конца срока действия, даже если пароль пользователя будет изменён. Для смягчения риска используется короткий срок жизни и механизмы обновления (refresh token).
- Отсутствие конфиденциальности по умолчанию — полезная нагрузка JWT закодирована, но не зашифрована; любой может прочитать содержимое payload. Для защиты данных необходимо использовать шифрование (JWE).
- Размер — хотя размер невелик, при хранении в HTTP-куки и передачи с каждым запросом может увеличивать объём трафика по сравнению с идентификаторами сессий.
Критика и уязвимости
Основные проблемы безопасности JWT связаны с неправильной реализацией. Наиболее частые уязвимости включают:
- Отсутствие проверки подписи — если сервер не проверяет подпись, злоумышленник может подменить payload.
- Атаки с изменением алгоритма — при использовании алгоритма
none(если не отключён на сервере) подпись не проверяется. - Атаки с подделкой алгоритма — если сервер принимает алгоритм симметричной подписи, а выдан токен с асимметричной подписью, злоумышленник может подписать его тем же секретным ключом.
- Истечение срока действия — многие системы устанавливают слишком долгий срок жизни (недели или месяцы), что увеличивает окно атаки.
- Хранение в 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).
Интересные факты
- Название «JWT» часто произносится как «джот» (англ. «jot»), что означает «короткая запись» или «заметка».
- Стандарт JWT стал основой для создания Identity Tokens в OpenID Connect.
- Несмотря на простоту формата, JWT поддерживает вложение нескольких уровней подписей и шифрования (JWS и JWE).
Источники
- RFC 7519 – JSON Web Token
- RFC 7515 – JSON Web Signature
- RFC 7516 – JSON Web Encryption
- RFC 9068 – JSON Web Token via OAuth 2.0
- «Introduction to JSON Web Tokens» – Auth0
- JWT.io – онлайн-вьюер для декодирования JWT
- «PASETO vs JWT: A Security Comparison» – Scott Arciszewski
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →