В этой статье
Что такое JWT?
JWT (JSON Web Token) — компактный, безопасный для URL формат токена, используемый для безопасной передачи информации между сторонами в виде JSON-объекта. Определённый RFC 7519, JWT является де-факто стандартом аутентификации и авторизации в современных веб-приложениях и API.
JWT самодостаточны — они содержат всю информацию, необходимую для проверки подлинности токена и извлечения пользовательских данных без обращения к базе данных. Это делает их идеальными для аутентификации без сохранения состояния в распределённых системах и архитектурах микросервисов.
Структура JWT
JWT состоит из трёх частей в кодировке Base64URL, разделённых точками: заголовок.данные.подпись.
- Заголовок — JSON-объект, указывающий тип токена (JWT) и алгоритм подписи (например, HS256, RS256, ES256)
- Данные — JSON-объект, содержащий утверждения: зарегистрированные утверждения (iss, sub, exp, iat), публичные и приватные утверждения
- Подпись — создаётся путём подписания закодированного заголовка и данных секретным ключом (HMAC) или приватным ключом (RSA/ECDSA)
Попробуйте бесплатно — без регистрации
Проверить JWT →Как работает проверка JWT
Валидация JWT включает структурные проверки, верификацию подписи и валидацию утверждений.
- Проверка структуры — токен должен содержать ровно три сегмента в кодировке Base64URL, разделённых двумя точками
- Валидация заголовка — заголовок должен содержать действительные поля typ и alg. Алгоритм должен соответствовать тому, что ожидает сервер
- Верификация подписи — подпись пересчитывается с использованием заголовка, данных и ключа подписи. Если пересчитанная подпись совпадает, токен не был изменён
- Валидация утверждений — утверждения exp (истечение срока), nbf (не ранее) и iss (эмитент) проверяются относительно текущего времени и ожидаемых значений
Распространённые случаи использования
JWT обеспечивают аутентификацию и авторизацию во всём современном стеке веб-технологий.
- Аутентификация API — клиенты включают JWT в заголовки Authorization (схема Bearer) для аутентификации API-запросов без сессий
- Единый вход (SSO) — провайдеры идентификации выдают JWT, принимаемые несколькими приложениями, обеспечивая бесшовную аутентификацию между приложениями
- Токены доступа OAuth 2.0 — многие реализации OAuth используют JWT в качестве токенов доступа, кодируя области действия и разрешения прямо в токене
- Взаимодействие микросервисов — сервисы передают JWT для распространения пользовательского контекста и решений авторизации через границы сервисов
Лучшие практики безопасности JWT
JWT мощны, но требуют осторожного обращения, чтобы избежать распространённых проблем безопасности.
- Всегда проверяйте алгоритм — никогда не позволяйте полю alg из токена диктовать, какой алгоритм использует ваш сервер. Это предотвращает атаку с алгоритмом none
- Устанавливайте короткие сроки истечения — JWT нельзя отозвать после выдачи. Держите времена exp короткими (15 минут для токенов доступа) и используйте refresh-токены для долгоживущих сессий
- Используйте асимметричные алгоритмы для распределённых систем — RS256 или ES256 позволяют сервисам проверять токены без обмена секретом подписи
- Никогда не храните чувствительные данные в полезной нагрузке — JWT кодируются, но не шифруются. Любой может декодировать данные. Храните секреты в базе данных, а не в токене
Часто задаваемые вопросы
Можно ли декодировать JWT без секретного ключа?
Да. Полезные нагрузки JWT закодированы в Base64URL, а не зашифрованы. Любой может декодировать и прочитать заголовок и данные. Секретный ключ нужен только для проверки подписи — для подтверждения того, что токен не был изменён.
В чём разница между JWS и JWE?
JWS (JSON Web Signature) — это то, что большинство людей подразумевают под JWT — подписанный токен. JWE (JSON Web Encryption) — зашифрованный токен, полезная нагрузка которого не может быть прочитана без ключа расшифровки. Большинство JWT — это токены JWS.
Хранить ли JWT в localStorage или cookies?
Cookies HttpOnly более безопасны, так как недоступны через JavaScript (предотвращая XSS-кражу). localStorage уязвим к XSS-атакам. Для чувствительных приложений используйте cookies HttpOnly Secure SameSite.