JWT давно стал стандартом для авторизации в веб‑сервисах, мобильных приложениях и API. Но сам по себе JWT не делает систему безопасной. Ошибки обычно возникают не в формате токена, а в том, как его выдают, хранят и проверяют.
Что такое JWT
JWT — это компактный токен, который содержит данные в виде подписанного JSON. Обычно состоит из 3 частей:
- Header — тип токена и алгоритм
- Payload — claims: user id, роли, срок жизни
- Signature — подпись, подтверждающая целостность
Важно: JWT не шифрует данные по умолчанию. Всё содержимое payload легко декодировать. Поэтому пароли, секреты, персональные данные и внутренние служебные поля внутрь токена помещать нельзя.
Как использовать JWT безопасно
- Подписывайте токен надёжным алгоритмом — Предпочтительно RS256 или ES256 для production‑сценариев. Если используется HS256 — храните секрет отдельно, длинным и случайным.
- Проверяйте подпись и алгоритм на сервере — Нельзя доверять токену только потому, что он “похож на JWT”. Сервер обязан валидировать signature, `alg`, `iss`, `aud`, `exp`.
- Делайте короткий срок жизни — Access token лучше ограничивать 5–15 минутами. Чем дольше живёт токен, тем выше риск при утечке. ⏱️
- Используйте refresh token отдельно — Refresh token должен быть длиннее по сроку, храниться безопаснее и иметь механизм отзыва.
- Не храните JWT в localStorage для чувствительных систем — При XSS токен легко украсть. Более безопасный вариант — `HttpOnly`, `Secure`, `SameSite` cookies. 🍪
- Всегда работайте только по HTTPS — Иначе токен можно перехватить в сети. Это базовое требование, а не рекомендация.
- Минимизируйте payload — JWT должен содержать только то, что реально нужно для авторизации. Чем меньше данных — тем меньше рисков и размер запроса. 📦
- Реализуйте отзыв токенов — JWT часто называют stateless, но на практике нужны blacklist, versioning или ротация refresh token, чтобы завершать сессии и блокировать компрометацию.
Типовые ошибки
- ❌ Хранение персональных данных в payload
- ❌ Бесконечный срок действия токена
- ❌ Отсутствие проверки `aud` и `iss`
- ❌ Использование одного секрета годами без ротации
- ❌ Передача JWT через URL
- ❌ Отсутствие защиты от XSS и CSRF
Когда JWT подходит хорошо
- SPA и мобильные приложения
- Микросервисные API
- SSO и federated auth
- Интеграции между сервисами
Когда стоит подумать дважды
Если нужна мгновенная инвалидизация сессии, жёсткий контроль устройств и простая серверная модель, иногда классическая session-based авторизация оказывается безопаснее и удобнее. 🛡️
Итог
JWT — это удобный инструмент, но не серебряная пуля. Безопасность здесь строится на коротком TTL, правильном хранении, строгой валидации и защите клиентской части. Хорошая реализация JWT — это не “выдали токен и забыли”, а полноценная стратегия управления доступом.
👀 В конце дня стоит заглянуть в подборку каналов про IT — там часто публикуют практику по backend, security и архитектуре.