Разница между session-based и token-based аутентификацией?

🎯 Зачем спрашивают
  • Проверить, понимаешь ли различия между хранением состояния на сервере и на клиенте.
  • Умеешь ли объяснить 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
 
📚 Источники / ссылки