Безопасность и сертификаты
Структура JWT: заголовок, полезная нагрузка и подпись
Подписанный JWT обычно использует компактную форму JWS: три сегмента в кодировке Base64URL, разделённые точками. У каждого сегмента своя задача.
Опубликовано
Компактный подписанный JWT состоит из трёх сегментов, разделённых точками
Распространённая подписанная форма — JWS Compact Serialization. Она содержит защищённый заголовок, полезную нагрузку и подпись. Компактный зашифрованный JWE содержит пять сегментов, поэтому их количество даёт контекст, но не доказывает валидность токена.
base64url(header).base64url(payload).base64url(signature)Заголовок: алгоритм и метаданные токена
JOSE-заголовок — это JSON-объект. alg обозначает заявленный алгоритм подписи или MAC, а typ обычно равен JWT. Проверяющая сторона должна применять собственную политику алгоритмов, а не позволять заголовку выбрать любой алгоритм.
{
"alg": "HS256",
"typ": "JWT"
}Полезная нагрузка: зарегистрированные и прикладные 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
| Компактная форма | Сегменты | Основное свойство |
|---|---|---|
| JWS | 3 | Целостность за счёт подписи или MAC |
| JWE | 5 | Конфиденциальность за счёт шифрования |
Безопасный порядок проверки
- Декодируйте только те токены, которые вам разрешено исследовать.
- Считайте декодированные claims недоверенными, пока проверка не завершилась успешно.
- Никогда не вставляйте рабочие bearer-токены в сторонние сервисы.
- После проверки подписи проверьте issuer, audience и временные claims.
Проверьте пример
Разделите синтетический JWT на три сегмента
Токен содержит читаемый заголовок HS256, claims в payload и намеренно синтетический сегмент подписи.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSBMb3ZlbGFjZSIsImFkbWluIjp0cnVlLCJpYXQiOjE3MDAwMDAwMDAsIm5iZiI6MTY5OTk5OTkwMCwiZXhwIjoyMTQ3NDgzNjQ3fQ.ZGVtby1zaWduYXR1cmUОжидаемый результат: Декодер показывает три сегмента JWS, разбирает header и payload и не утверждает, что подпись проверена.
Изучите три сегмента
Декодируйте синтетический JWT локально
Вставьте компактный токен и изучите его заголовок, payload, исходные сегменты и статус подписи прямо в браузере.