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 каких флагов не хватает.
- В браузере:
F12→ Application → Cookies. КолонкиSecure,HttpOnly,SameSite— с галочками и значениями. - Из консоли:
curl -I https://example.ru/ | grep -i set-cookie
И отдельно — про закон
Cookie счётчиков аналитики и рекламы относятся к обработке персональных данных. Помимо технических флагов сайту нужны уведомление об использовании cookie и политика обработки персональных данных — это требование 152-ФЗ, и оно не зависит от размера сайта.