Как сервер понимает, что сессия открыта
Что проверяют
Понимаете ли вы, что HTTP сам по себе не хранит состояния, и через что сервер узнаёт пользователя в каждом запросе. Для тестировщика это основа проверок авторизации, поэтому следом спрашивают, какие кейсы вы бы на это написали.
Как отвечать
Два основных механизма:
- серверная сессия: после входа сервер создаёт запись в хранилище (память процесса, Redis, база) и отдаёт случайный идентификатор в cookie, например
JSESSIONIDилиPHPSESSID. Браузер сам присылает эту cookie с каждым запросом, сервер ищет запись по ключу и проверяет, что она не истекла. Нашёл, значит сессия открыта; - токен без состояния: сервер выдаёт подписанный JWT, клиент шлёт его в заголовке
Authorization: Bearer ...или в cookie. Сервер ничего не ищет, а проверяет подпись и срокexp. Обратная сторона: такой токен нельзя просто «закрыть» до истечения, нужен короткий срок жизни плюс refresh-токен или чёрный список.
Сроки бывают двух видов: таймаут простоя, который продлевается при активности, и абсолютный предел жизни сессии.
Дальше покажите, как это проверяете вы:
- cookie и флаги: в DevTools на вкладке Application смотрите
HttpOnly,Secure,SameSiteи срок жизни; - подмена: удаляете или меняете идентификатор и ждёте
401или редирект на вход; - выход: после логаута повторяете старый запрос с той же cookie в Postman. Сессия должна быть недействительна на сервере, а не только стёрта в браузере;
- смена идентификатора: сравниваете его до и после логина. Он обязан смениться, иначе возможна фиксация сессии;
- истечение: проверяете таймаут простоя, в том числе при двух открытых вкладках.
Где спотыкаются
Говорят, что сессия хранится в браузере. В браузере лежит только идентификатор или токен, решение принимает сервер.
Проверяют выход только по интерфейсу. Кнопка «Выйти» может очистить cookie на клиенте, а сессия на сервере останется живой, и перехваченный идентификатор продолжит работать.
Путают аутентификацию и авторизацию: открытая сессия говорит, кто вы, но не даёт права на любой ресурс. Отдельно нужны кейсы на доступ к чужим данным под своей сессией.