YamlBox

Интернет и кодирование · 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 и продолжает работать с отключенной сетью — единственный тип декодера, который стоит использовать для рабочего токена.

Процедура отладки, которая работает

  1. Сначала декодируйте и прочитайте `exp` — половина всех отчетов о «недействительных токенах» заканчивается здесь.
  2. Проверьте `aud` и `iss` на соответствие ожиданиям API, затем `nbf` на предмет отклонения часов.
  3. Сравните декодированные утверждения с тем, что ваш код предполагает в отношении ролей или областей.
  4. Если утверждения кажутся верными, но все равно не удается, проблема в проверке — неправильный ключ, измененный секретный ключ или несоответствие алгоритма.

JWT Декодер — часто задаваемые вопросы

Подтверждает ли это декодирование JWT?

Нет. Декодирование меняет кодировку base64url и не требует ключа, поэтому не может доказать подлинность. Проверка пересчитывает подпись с использованием секретного или открытого ключа эмитента и представляет собой отдельный шаг, который может выполнить только сервер.

Почему срок действия моего JWT уже истек?

Сравните утверждение `exp` с текущим временем UTC. Токены обычно недолговечны — от нескольких минут до часа — и обычно виноват клиент, который кэширует их через окно обновления. Сравните `iat` с `exp`, чтобы узнать срок действия, предусмотренный эмитентом.

Безопасно ли вставлять произведение JWT в онлайн-декодер?

Только в тот, который полностью декодируется в вашем браузере. Серверный декодер получает действующие учетные данные и может их зарегистрировать. Предпочитайте декодер на стороне клиента и рассматривайте любой токен, который вы вставили на неизвестный сайт, как скомпрометированный.

Инструменты, упомянутые в этом посте

Просмотрите полный список инструментов 19

Еще статьи для чтения

5 минута чтения

Конвертер временных меток: время эпохи без догадок

Преобразователь временных меток Unix, который работает в обоих направлениях: секунды и миллисекунды, UTC и местное время, а также граница 2038 года, которая все еще нарушает работу долгоживущих систем.

Все 19 публикации →