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

«Что такое HTTP cookies и для чего они используются?» — вопрос из категории HTTP и веб-протоколы, который задают на 27% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

  1. Управление сессией (Session Management): Самый частый случай. Кука с уникальным идентификатором сессии (sessionid) позволяет серверу «узнавать» пользователя между запросами.

    # Ответ сервера (установка куки)
    HTTP/1.1 200 OK
    Set-Cookie: sessionId=abc123xyz; Path=/; HttpOnly; Secure
    
    # Последующий запрос браузера (отправка куки)
    GET /dashboard HTTP/1.1
    Host: example.com
    Cookie: sessionId=abc123xyz
  2. Персонализация (Personalization): Сохранение пользовательских предпочтений (тема, язык, регион).
  3. Трекинг (Tracking): Отслеживание поведения пользователя между сайтами (часто через сторонние куки) для аналитики и рекламы.

Важные атрибуты куки (директивы Set-Cookie):

  • Expires=<date> / Max-Age=<number> — определяют срок жизни. Без них кука считается сессионной и удаляется при закрытии браузера.
  • Domain и Path — определяют, к каким URL кука будет отправляться.
  • Secure — кука будет отправлена только по защищенному протоколу HTTPS.
  • HttpOnly — запрещает доступ к куке через JavaScript (document.cookie), защищая от XSS-атак.
  • SameSite — контролирует отправку кук с cross-site запросами, защищая от CSRF-атак. Значения: Strict, Lax, None.

Аспекты для тестирования:

  • Корректность установки и удаления (логаут).
  • Соблюдение политик безопасности (HttpOnly, Secure, SameSite).
  • Влияние на функциональность при отключении кук в браузере.
  • Хранение чувствительных данных (недопустимо — пароли, токены должны быть в HttpOnly куках или localStorage).