Как устанавливаются и удаляются куки
Что проверяют
Знаете ли вы, что куку ставят двумя путями, сервер через заголовок Set-Cookie и клиентский JavaScript, и что права у них разные. Следом почти всегда спрашивают, почему сессионную куку нельзя поставить из document.cookie и чем куки отличаются от localStorage.
Как отвечать
Начните с серверной установки, она основная: Set-Cookie: sid=abc; Path=/; Max-Age=3600; Secure; HttpOnly; SameSite=Lax. Потом перейдите к атрибутам и к клиентской стороне:
- запись из JS:
document.cookie = "theme=dark; path=/; max-age=31536000"добавляет или перезаписывает одну куку, остальные не трогает. При чтении вы получаете только парыимя=значение, без атрибутов; Max-AgeиExpires: без них кука сессионная и живёт до конца сессии браузера. Если заданы оба, побеждаетMax-Age. Chrome ограничивает срок жизни 400 днями;Secure: кука уходит только по HTTPS;HttpOnly: прячет куку от JavaScript, это защита сессии от кражи через XSS. Выставить её можно только с сервера;SameSite:Strict,LaxилиNone.Noneработает только вместе сSecure, а Chrome без атрибута ведёт себя как приLax;- префикс
__Host-: требуетSecureиPath=/и запрещаетDomain, так куку не перебьёт поддомен.
Отдельной операции удаления нет: вы ставите ту же куку с Max-Age=0 или датой в прошлом. С сервера это Set-Cookie: sid=; Max-Age=0; Path=/, для полной очистки есть заголовок Clear-Site-Data: "cookies". Можно упомянуть асинхронный Cookie Store API (cookieStore.set(), cookieStore.delete()), но с оговоркой про поддержку в целевых браузерах.
Где спотыкаются
Пишут HttpOnly в строку для document.cookie. Браузер такую куку не сохранит вовсе: из скрипта HttpOnly поставить нельзя, в этом весь смысл флага.
Удаляют куку без тех же Path и Domain, с которыми она создавалась. Браузер считает это другой кукой, и старая остаётся на месте.
Кладут значение как есть, с пробелами, ; или кириллицей. Его нужно кодировать через encodeURIComponent. И не забывать про лимит около 4 КБ на куку: все куки домена едут в каждом запросе к нему.