Безопасность и домен 2 мин чтения

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

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

Cookie хранят сессию: по ним сайт узнаёт вошедшего пользователя. Кража сессионной cookie равносильна краже пароля — злоумышленник входит в аккаунт, не зная его. Атрибуты cookie определяют, насколько это легко.

Set-Cookie: session=abc123; Secure; HttpOnly; SameSite=Lax; Path=/

Secure

Cookie передаётся только по HTTPS. Без этого флага она уйдёт открытым текстом при любом обращении по HTTP — и её увидит любой на пути: владелец Wi-Fi-точки, провайдер, посторонний в той же сети.

Даже если сайт полностью на HTTPS, достаточно одной старой ссылки или запроса к картинке по http://, чтобы cookie утекла.

HttpOnly

Cookie недоступна из JavaScript — document.cookie её не покажет. Это защита от XSS: если на страницу как-то попал чужой скрипт, он не сможет прочитать и отправить сессию.

Ставится на все служебные cookie. Не ставится только на те, которые действительно нужны скриптам на странице (например, признак согласия с cookie-баннером).

SameSite

Определяет, отправлять ли cookie при переходах с других сайтов. Защита от CSRF — атаки, при которой чужая страница отправляет запрос на ваш сайт от имени залогиненного пользователя.

  • Strict — cookie не отправляется при переходе извне вообще. Максимальная защита, но неудобно: человек, пришедший по ссылке из письма, окажется разлогиненным.
  • Lax — отправляется при обычных переходах по ссылкам, но не при отправке форм и запросах со стороннего сайта. Разумный выбор по умолчанию; современные браузеры применяют его сами, если атрибут не задан.
  • None — отправляется всегда; обязательно вместе с Secure. Нужно для встраиваемых виджетов и платёжных сценариев.

Дополнительно

  • Path и Domain — ограничивают область действия. Чем уже, тем лучше.
  • Max-Age / Expires — срок жизни. Сессионные cookie лучше делать короткоживущими.
  • Префикс __Host- в имени — cookie принимается, только если она с Secure, без Domain и с Path=/. Защищает от подмены с поддомена.

Как настроить

PHP:

setcookie('session', $value, [
    'expires' => time() + 3600,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

Laravel — в config/session.php: 'secure' => true, 'http_only' => true, 'same_site' => 'lax'.

WordPress — обычно решается плагином безопасности или настройкой FORCE_SSL_ADMIN.

Nginx может дописать флаги к чужим cookie, если приложение не правится:

proxy_cookie_flags ~ secure httponly samesite=lax;

Как проверить

  • Пункт аудита «Флаги cookie (Secure/HttpOnly)»: показывает, у каких именно cookie каких флагов не хватает.
  • В браузере: F12ApplicationCookies. Колонки Secure, HttpOnly, SameSite — с галочками и значениями.
  • Из консоли:
curl -I https://example.ru/ | grep -i set-cookie

И отдельно — про закон

Cookie счётчиков аналитики и рекламы относятся к обработке персональных данных. Помимо технических флагов сайту нужны уведомление об использовании cookie и политика обработки персональных данных — это требование 152-ФЗ, и оно не зависит от размера сайта.

А что с этим на вашем сайте?

Аудит «Кверху» проверяет этот пункт вместе с остальными пятьюдесятью и показывает конкретику: какие страницы затронуты и что именно исправить. Первая полная проверка проекта — бесплатно.

Проверить сайт бесплатно