🎯 Зачем спрашивают
- Проверить, понимаешь ли различия между хранением состояния на сервере и на клиенте.
- Умеешь ли объяснить trade-offs безопасности, масштабирования и UX.
- Проверить практический опыт работы с JWT / сессиями.
📝 Ответ
1. Session-based authentication (stateful)
- Сервер при логине создаёт запись в своей БД/Redis (
sessionId → userId).
- Клиент получает
sessionId(обычно в cookie).
- При каждом запросе браузер автоматически прикрепляет cookie → сервер ищет сессию по
sessionId.
- Вся информация хранится на сервере.
2. Token-based authentication (stateless*, например JWT)
- Сервер при логине создаёт токен (например JWT), подписывает его секретом.
- Токен уже содержит данные, необходимые для идентификации пользователя в дальнейшем (userId, email, role, exp).
- Клиент хранит токен (cookies, localStorage, sessionStorage).
- При каждом запросе токен отправляется (в cookie или в Authorization header).
- Сервер не хранит состояние — на сервере осуществляется лишь проверка валидности токена.
Stateless, но не очень*
Тезис о том, что «JWT = stateless» — миф. В живых системах почти всегда получается гибридная модель: access-JWT проверяется без БД, но refresh и/или «состояние сессии» вы храните на сервере (Redis/БД), иначе невозможно нормально делать:
- logout
- отзыв токена
- «выкинуть со всех устройств»
- детектить кражу токена
⚖️ Компромиссы
ㅤ | Session-based (stateful) | Token-based (stateless) |
Хранение | Сервер хранит сессию в БД/in-memory хранилище | Сервер ничего не хранит, токен у клиента → быстрее происходит процесс проверки |
Масштабирование | Нужно шарить сессии между серверами (Redis, sticky sessions) | Легко масштабировать, серверу токен «самодостаточен» |
Безопасность | Легко отозвать → удалить сессию в БД | JWT сложнее отзывать (нужен blacklist или короткий TTL) |
Размер | Только sessionId | JWT может быть большим (несколько кБ) |
UX | Долгие сессии, можно обновлять expires | Нужен refresh-token flow для обновления |
Управление | Прямой контроль у сервера | Контроль у клиента, сервер только проверяет подпись |
🔎 Встречные вопросы
- Как работает refresh-token flow?
- Как реализовать logout в JWT-схеме?
- Чем опасен слишком длинный TTL для JWT?
- Когда лучше выбрать session-based вместо JWT?
🚩 Красные флаги
- JWT всегда лучше, чем сессии.
- Сессии устарели и нигде не применяются.
- Нет понимания, что JWT сложнее отзывать.
🛠 Практика
TODO