Как устанавливаются и удаляются куки
Что проверяют
Понимаете ли вы, что кука это просто заголовок Set-Cookie в ответе и заголовок Cookie в следующих запросах, а удалить её напрямую сервер не может. Следом спрашивают про атрибуты безопасности и почему кука «не удаляется».
Как отвечать
Механика: сервер отправляет Set-Cookie: name=value с атрибутами, браузер сохраняет её и возвращает в Cookie на подходящие запросы. Удаление это та же установка с тем же именем, Path и Domain, но с Max-Age=0 или Expires в прошлом.
Во фреймворках:
- Django:
response.set_cookie("theme", "dark", max_age=3600, secure=True, httponly=True, samesite="Lax"), удаление черезresponse.delete_cookie("theme"), чтение изrequest.COOKIES; - Flask: те же
set_cookieиdelete_cookieу объекта ответа, чтение изrequest.cookies; - FastAPI: методы
set_cookieиdelete_cookieуResponseиз Starlette, чтение через параметрCookie().
Атрибуты, которые стоит назвать:
- HttpOnly: кука не видна из
document.cookie, это защита сессии от кражи через XSS; - Secure: отправка только по HTTPS;
- SameSite:
Lax,StrictилиNone, причёмNoneтребуетSecure. Chromium без атрибута считает кукуLax, но надёжнее задавать явно; - Max-Age и Expires: без них кука сессионная и живёт до закрытия браузера;
- Domain и Path: область действия.
Сессии устроены по-разному: во Flask данные сессии лежат в самой куке, подписанные, но не зашифрованные, а в Django в куке только sessionid, данные на сервере.
Где спотыкаются
Удаляют куку с другим path или domain, чем при установке. Браузер считает это другой кукой, и старая остаётся.
Кладут в куку чувствительные данные, считая, что HttpOnly их прячет. Он закрывает только JavaScript, пользователь видит значение в DevTools, а сессию Flask легко декодировать.
Ставят SameSite=None без Secure для кросс-доменного сценария, и браузер молча отбрасывает куку.