Какие параметры у куки существуют
Что проверяют
Понимаете ли вы, как атрибуты куки влияют на безопасность и на то, куда она вообще уйдёт. Следом почти всегда спрашивают, почему HttpOnly не спасает от XSS целиком, чем Lax отличается от Strict и почему куку не удаётся удалить.
Как отвечать
Кука задаётся заголовком Set-Cookie или через document.cookie: имя, значение и атрибуты.
ExpiresиMax-Age: срок жизни,Max-Ageзадаётся в секундах и имеет приоритет. Без обоих кука сессионная;Domain: без него кука host-only и уходит только на точный хост. СDomain=example.comона поедет и на поддомены;Path: префикс пути, для которого кука отправляется, по умолчанию каталог текущего URL. Защитой не является;Secure: только по HTTPS;HttpOnly: кука недоступна из JavaScript;SameSite:Strictне шлёт куку при заходе с других сайтов,Laxшлёт при переходе по ссылке (навигация верхнего уровня методом GET),Noneшлёт всегда и требуетSecure. Chromium без атрибута ведёт себя как приLax;Partitioned: кука встроенного стороннего контента хранится отдельно для каждого сайта верхнего уровня (CHIPS).
Сильный ответ упоминает префиксы: __Secure- требует Secure, а __Host- ещё и Path=/ без Domain, так куку не подменить с поддомена. И ограничения: около 4 КБ на куку, а все куки домена уходят с каждым запросом и раздувают заголовки.
Типичный набор для сессии: __Host-session=...; Secure; HttpOnly; SameSite=Lax; Path=/.
Где спотыкаются
Считают, что HttpOnly защищает от XSS. Он не даёт украсть куку, но внедрённый скрипт всё равно отправит запросы от имени пользователя, и браузер приложит куку сам.
Думают, что Domain сужает область действия. На деле он расширяет её на поддомены, а самый узкий вариант получается без атрибута.
Не могут удалить куку. Max-Age=0 срабатывает, только если Path и Domain совпадают с теми, что были при установке.