Безопасность и сертификаты

Структура JWT: заголовок, полезная нагрузка и подпись

Подписанный JWT обычно использует компактную форму JWS: три сегмента в кодировке Base64URL, разделённые точками. У каждого сегмента своя задача.

Опубликовано

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

Распространённая подписанная форма — JWS Compact Serialization. Она содержит защищённый заголовок, полезную нагрузку и подпись. Компактный зашифрованный JWE содержит пять сегментов, поэтому их количество даёт контекст, но не доказывает валидность токена.

base64url(header).base64url(payload).base64url(signature)

Полезная нагрузка: зарегистрированные и прикладные claims

Payload содержит claims, например sub, iss, aud, exp, а также прикладные значения. В подписанном JWT полезная нагрузка закодирована, но не зашифрована, поэтому получатель токена обычно может её прочитать.

{
  "sub": "1234567890",
  "name": "Ada Lovelace",
  "admin": true
}

Подпись: целостность закодированных заголовка и payload

Для компактного JWS вход подписи — это точный Base64URL-заголовок, точка и точный Base64URL-payload. Полученная подпись или MAC кодируется третьим сегментом. Изменение любого защищённого байта должно приводить к ошибке проверки.

sign(
  base64url(header) + "." + base64url(payload),
  trustedKey
)

Base64URL делает сегменты безопасными для URL, но не шифрует их

Компактная сериализация JWT использует URL-безопасный алфавит Base64 и обычно опускает завершающий padding. Обратное преобразование сегмента в JSON раскрывает содержимое, но ничего не гарантирует об аутентичности, авторизации или конфиденциальности.

Три сегмента обычно означают JWS, пять — JWE

Компактная формаСегментыОсновное свойство
JWS3Целостность за счёт подписи или MAC
JWE5Конфиденциальность за счёт шифрования

Безопасный порядок проверки

  • Декодируйте только те токены, которые вам разрешено исследовать.
  • Считайте декодированные claims недоверенными, пока проверка не завершилась успешно.
  • Никогда не вставляйте рабочие bearer-токены в сторонние сервисы.
  • После проверки подписи проверьте issuer, audience и временные claims.

Проверьте пример

Разделите синтетический JWT на три сегмента

Токен содержит читаемый заголовок HS256, claims в payload и намеренно синтетический сегмент подписи.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSBMb3ZlbGFjZSIsImFkbWluIjp0cnVlLCJpYXQiOjE3MDAwMDAwMDAsIm5iZiI6MTY5OTk5OTkwMCwiZXhwIjoyMTQ3NDgzNjQ3fQ.ZGVtby1zaWduYXR1cmU

Ожидаемый результат: Декодер показывает три сегмента JWS, разбирает header и payload и не утверждает, что подпись проверена.

Изучите три сегмента

Декодируйте синтетический JWT локально

Вставьте компактный токен и изучите его заголовок, payload, исходные сегменты и статус подписи прямо в браузере.

Перейти в JWT Decoder →