Интернет и кодирование · 6 минута чтения
JWT декодер: что внутри токена, а что нет
Веб-токен JSON представляет собой три сегмента base64url, разделенные точками, а декодер JWT просто меняет кодировку на обратную, чтобы вы могли их прочитать. Последнее предложение содержит самый важный факт безопасности в этой статье: декодирование токена ничего о нем не доказывает. Любой может создать полезную нагрузку, закодировать ее и передать вам правильно сформированный токен — проверка — это отдельная операция, для которой требуется ключ подписи.
Обновлено
Три части
- Заголовок — алгоритм подписи (`alg`) и тип токена (`typ`), например HS256.
- Полезная нагрузка — утверждения: кому принадлежит токен, когда он был выпущен и когда истекает срок его действия.
- Подпись — вычисляется по первым двум сегментам с использованием ключа эмитента, поэтому декодер показывает ее, но не может проверить.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 . eyJzdWIiOiIxMjMiLCJleHAiOjE3NjAwMDAwMDB9 . signature
header payload signature
Утверждения, которые объясняют большинство неудач
- `exp` (срок действия) — самая распространенная причина ошибки 401. Токен, срок действия которого истек две минуты назад, отклоняется до того, как будет проверено что-либо еще.
- `nbf` (не раньше) — зеркальное отображение: токен, использованный до того, как его срок действия будет отклонен.
- `iat` (выпущено в) — полезно для определения возраста сеанса и для выявления несогласованных часов.
- `aud` (аудитория) и `iss` (эмитент) — несоответствия здесь означают, что токен действителен, но был выпущен для другой службы, что приводит к сбоям.
Утверждения времени представляют собой секунды UTC с эпохи Unix. Если токен выглядит действительным, но срок его действия истекает слишком рано или слишком поздно, проверьте, нет ли проблем с часами или полезной нагрузки, несущей миллисекунды вместо ожидаемых секунд.
Почему никогда не следует слепо доверять `alg`
Две атаки достаточно стары, чтобы стать известными, и до сих пор появляются в дикой природе. Алгоритм `none` сообщает проверяющему устройству, что подписи вообще нет; сервер, который читает заголовок вместо применения собственного ожидаемого алгоритма, принимает его. А в путанице RSA/HS злоумышленник подписывает открытый ключ как секрет HMAC, обманывая сервер, который принимает оба семейства. Защита в обоих случаях заключается в верификаторе, а не в декодере: закрепите ожидаемый алгоритм на стороне сервера и никогда не извлекайте его из самого токена.
Декодируйте локально, всегда
JWT — это учетные данные: тот, кто владеет ими, может действовать как пользователь до истечения срока их действия. Вставка реального файла на веб-сайт, который отправляет его на сервер, приводит к передаче живого сеанса с нулевой выгодой, поскольку декодирование — это арифметика base64url, которую любой браузер может выполнить за микросекунды. Декодер YamlBox JWT анализирует токен на странице, отображает утверждения временных меток как читаемые даты в формате UTC и продолжает работать с отключенной сетью — единственный тип декодера, который стоит использовать для рабочего токена.
Процедура отладки, которая работает
- Сначала декодируйте и прочитайте `exp` — половина всех отчетов о «недействительных токенах» заканчивается здесь.
- Проверьте `aud` и `iss` на соответствие ожиданиям API, затем `nbf` на предмет отклонения часов.
- Сравните декодированные утверждения с тем, что ваш код предполагает в отношении ролей или областей.
- Если утверждения кажутся верными, но все равно не удается, проблема в проверке — неправильный ключ, измененный секретный ключ или несоответствие алгоритма.
JWT Декодер — часто задаваемые вопросы
Подтверждает ли это декодирование JWT?
Нет. Декодирование меняет кодировку base64url и не требует ключа, поэтому не может доказать подлинность. Проверка пересчитывает подпись с использованием секретного или открытого ключа эмитента и представляет собой отдельный шаг, который может выполнить только сервер.
Почему срок действия моего JWT уже истек?
Сравните утверждение `exp` с текущим временем UTC. Токены обычно недолговечны — от нескольких минут до часа — и обычно виноват клиент, который кэширует их через окно обновления. Сравните `iat` с `exp`, чтобы узнать срок действия, предусмотренный эмитентом.
Безопасно ли вставлять произведение JWT в онлайн-декодер?
Только в тот, который полностью декодируется в вашем браузере. Серверный декодер получает действующие учетные данные и может их зарегистрировать. Предпочитайте декодер на стороне клиента и рассматривайте любой токен, который вы вставили на неизвестный сайт, как скомпрометированный.
Инструменты, упомянутые в этом посте
Еще статьи для чтения
5 минута чтения
Base64 декодировать и кодировать: для транспорта, а не для
Base64 декодировать и кодировать в браузере — правило размера 4/3, отступы, вариант base64url и ошибка Unicode, из-за которой декодированный текст выглядит как мусор.
5 минута чтения
Кодировка URL: когда бежать, а когда что-то ломаешь
URL правильно кодировать и декодировать — зарезервированные символы плюс %20, encodeURI и encodeURIComponent, а также ошибки двойного кодирования в неработающих ссылках.
5 минута чтения
Конвертер временных меток: время эпохи без догадок
Преобразователь временных меток Unix, который работает в обоих направлениях: секунды и миллисекунды, UTC и местное время, а также граница 2038 года, которая все еще нарушает работу долгоживущих систем.