JWT как механизм сессий

JWT часто используют как замену серверным сессиям в браузерных приложениях. Это антипаттерн — JWT проектировался для других задач.

Проблемы JWT как сессий

Избыточный размер

Простой идентификатор пользователя занимает 6 байт в cookie, но ~304 байта в JWT — увеличение в 51 раз. На 100 000 просмотров в месяц это дополнительные ~24 МБ трафика.

База данных всё равно нужна

Главное преимущество JWT — stateless, сервер не хранит сессии. На практике почти каждый запрос требует загрузки пользователя из БД для проверки прав, отображения данных, CRUD-операций. Stateless-преимущество теряется.

Двойная криптография

Если JWT хранится в cookie, то подпись выполняется дважды: сам JWT подписан, и cookie тоже криптографически подписан фреймворком. Двойная работа без дополнительной безопасности.

Невозможность отзыва

JWT валиден до истечения срока. Для отзыва нужен blacklist токенов, что по сути — та же серверная сессия, только сложнее.

Уязвимость к XSS

В localStorage токен доступен любому JavaScript на странице. Одна XSS-уязвимость — и токен украден. Серверные сессии с HttpOnly cookies не подвержены этой атаке.

Когда JWT подходит

  • Межсервисное взаимодействие — service-to-service в микросервисах
  • Мобильные приложения — secure storage на устройстве
  • CLI-клиенты — автоматизация и скрипты
  • Федеративная аутентификация — SSO, OpenID Connect

Альтернативы для браузеров

  • Серверные сессии с Redis/memcached — время ответа менее 5 мс
  • BFF-паттерн — токены на сервере, браузеру только HttpOnly cookie
  • Spring Security Form Login — встроенный механизм с HttpOnly cookies

См. также

  • BFF-паттерн — безопасная аутентификация для браузеров
  • Access и Refresh токены — жизненный цикл JWT-токенов