Какие куки отправляются на сервер и можно ли предотвратить их отправку
Что проверяют
Понимаете ли вы, по каким правилам браузер сам прикладывает куки к запросу и какими атрибутами это управляется. Следом обычно спрашивают про CSRF и SameSite или про то, почему куки не доходят до API на другом домене.
Как отвечать
Браузер кладёт в заголовок Cookie все подходящие куки, причём только пары имя=значение, атрибуты на сервер не уходят. Кука подходит, если:
- совпал домен: без
Domainона host-only и идёт только на свой хост, сDomain=example.comидёт и на поддомены; - совпал путь:
Path=/apiуходит на/apiи глубже, но не на/; - не истекла: без
ExpiresиMax-Ageэто сессионная кука; - соблюдён
Secure: такая кука идёт только по HTTPS; - пропускает
SameSite:Strictне уходит ни с каким межсайтовым запросом,Laxуходит при переходе верхнего уровня методом GET, но не с фоновыми запросами и не с POST-формой с чужого сайта,Noneидёт везде и требуетSecure. Chromium считает куку без атрибутаLax, Firefox и Safari по умолчанию так не делают.
HttpOnly на отправку не влияет: он только прячет куку от document.cookie.
Как не отправлять:
- на клиенте:
fetch(url, { credentials: "omit" })не прикладывает куки вовсе. По умолчанию стоит"same-origin", на чужой origin куки идут только с"include"и если сервер ответилAccess-Control-Allow-Credentials: trueс конкретным origin вместо*; - на сервере: сузить область через
Path, host-only домен,SameSite=Strict, префикс__Host-; - архитектурно: раздавать статику с отдельного домена без кук, чтобы не гонять лишние килобайты с каждой картинкой;
- удалить: выставить ту же куку с
Max-Age=0и теми жеPathиDomain.
Где спотыкаются
Считают, что HttpOnly запрещает отправку. Он защищает от чтения скриптом при XSS, а на сервер кука уходит как обычно.
Пытаются поставить HttpOnly через document.cookie. Браузер такую куку не сохранит: этот флаг выставляется только заголовком Set-Cookie.
Путают site и origin. api.example.com и app.example.com это разные origin, но один site, поэтому SameSite=Strict между ними ничего не блокирует.