Полное руководство по безопасности JWT: Декодирование, верификация и распространённые уязвимости

Утилиты

Что такое JWT?

JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для безопасной передачи информации между сторонами. Это самая популярная схема аутентификации API, широко используемая в OAuth 2.0 и OpenID Connect.

Структура JWT

JWT состоит из трёх частей, разделённых .:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│        Header        │.│         Payload        │.│        Signature        │
Часть Содержание Кодировка
Header Алгоритм + тип Base64URL
Payload Claims Base64URL
Signature Подпись Алгоритм(Header + Payload, Секрет)

⚠️ Header и Payload только закодированы в Base64URL — они не зашифрованы. Любой может их декодировать и прочитать.


Декодирование JWT с ToolsKu

Шаги

  1. Откройте Декодер JWT
  2. Вставьте строку JWT
  3. Просмотрите декодированные Header и Payload JSON
  4. Проверьте срок действия, издателя и другие поля

Распространённые поля Payload

Поле Значение Пример
sub Субъект (ID пользователя) "user_12345"
iss Издатель "https://auth.example.com"
aud Аудитория "api.example.com"
exp Срок действия (Unix секунды) 1717200000
iat Время выдачи 1717196400
nbf Не ранее 1717196400
jti ID JWT (уникальный идентификатор) "a1b2c3d4"

Алгоритмы подписи JWT

Алгоритм Тип Безопасность Сценарий использования
HS256 Симметричный Средняя Один сервис, внутренние API
HS384/HS512 Симметричный Средняя–высокая Повышенные требования к безопасности
RS256 Асимметричный Высокая Многосервисная архитектура, OAuth
ES256 Асимметричный Высокая Мобильные устройства, IoT
none Без подписи ❌ Опасно Никогда не использовать

Симметричный vs Асимметричный

HS256 (симметричный):
  Подпись: HMAC-SHA256(header.payload, shared_secret)
  Проверка: Тот же shared_secret
  Проблема: Все сервисы используют один секрет — утечка влияет на всё

RS256 (асимметричный):
  Подпись: RSA-SHA256(header.payload, private_key)
  Проверка: RSA-SHA256(header.payload, public_key)
  Преимущество: Открытый ключ можно распространять; закрытый ключ остаётся у издателя

Распространённые уязвимости безопасности

1. Атака alg: none

Злоумышленник изменяет alg в Header на none и удаляет подпись:

// Оригинальный Header
{"alg": "HS256", "typ": "JWT"}

// Модификация злоумышленника
{"alg": "none", "typ": "JWT"}

Защита: Сервер должен использовать белый список разрешённых алгоритмов и отклонять none.

2. Атака подмены ключей

Переключить RS256 на HS256 и использовать открытый ключ как HMAC-секрет:

Злоумышленник получает открытый ключ → меняет alg на HS256 → подписывает открытым ключом → сервер проверяет HMAC открытым ключом → проходит

Защита: Строго проверять, что alg в Header соответствует ожидаемому.

3. Утечка конфиденциальных данных

Поскольку Payload закодирован только в Base64, никогда не храните в JWT:

  • ❌ Пароли, номера кредитных карт
  • ❌ Личные конфиденциальные данные
  • ✅ ID пользователя, роли, разрешения

4. Неправильный срок действия

// ❌ Без срока действия — токен действителен вечно
{"sub": "user_123"}

// ❌ Слишком длинный срок — утечка токена остаётся актуальной
{"sub": "user_123", "exp": 1893456000}  // 2030 год

// ✅ Разумный срок + механизм refresh
{"sub": "user_123", "exp": 1717200000}   // 15–60 минут

Лучшие практики JWT

1. Краткосрочный Access Token + Refresh Token

Access Token:  Срок действия 15–60 минут, используется для вызовов API
Refresh Token: Срок действия 7–30 дней, используется для получения новых access tokens

2. Место хранения

Хранилище Риск XSS Риск CSRF Рекомендуется
localStorage Высокий Низкий
sessionStorage Высокий Низкий
HttpOnly Cookie Низкий Высокий ⚠️ Требуется защита CSRF
Переменная в памяти Низкий Низкий ✅ Рекомендуется для SPA

3. Контрольный список верификации

При проверке JWT на сервере всегда проверяйте:

  • Подпись действительна
  • exp не истёк
  • nbf вступил в силу
  • iss является ожидаемым издателем
  • aud включает текущий сервис
  • alg находится в белом списке

Отладка проблем JWT

  1. Декодировать JWT: Используйте Декодер JWT для проверки Header и Payload
  2. Проверить exp: Истёк ли токен?
  3. Проверить alg: Соответствует ли алгоритм подписи ожиданиям?
  4. Проверить iss/aud: Правильные ли издатель и аудитория?
  5. Проверить подпись: Используйте Генератор JWT для повторной подписи тем же секретом и сравнения
  6. Проверить транспорт: Правильный ли заголовок Authorization Bearer <token>?

Связанные инструменты


Заключение

JWT — краеугольный камень современной аутентификации API, но кодировка Base64 (не шифрование) создаёт уникальные проблемы безопасности. Понимание структуры, подписи и распространённых уязвимостей необходимо для full-stack разработчиков. Декодер JWT от ToolsKu помогает быстро отлаживать аутентификацию — но помните: декодирование — это не верификация; всегда проверяйте подписи на сервере в продакшене.

#JWT#认证#安全#OAuth#API