Session vs Token

Два подхода к auth: stateful сессии в БД или stateless JWT-токены. Каждый со своими trade-offs. Modern-выбор — часто гибрид.

Сессии (stateful)

Клиент → сервер:  логин
Сервер:           создаёт session_id, хранит в БД/Redis
Сервер → клиент:  Set-Cookie: session_id=abc; HttpOnly; Secure
Клиент → сервер:  запросы с кукой
Сервер:           lookup session_id в БД → user

JWT-токены (stateless)

Клиент → сервер:  логин
Сервер:           подписывает JWT { sub, exp }
Сервер → клиент:  токен
Клиент → сервер:  Authorization: Bearer <JWT>
Сервер:           проверяет подпись, читает claims — БД не нужна

Сравнение

СессияJWT
Хранение серверомнужен Redis/БДне нужно
Мгновенный logoutудалил из БДтребует revocation list
Смена правменяешь в БДдо истечения токена — старые права
Многосерверный setupнужен shared storageкаждый сервис проверяет сам
Размер запроса32 байта cookie500-2000 байт header
CSRFуязвим без SameSiteBearer не автосабмитится
XSS-кражаHttpOnly защищаетзависит от хранения
Дебагвидишь всё в БДнужно декодить

Гибрид (best practice)

Мнение Стюарта Кросса

Stop using JWT for sessions.Sven Slootweg, 2016

Аргумент: JWT добавляет сложность, не даёт мгновенный logout, размером больше. Для одного монолита — сессия проще и безопаснее.

Когда JWT реально нужен

См. также