JWT-токены: структура, безопасность, лучшие практики
JSON Web Tokens встречаются практически в каждой современной системе аутентификации. Та длинная строка в вашем заголовке Authorization — eyJhbGciOiJIUzI1NiIs... — это JWT, и понимание того, что внутри него и как он работает, необходимо для создания безопасных приложений.
Что такое JWT?
JWT — это компактный, безопасный для URL формат токена, который передаёт утверждения (данные) между двумя сторонами. Он самодостаточен — сам токен содержит информацию, необходимую для проверки его подлинности и извлечения пользовательских данных, без обращения к базе данных.
Декодируйте любой JWT мгновенно с помощью нашего JWT Encoder/Decoder. Вставьте токен и увидите разбор его заголовка, полезной нагрузки и подписи.
Структура JWT: три части
Каждый JWT состоит из трёх частей, закодированных в Base64URL и разделённых точками:
header.payload.signature
Заголовок (Header)
{
"alg": "HS256",
"typ": "JWT"
}
Указывает алгоритм подписи и тип токена.
Полезная нагрузка (Payload)
{
"sub": "user123",
"name": "Alex Chen",
"role": "admin",
"iat": 1708963200,
"exp": 1709049600
}
Содержит утверждения — фактические данные. Стандартные утверждения включают sub (субъект), iat (время выпуска) и exp (срок действия).
Подпись (Signature)
Создаётся путём подписания закодированных заголовка и полезной нагрузки секретным ключом. Это предотвращает подделку — любое изменение делает подпись недействительной.
Как работает аутентификация с JWT
- Пользователь входит с учётными данными
- Сервер создаёт JWT с утверждениями о пользователе и подписывает его
- Сервер возвращает JWT клиенту
- Клиент отправляет JWT в заголовке Authorization при последующих запросах
- Сервер проверяет подпись и извлекает утверждения — запрос к базе данных не нужен
Лучшие практики безопасности
Всегда проверяйте подпись
Никогда не доверяйте JWT без проверки его подписи. Декодируйте полезную нагрузку с помощью нашего JWT Decoder, чтобы исследовать токены во время разработки, но всегда выполняйте криптографическую проверку в продакшене.
Используйте короткое время жизни
JWT нельзя отозвать после выпуска (в отличие от сессионных токенов). Устанавливайте короткое время жизни (15–60 минут) и используйте refresh-токены для более длительных сессий.
Выбирайте правильный алгоритм
- HS256 — HMAC с SHA-256, симметричный ключ. Простой, быстрый, подходит для приложений с одним сервером
- RS256 — RSA с SHA-256, асимметричные ключи. Лучше для распределённых систем, где несколько сервисов проверяют токены
- Никогда не используйте "none" — Уязвимость
alg: "none"приводила к реальным взломам
Защищайте секретный ключ
Ваш ключ подписи JWT — это мастер-ключ к вашей системе аутентификации. Храните его надёжно, периодически ротируйте и никогда не раскрывайте в клиентском коде.
Не храните конфиденциальные данные в полезной нагрузке
Полезная нагрузка JWT закодирована в Base64, а не зашифрована. Любой может её декодировать. Никогда не включайте пароли, номера кредитных карт или секреты.
Распространённые ошибки при работе с JWT
- Отсутствие проверки срока действия — Всегда проверяйте утверждение
exp - Хранение JWT в localStorage — Уязвимо для XSS-атак. Используйте httpOnly-куки вместо этого
- Слишком большие токены — JWT передаётся в каждом заголовке запроса. Держите полезную нагрузку лёгкой
- Неиспользование HTTPS — JWT, отправленные по HTTP, могут быть перехвачены
Часто задаваемые вопросы
Можно ли отозвать JWT?
Не напрямую — JWT не имеют состояния. Обходные решения включают короткое время жизни, чёрные списки токенов или смену ключа подписи (что аннулирует все токены).
Стоит ли использовать JWT для сессий?
JWT хорошо работают для аутентификации API и микросервисов. Для традиционных веб-сессий серверные сессии с куки часто проще и безопаснее.
Чем JWT отличается от OAuth?
OAuth — это фреймворк авторизации. JWT — это формат токена. OAuth может использовать JWT в качестве токенов доступа, но они решают разные задачи.
Связанные ресурсы
- Объяснение кодировки Base64 — разберитесь в кодировке, используемой JWT
- Безопасность JWT — более глубокий разбор уязвимостей
- JWT Encoder/Decoder — декодируйте и создавайте JWT мгновенно
- Генератор хешей — изучите алгоритмы, лежащие в основе подписей JWT