Флаги Cookie: HttpOnly, Secure, SameSite

Флаги Cookie определяют поведение и уровень безопасности при передаче и хранении cookie в браузере. Они задаются сервером через заголовок Set-Cookie и интерпретируются клиентом на уровне браузера, влияя на доступность данных для JavaScript, условия отправки cookie на сервер и защиту от распространённых атак.

Флаг HttpOnly ограничивает доступ к cookie исключительно серверной логикой. При его установке браузер запрещает обращение к cookie через JavaScript (document.cookie становится недоступен для этих значений).

Основное назначение — защита от атак XSS (Cross-Site Scripting), при которых злоумышленник внедряет вредоносный скрипт в страницу и пытается похитить сессионные данные.

Ключевые свойства HttpOnly:

  • Cookie не доступны через JavaScript
  • Передаются только в HTTP-запросах
  • Не защищает от перехвата на уровне сети без HTTPS
  • Эффективен против кражи сессионных токенов через XSS

Типичный сценарий использования — хранение идентификаторов сессии:

Set-Cookie: sessionId=abc123; HttpOnly

В таких условиях даже при наличии уязвимости XSS злоумышленник не сможет получить значение cookie через клиентский скрипт.

Secure

Флаг Secure ограничивает передачу cookie только HTTPS-соединениями. Браузер игнорирует такие cookie при запросах по HTTP.

Основные характеристики:

  • Cookie передаются только по защищённому каналу HTTPS
  • Предотвращает утечку данных через незашифрованные соединения
  • Не влияет на доступность cookie в JavaScript
  • Не защищает от XSS или CSRF напрямую

Пример:

Set-Cookie: authToken=xyz789; Secure

Использование Secure критично в системах с авторизацией, так как предотвращает перехват cookie в сетевых атаках типа man-in-the-middle.

Комбинация Secure и HttpOnly часто применяется для сессионных cookie, создавая базовый уровень защиты как на транспортном, так и на клиентском уровне.

SameSite

Флаг SameSite управляет тем, в каких условиях cookie отправляются при межсайтовых запросах. Его основная цель — снижение риска CSRF (Cross-Site Request Forgery).

Поддерживаются три значения:

Strict

Cookie отправляются только при запросах, инициированных с того же сайта.

  • Максимальная защита от CSRF
  • Может ломать пользовательский опыт (например, переходы по внешним ссылкам)
Set-Cookie: sessionId=abc123; SameSite=Strict

Lax

Баланс между безопасностью и удобством. Cookie отправляются при:

  • Переходе по ссылке (GET-запрос)
  • Не отправляются при POST и других «опасных» методах из внешних сайтов
Set-Cookie: sessionId=abc123; SameSite=Lax

Это значение часто используется по умолчанию в современных браузерах.

None

Cookie отправляются во всех контекстах, включая кросс-доменные запросы. Требует обязательного флага Secure.

Set-Cookie: sessionId=abc123; SameSite=None; Secure

Используется для:

  • Встраиваемых виджетов
  • SSO-систем
  • Междоменной авторизации

Без Secure такие cookie будут отклонены современными браузерами.

Взаимодействие флагов

Комбинация флагов формирует уровень защиты:

  • HttpOnly блокирует доступ через JavaScript
  • Secure защищает транспортный уровень
  • SameSite контролирует межсайтовую отправку

Пример типичной конфигурации для сессий:

Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax

Такая комбинация снижает риск:

  • кражи через XSS (HttpOnly)
  • перехвата в сети (Secure)
  • CSRF-атак (SameSite)

Использование в серверных приложениях

В Node.js и веб-фреймворках cookie формируются через HTTP-заголовки. Например:

Set-Cookie: token=secureValue; HttpOnly; Secure; SameSite=Strict

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

Безопасные практики

Корректная конфигурация cookie учитывает следующие принципы:

  • Сессионные токены всегда помечаются HttpOnly
  • Любые аутентификационные cookie используют Secure
  • SameSite устанавливается в Lax или Strict по умолчанию
  • SameSite=None применяется только при реальной необходимости кросс-доменных сценариев
  • Отсутствие HTTPS делает Secure бессмысленным

Современные браузеры усиливают значение SameSite по умолчанию, что делает явное указание этого флага частью базовой гигиены безопасности веб-приложений.