Cookie — одна из основных технологий интернета. Сессия, настройки пользователя, ключевые значения — все хранится в cookie. Но если каждый cookie не настроен правильно, это может стать дырой в безопасности. Современные браузеры и веб-стандарты предлагают для cookie несколько защитных механизмов. В этой статье рассмотрим их все.
Флаг HttpOnly — защита от JavaScript
Cookie с HttpOnly нельзя прочитать через JavaScript. Почему это важно? Если на вашем сайте есть XSS уязвимость, атакующий через document.cookie прочитает сессионный cookie и угонит сессию пользователя. Если установлен флаг HttpOnly, даже при XSS, JavaScript не сможет получить доступ к этому cookie. В PHP это включается через setcookie('name', 'value', ['httponly' => true]) или настройку session.cookie_httponly=1. На каждом сессионном и аутентификационном cookie HttpOnly обязателен.
Флаг Secure — обязательность HTTPS
Cookie с установленным флагом Secure отправляется только через HTTPS. Если запрос идет через HTTP, браузер не добавляет этот cookie. Зачем это нужно? Если пользователь находится на публичном WiFi и атакующий слушает сеть, отправленный через HTTP cookie виден в открытом виде. Флаг Secure этому препятствует. В наше время все cookie должны быть Secure — поскольку HTTPS теперь стандарт.
SameSite=Strict — самая сильная защита
Cookie с SameSite=Strict отправляется только при запросах с этого же сайта. Даже при клике по ссылке с другого сайта cookie не добавляется. Это самая сильная защита от CSRF атак. Но влияет на пользовательский опыт: если пользователь нажмет ссылку в email и зайдет на сайт, даже если он залогинен, он будет виден как неавторизованный. Подходит для банковских приложений и критических систем.
SameSite=Lax — сбалансированный подход
SameSite=Lax — это баланс между Strict и старым поведением. Cookie отправляется в большинстве случаев, но не при отправке POST формы или внутри iframe. Это защищает от большей части CSRF атак, но не нарушает пользовательский опыт. В современных браузерах SameSite=Lax используется как стандарт. Подходит для большинства веб-сайтов.
SameSite=None — нужна особая осторожность
Cookie с SameSite=None отправляется при любых cross-site запросах. Это старое поведение. Если используется SameSite=None, флаг Secure также обязателен — браузеры этого требуют. Эта настройка используется только когда необходима для внешних сервисов (analytics, ad networks, payment widgets). Использование для обычных сессионных cookie — ошибка.
Path и Domain — охват
Настройка Path определяет, на каких путях отправляется cookie. Например, cookie с path='/admin' отправляется только на страницах /admin/*. Это полезно для отделения admin cookie от других частей сайта. Настройка Domain определяет, на какие домены отправляется cookie. Например, domain='.sayt.uz' отправляет cookie на все субдомены. Но это опасно — если один субдомен небезопасен, все cookie под угрозой.
Практика Sayt.uz
На платформе Sayt.uz все cookie устанавливаются с флагами Secure, HttpOnly и SameSite=Lax. Для admin и кабинет cookie применяется отдельная настройка Path. Сессионные cookie регенерируются при важных действиях (логин, смена пароля). Разместив свой сайт на хостинге Sayt.uz, через бесплатный SSL сертификат полностью применяются Secure cookie.