Что такое сессия в контексте веб-приложений?

Ответ

Сессия — это механизм для сохранения состояния пользователя между несколькими HTTP-запросами. Поскольку HTTP — протокол без состояния, сессии позволяют "помнить" пользователя (например, факт его аутентификации, содержимое корзины покупок) на протяжении его взаимодействия с сайтом.

Как это работает с точки зрения тестирования:

  1. При первом запросе сервер создает уникальный идентификатор сессии (Session ID).
  2. Этот идентификатор отправляется клиенту (обычно в cookie с именем, например, JSESSIONID).
  3. Клиент автоматически отправляет этот cookie с каждым последующим запросом.
  4. Сервер по полученному ID находит соответствующие данные сессии, хранящиеся на сервере (в памяти, базе данных, Redis).

На что обращать внимание при тестировании:

  • Управление жизненным циклом: Проверка создания, обновления и корректного завершения (logout, timeout) сессии.
  • Безопасность:
    • Защита от перехвата Session ID (использование HTTPS).
    • Защита от фиксации сессии (Session Fixation).
    • Адекватная политика времени жизни сессии.
  • Хранение данных: Проверка, что данные, сохраненные в сессии (атрибуты), корректно доступны в рамках одного пользовательского потока и изолированы от сессий других пользователей.
  • Работа с cookie: Проверка флагов HttpOnly, Secure, SameSite у session cookie.

Пример теста (концептуальный): При тестировании функционала корзины нужно убедиться, что после добавления товара и перехода на другую страницу, товар остается в корзине, так как информация о ней привязана к сессии пользователя.

Ответ 18+ 🔞

А, сессии, ёпта! Ну это ж классика, хуй с горы! Представь себе: заходишь ты в магазин, взял корзину, накидал туда пива и чипсов. А потом пошёл за сигаретами в другой отдел. Так вот, сессия — это та самая твоя корзина, которую тебе не надо таскать за собой физически, она как бы виртуально привязана к тебе.

Как эта магия, блядь, работает?

  1. Ты первый раз заходишь на сайт — сервер тебе в ответ, типа: «О, новый клиент! Держи, братан, свою личную номерную блядь-табличку (Session ID)».
  2. Эта табличка тебе впаивается прямо в браузер, в такую штуку — куку (cookie). Называться она может, например, JSESSIONID. Это как бейджик на конференции.
  3. Дальше, куда бы ты на этом сайте ни пошёл, браузер автоматом тычет этот свой бейджик в лицо серверу при каждом запросе. «Смотри, я это я, вот мой ID!»
  4. Сервер, получив ID, идёт в своё хранилище (память, базу, Redis — неважно), находит там твою личную папку с данными и говорит: «Ага, так это же Вася Пупкин! У него в корзине два пива и чипсы. Всё, работаем с его данными».

На что смотреть, когда ты эту хрень тестируешь?

  • Жизненный цикл, мать его: Сессия должна рождаться, когда надо, умирать, когда надо (логаут, или ты про неё забыл на полчаса), и не воскресать как зомби. Проверяй, что после логаута старым ID нихуя нельзя сделать.
  • Безопасность, ёбаный насос: Тут самое интересное.
    • Чтобы эту самую «табличку» (Session ID) нельзя было перехватить по воздуху. Для этого должен быть HTTPS (Secure флаг у куки).
    • Чтобы тебе не подсунули заранее приготовленную, «зафиксированную» сессию (Session Fixation). Это когда злоумышленник даёт тебе ссылку со своим ID, ты по ней логинишься, а он потом с этим же ID заходит как ты. Сервер должен менять ID после авторизации.
    • Чтобы сессия жила не до второго пришествия. Таймауты должны быть адекватные.
  • Данные внутри: Что положил в сессию (например, userRole = "admin"), то и должен потом достать. И главное — чтобы ты не мог достать из своей сессии данные какого-нибудь другого чувака. Изоляция должна быть полная, пиздец!
  • Про куки: Сам бейджик (кука) должен быть правильно настроен. Флаги HttpOnly (чтобы к нему через JS нельзя было достучаться, защита от XSS), Secure (только по HTTPS), SameSite (чтобы не слать его куда не надо — защита от CSRF).

Пример, как тестить: Допустим, тестируешь корзину. Добавляешь товар «Моторное масло 5W-40». Страницу обновил — товар на месте. Прекрасно. А теперь ключевой момент: перешёл на главную, потом обратно в корзину — товар должен быть на месте, ёпта! Потому что сервер по твоему Session ID помнит, что ты тот самый мужик, который масло выбрал. Если товар пропал — значит, сессия ебнулась, данные не сохранились, и тест, ясное дело, не проходит. Всё просто, как три копейки.