ttools
jwtтокеныapiотладкабезопасность

Как декодировать JWT-токен и проверить его содержимое

Узнайте, как быстро расшифровать JWT-токен, посмотреть payload и header без написания кода. Полезный гайд для отладки API.

JWT-токены встречаются почти в каждом современном API. Когда работаешь с чужой документацией или дебажишь авторизацию, часто нужно быстро заглянуть внутрь токена — проверить, какой user_id там лежит, не истёк ли срок действия, какие роли прописаны. Разбираемся, как это сделать без написания кода и что вообще хранится в JWT.

Что такое JWT и как он устроен

JSON Web Token — это строка из трёх частей, разделённых точками: header.payload.signature. Например:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjM0NSwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoxNzE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Первые две части — это Base64Url-закодированный JSON. Третья часть — криптографическая подпись, которая гарантирует, что токен не был изменён. Расшифровать header и payload может любой (это не шифрование, а просто кодирование), а вот проверить подпись можно только зная секретный ключ или публичный ключ сервера.

Header содержит метаданные: алгоритм подписи и тип токена. Обычно выглядит так:

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload — это данные, которые сервер хочет передать клиенту. Там могут быть:

  • sub — идентификатор пользователя
  • exp — timestamp истечения токена
  • iat — время создания
  • roles, permissions — права доступа
  • Любые кастомные поля вашего приложения

Когда нужно декодировать JWT

Типичные ситуации из практики:

  • Отладка API. Бэкенд вернул 403, и непонятно, почему. Смотришь в токен — там роль user, а нужна admin.
  • Проверка сроков действия. Токен вроде бы свежий, но запросы падают. Декодируешь — exp уже истёк час назад.
  • Разработка фронтенда. Нужно показать имя пользователя или его email, не делая лишний запрос к API — эти данные уже в токене.
  • Интеграция со сторонними сервисами. Получил токен от OAuth-провайдера, хочешь посмотреть, какие scope там прописаны.

Важно: декодирование токена НЕ проверяет подпись. Это просто чтение данных. Для валидации токена нужен секретный ключ на сервере.

Как декодировать JWT вручную

Технически можно обойтись командной строкой. Каждая часть токена — это Base64Url-строка. Чтобы декодировать payload:

echo "eyJ1c2VyX2lkIjoxMjM0NSwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoxNzE2MjM5MDIyfQ" | base64 -d

Но это неудобно:

  • Base64Url отличается от обычного Base64 (используются - и _ вместо + и /)
  • Нужно подставлять padding-символы =
  • Читать JSON в терминале не очень комфортно

Поэтому проще использовать онлайн-инструменты или библиотеки.

Онлайн-инструменты для декодирования

Самый быстрый способ — вставить токен в веб-форму и сразу увидеть содержимое. Преимущества:

  • Не нужно устанавливать библиотеки или зависимости
  • Видишь все три части токена с подсветкой синтаксиса
  • Можно проверить структуру за секунды

Важный момент безопасности: не вставляй production-токены в публичные сервисы. Даже если сайт заявляет, что обрабатывает данные локально, лучше перестраховаться. Для рабочих токенов используй локальные инструменты или скрипты.

Что смотреть в декодированном токене:

  • Поле exp. Это Unix timestamp. Если текущее время больше этого значения — токен истёк. Например, "exp": 1716239022 соответствует примерно 20 мая 2024 года.
  • Алгоритм в header. Если видишь "alg": "none" — это огромная дыра в безопасности. Токен можно подделать без ключа.
  • Кастомные поля. userId, email, roles — всё, что разработчик решил туда положить.

Декодирование в коде

Если нужно автоматизировать проверку или интегрировать в приложение, используй библиотеки. Важно: для просмотра содержимого НЕ нужна валидация подписи.

JavaScript:

function parseJwt(token) {
  const base64Url = token.split('.')[1];
  const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
  const jsonPayload = decodeURIComponent(
    atob(base64).split('').map(c => 
      '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
    ).join('')
  );
  return JSON.parse(jsonPayload);
}

const token = 'eyJhbGci...';
const payload = parseJwt(token);
console.log(payload.user_id);

Python:

import base64
import json

def decode_jwt(token):
    parts = token.split('.')
    payload = parts[1]
    # Добавляем padding
    payload += '=' * (-len(payload) % 4)
    decoded = base64.urlsafe_b64decode(payload)
    return json.loads(decoded)

token = "eyJhbGci..."
data = decode_jwt(token)
print(data['user_id'])

Для production-кода лучше использовать готовые библиотеки типа jsonwebtoken (Node.js), PyJWT (Python) или аналоги для других языков. Они умеют валидировать подпись и проверять exp автоматически.

Типичные ошибки и как их избежать

Хранение секретов в payload. JWT декодируется без ключа, поэтому никогда не клади туда пароли, приватные ключи API или номера карт. Только публичные данные или идентификаторы.

Доверие к содержимому без проверки подписи. На фронтенде можно читать токен для UI, но все критичные решения (доступ к ресурсам, права) должны приниматься на бэкенде после валидации подписи.

Игнорирование exp. Если не проверять срок действия, атакующий сможет использовать украденный токен бесконечно. Всегда валидируй exp и делай токены короткоживущими (15-60 минут для access token).

Использование alg: none. Это небезопасная опция, которая отключает проверку подписи. Если видишь её в header — это проблема с реализацией аутентификации на сервере.

Дополнительные инструменты для работы с данными

Помимо декодирования JWT, в повседневной разработке часто нужны смежные операции. Для работы с URL-параметрами пригодится URL Parser — он разбирает query string на отдельные параметры, что удобно при отладке redirect-потоков OAuth. Если нужно быстро отформатировать JSON из payload токена для документации, поможет JSON Formatter. А для проверки Base64-данных (например, если в токене хранятся закодированные изображения или файлы) есть Base64 Encoder/Decoder.

Декодирование JWT — базовый навык при работе с API. Онлайн-инструменты хороши для быстрой отладки, а встроенные функции в коде — для автоматизации. Главное помнить: чтение токена не делает его безопасным, и проверка подписи всегда должна быть на стороне сервера.

Инструменты по теме