Полное руководство по безопасности 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
Шаги
- Откройте Декодер JWT
- Вставьте строку JWT
- Просмотрите декодированные Header и Payload JSON
- Проверьте срок действия, издателя и другие поля
Распространённые поля 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
- Декодировать JWT: Используйте Декодер JWT для проверки Header и Payload
- Проверить exp: Истёк ли токен?
- Проверить alg: Соответствует ли алгоритм подписи ожиданиям?
- Проверить iss/aud: Правильные ли издатель и аудитория?
- Проверить подпись: Используйте Генератор JWT для повторной подписи тем же секретом и сравнения
- Проверить транспорт: Правильный ли заголовок Authorization
Bearer <token>?
Связанные инструменты
- Декодер JWT — Разбор Header и Payload
- Генератор JWT — Создание пользовательских JWT для тестирования
- Калькулятор HMAC — Понимание HMAC-подписи
- Кодирование/Декодирование Base64 — Кодировка, используемая в JWT
Заключение
JWT — краеугольный камень современной аутентификации API, но кодировка Base64 (не шифрование) создаёт уникальные проблемы безопасности. Понимание структуры, подписи и распространённых уязвимостей необходимо для full-stack разработчиков. Декодер JWT от ToolsKu помогает быстро отлаживать аутентификацию — но помните: декодирование — это не верификация; всегда проверяйте подписи на сервере в продакшене.