Что такое HTTP Cookies и для чего они используются?

«Что такое HTTP Cookies и для чего они используются?» — вопрос из категории HTTP и веб-протоколы, который задают на 31% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HTTP Cookies — это небольшие фрагменты данных (пары ключ-значение), которые сервер отправляет в HTTP-ответе (заголовок Set-Cookie), а браузер клиента сохраняет и автоматически отправляет обратно с последующими запросами к тому же домену (заголовок Cookie). В контексте тестирования веб-приложений важно понимать их роль и уметь с ними работать.

Основные цели использования:

  • Управление сессией: Самый частый случай. Сессионный cookie (например, JSESSIONID, sessionid) идентифицирует аутентифицированную пользовательскую сессию.
  • Персонализация: Сохранение предпочтений пользователя (язык, тема).
  • Отслеживание: Аналитика и таргетированная реклама (трекинг-cookies).

Ключевые атрибуты cookie с точки зрения тестирования:

  • Expires / Max-Age: Срок жизни (сессионный или постоянный).
  • Domain и Path: Определяют, к каким запросам cookie будет прикреплён.
  • Secure: Передача только по HTTPS.
  • HttpOnly: Запрет доступа к cookie через JavaScript (защита от XSS).
  • SameSite: Защита от CSRF-атак (Strict, Lax, None).

Пример работы с cookies в UI-автотестах (Selenium WebDriver + Python):

from selenium import webdriver

# 1. Получение cookies после логина
driver.get("https://example.com/login")
# ... выполняем шаги аутентификации ...

all_cookies = driver.get_cookies()  # Получить список всех cookies
print(f"Cookies after login: {all_cookies}")

# 2. Поиск конкретного сессионного cookie
session_cookie = driver.get_cookie("sessionid")
assert session_cookie is not None, "Сессионный cookie не найден!"
assert session_cookie['httpOnly'] == True, "Cookie должен быть защищённым (HttpOnly)"

# 3. Добавление cookie для обхода логина в другом тесте (предварительная настройка состояния)
new_cookie = {'name': 'preferences', 'value': 'lang=en', 'path': '/'}
driver.add_cookie(new_cookie)

# 4. Удаление cookie
driver.delete_cookie("sessionid")
# После удаления сессионного cookie пользователь должен оказаться разлогиненным.

При тестировании API (например, с помощью Postman или REST Assured) cookies часто передаются и проверяются через соответствующие заголовки.