Что такое сессионный токен
Что проверяют
Умеете ли вы проверять аутентификацию не по признаку «вход прошёл», а по жизненному циклу токена: как он выдаётся, где хранится, когда и чем перестаёт действовать. Это типовая зона, где функциональные тесты зелёные, а дыра есть.
Как отвечать
Токен это строка, по которой сервер узнаёт уже аутентифицированного пользователя между запросами, потому что HTTP состояния не помнит. Видов два. Непрозрачный идентификатор, за которым на сервере лежит запись о сессии: его можно отозвать мгновенно. Самодостаточный подписанный токен вроде JWT: сервер его не хранит и потому не может отозвать до истечения срока, отсюда короткая жизнь и отдельный токен обновления.
Хранение задаёт набор рисков. Cookie с флагами HttpOnly, Secure и SameSite недоступна скриптам, но уходит автоматически, поэтому нужна защита от подделки межсайтовых запросов. Заголовок Authorization требует держать токен в памяти или в хранилище браузера, откуда его достанет межсайтовый скриптинг.
Чек-лист проверок: токен меняется после входа, иначе возможна фиксация сессии; истекает и по простою, и по абсолютному сроку; выход убивает его на сервере, а не только в браузере; смена пароля рвёт остальные сессии; токен не попадает в адресную строку, логи и аналитику; чужой или подпорченный токен даёт отказ авторизации, а не ошибку сервера.
Где спотыкаются
Проверяют выход только через интерфейс. Кнопка очищает cookie на клиенте, запись о сессии на сервере остаётся живой, и сохранённый заранее токен продолжает работать в обычном клиенте командной строки.
Считают, что флаг HttpOnly закрывает вопрос с межсайтовым скриптингом. Он мешает украсть значение, но не мешает отправить запрос от имени жертвы из её же браузера, а это и есть основной сценарий эксплуатации.
Смотрят на срок годности, показанный интерфейсом. Проверять нужно серверный отказ по истёкшему токену: часто срок обрабатывается только на клиенте, и старое значение принимается ещё долго после формального истечения.