Какие основные настройки есть у cookies
Что проверяют
Понимаете ли вы, как атрибуты cookie влияют на безопасность сессии и от какой атаки защищает каждый. Следом почти всегда спрашивают: «HttpOnly защищает от CSRF?» или «почему авторизация отвалилась во встроенном iframe».
Как отвечать
Пройдитесь по атрибутам заголовка Set-Cookie:
ExpiresиMax-Age: дата окончания и срок в секундах. Если заданы оба, побеждаетMax-Age. Без них cookie сессионная и живёт до закрытия браузера, хотя восстановление сессии в браузере может её сохранить. Chrome ограничивает срок жизни 400 днями, даже если сервер попросил больше;Domain: без атрибута cookie host-only и уходит только на тот же хост. СDomain=example.comона уходит и на все поддомены, то есть атрибут расширяет доступ, а не сужает;Path: префикс пути, для которого cookie отправляется. Это удобство, а не граница безопасности;Secure: отправка только по HTTPS, исключение сделано дляlocalhost;HttpOnly: cookie недоступна изdocument.cookie, поэтому скрипт, внедрённый через XSS, не унесёт токен;SameSite:Strictне шлёт cookie ни в каких межсайтовых запросах,Laxиз межсайтовых шлёт только переход верхнего уровня безопасным методом вроде GET,Noneшлёт всегда и требуетSecure. Без атрибута Chrome считает cookieLax;- префиксы:
__Host-требуетSecure,Path=/и запрещаетDomain,__Secure-требуетSecure. Лучший выбор для сессионной cookie; Partitioned: сторонняя cookie хранится отдельно для каждого сайта верхнего уровня. Это нужно встраиваемым виджетам, когда браузеры режут обычные сторонние cookies.
Ещё назовите лимит около 4 КБ на одну cookie и то, что cookie уходят в каждом запросе к домену, включая статику.
Где спотыкаются
Говорят, что HttpOnly защищает от CSRF. Он мешает только краже cookie через XSS, а от CSRF защищают SameSite и CSRF-токены.
Путают site и origin. Поддомены одного домена считаются same-site, поэтому SameSite не спасёт от атаки со взломанного поддомена.
Ставят SameSite=None без Secure, и браузер молча отбрасывает cookie. Или добавляют Domain «для надёжности» и тем самым отдают сессию всем поддоменам.