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

Decode и Verify JWT: в чём разница?

Декодирование и проверка JWT отвечают на разные вопросы. Декодирование раскрывает структуру токена; проверка устанавливает, соответствует ли защищённое содержимое доверенному криптографическому ключу и политике.

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

Декодирование читает структуру без ключа

Декодер разделяет компактный токен, декодирует читаемые сегменты Base64URL и разбирает JSON. Это удобно для отладки, но злоумышленник способен создать столь же читаемые значения заголовка и payload.

const [header, payload, signature] = token.split(".");

Проверка подтверждает целостность доверенным ключом

Проверка повторно вычисляет или валидирует криптографический результат для защищённых заголовка и payload. Ключ и разрешённые алгоритмы должны приходить из доверенной конфигурации или проверенного набора ключей issuer, а не из произвольных данных токена.

verify(signature, encodedHeader + "." + encodedPayload, trustedKey);

Decode и verify отвечают на разные вопросы

ОперацияНужен ключПодтверждает подлинность
DecodeНетНет
Проверка подписи или MACДаТолько если ключ и политика алгоритмов доверенные

Изменённый токен всё ещё может успешно декодироваться

Изменение payload и его повторное кодирование может дать корректный JSON и правильно оформленный токен из трёх сегментов. Старая подпись должна провалить проверку, поэтому декодированным claim admin или role нельзя доверять самим по себе.

Проверка включает политику алгоритмов и ключей

  • Разрешайте только ожидаемые приложением алгоритмы.
  • Выбирайте ключи из доверенной конфигурации issuer.
  • Отклоняйте незащищённые токены alg=none, если только они явно не требуются специально спроектированной закрытой системой.
  • Обрабатывайте ротацию ключей и значения kid, не принимая расположения ключей, контролируемые злоумышленником.

Действительной подписи необходимо, но недостаточно

После криптографической проверки проверьте iss, aud, exp, nbf и claims, обязательные для текущего endpoint. Правильно подписанный токен для другой аудитории или истёкшей сессии всё равно нужно отклонить.

Безопасная работа с JWT

  • Декодируйте для локального просмотра и отладки.
  • Проверяйте токен поддерживаемой JWT-библиотекой на backend приложения.
  • Зафиксируйте разрешённые алгоритмы и доверенные ключи issuer.
  • Проверяйте audience, issuer и временные claims.
  • Авторизуйте запрошенное действие только по проверенным claims с нужной областью доступа.

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

Декодируйте claims, не считая их проверенными

Корректно сформированный токен может содержать валидный JSON, даже если подпись не проверялась доверенным ключом.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSBMb3ZlbGFjZSIsImFkbWluIjp0cnVlLCJpYXQiOjE3MDAwMDAwMDAsIm5iZiI6MTY5OTk5OTkwMCwiZXhwIjoyMTQ3NDgzNjQ3fQ.ZGVtby1zaWduYXR1cmU

Ожидаемый результат: Header и payload читаются, но статус подписи остаётся непроверенным, поэтому claims нельзя считать доверенными.

Увидьте границу

Декодируйте токен без заявления о проверке

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

Перейти в JWT Decoder →