Как устроена сессия с точки зрения данных
Что проверяют
Понимаете ли вы, где физически лежат данные сессии и что именно ходит между браузером и сервером. Для тестировщика это основа проверок авторизации и безопасности. Следом обычно спрашивают: «Как вы проверите, что выход из системы действительно закрывает сессию?»
Как отвечать
Начните с того, что HTTP не хранит состояние, и сессия связывает отдельные запросы в один сеанс. Дальше разведите две схемы:
- серверная сессия: браузер хранит только идентификатор в cookie, а данные (кто вошёл, роли, корзина) лежат на сервере: в памяти процесса, в Redis или в таблице базы. По идентификатору сервер находит запись;
- клиентская сессия: данные лежат у клиента в подписанном токене, обычно JWT. Сервер проверяет подпись и срок
exp, в хранилище не ходит. Минус: такой токен трудно отозвать до истечения срока.
Потом атрибуты cookie, которые вы смотрите в DevTools на вкладке Application: HttpOnly (скрипт не прочитает идентификатор), Secure (только по HTTPS), SameSite (защита от CSRF), Expires или Max-Age. Cookie без срока живёт до закрытия браузера, но браузер с восстановлением вкладок может её сохранить.
И жизненный цикл: создание при входе, продление при активности, тайм-аут бездействия и абсолютный срок жизни, уничтожение при выходе. Хороший ответ заканчивается списком проверок: после входа идентификатор меняется, после выхода старый идентификатор отклоняется сервером, смена пароля завершает другие сессии, две вкладки не ломают друг другу состояние.
Где спотыкаются
Считают, что выход это удаление cookie в браузере. Если сервер не удалил запись, сохранённый идентификатор продолжит работать, и это готовый баг-репорт.
Путают фиксацию сессии с предсказуемыми идентификаторами. Фиксация означает, что злоумышленник подсовывает жертве известный ему идентификатор до входа. Защита: выдавать новый идентификатор сразу после аутентификации.
Думают, что JWT зашифрован. Он только подписан: содержимое читается любым base64-декодером, поэтому персональным данным и паролям в нём не место, и это стоит проверить.