Безопасность и сертификаты
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 могут сочетаться со статусом непроверенной подписи.