Как правильно настроить cookies: не дайте красть у вас ключи

Cookies — это ключи от аккаунтов, корзин и сессий. Потерять их просто: иногда достаточно открыть сайт в кафе с бесплатным Wi-Fi. Но ещё проще — оставить ключи без надёжной связки и удивляться, почему аккаунты «отваливаются» и клиенты жалуются.

Что показала статистика

Наши сканы показали, что около 67% сайтов передают cookies без флага Secure. Порядка 58% не выставляют HttpOnly, и почти половина игнорирует SameSite. Это не гипотеза — это реальные цифры из тысяч проверок. Проще говоря: у большинства сайтов ключи висят на крючке в коридоре.

Почему это опасно (коротко и по существу)

  • Secure без флага — cookie поедет по незашифрованному каналу в открытой сети. Перехват — как на ладони.

  • HttpOnly отсутствует — вредоносный JavaScript, внедрённый через XSS, спокойно читает сессию.

  • SameSite не настроен — атака CSRF может выполнить действие от имени пользователя (списать деньги, поменять e-mail, подписаться на новости от злоумышленника).

Реальный пример — и что мы сделали

На одном из просканированных сайтов (интернет-магазин) мы обнаружили набор уязвимых cookie: Secure не выставлен, HttpOnly отсутствовал, SameSite был дефолтным. Это позволило бы злоумышленнику, запустившему XSS, вывести сессии и выполнить транзакции. Мы не эксплуатировали уязвимость; все найденные данные и подробные рекомендации были немедленно переданы руководству сайта вместе с планом исправлений и инструкцией для хостинга. Цель — защита, а не вред.

Что сделать прямо сейчас (практика)

Добавьте эти заголовки или директивы — это минимально и эффективно:

Set-Cookie: session=eyJ...; Path=/; Secure; HttpOnly; SameSite=Strict; Max-Age=3600;

Если у вас фреймворк — найдите место, где формируется сессия, и выставьте флаги там. Для PHP (пример):

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

Частые ошибки и как их избежать

  • Боязнь «сломать авторизацию». Решение: тестируйте в staging и следите за логами. Современные браузеры корректно поддерживают эти флаги.

  • Неправильный SameSite для сторонних SSO — используйте Lax или None правильно и только с Secure.

  • Оставлять старые cookies после перехода на HTTPS — надо мигрировать: удалить старые, установить новые с Secure.

Вывод — коротко и резонно

Cookies — не украшение, а ключи. Если вы не запираете их, вы отдаёте ключи почти даром. Настройка трёх-четырёх флагов — это 10 минут работы для разработчика и огромная разница в безопасности. Сделайте это сегодня: завтра может быть уже поздно.