Как сервер выставляет куки клиенту?
Что проверяют
Понимаете ли вы механику Set-Cookie и Cookie на уровне HTTP, а не только вызов метода во фреймворке, и знаете ли атрибуты, от которых зависит безопасность сессии. Следом обычно спрашивают про SameSite и про то, почему куку не удаётся удалить.
Как отвечать
Сервер добавляет в ответ заголовок Set-Cookie, по одному на каждую куку. Браузер сохраняет её и сам подставляет в заголовок Cookie следующих запросов, если совпадают домен и путь. Атрибуты стоит перечислить вместе с поведением по умолчанию:
Max-AgeиExpires: срок жизни, при обоих побеждаетMax-Age. Без них кука сессионная и живёт до закрытия браузера;DomainиPath: безDomainкука привязана только к текущему хосту, с ним уходит и на поддомены;Secure: кука передаётся только по HTTPS;HttpOnly: кука не видна вdocument.cookie;SameSite:Strict,LaxилиNone.Noneработает только вместе сSecure, а без атрибута Chrome ведёт себя как приLax;- префиксы:
__Host-требуетSecureиPath=/и запрещаетDomain.
В Python это выглядит похоже во всех фреймворках: response.set_cookie(...) в Django, Flask и FastAPI (там метод приходит из Starlette) с аргументами max_age, secure, httponly, samesite. В Django сессионной кукой управляют настройки SESSION_COOKIE_SECURE, SESSION_COOKIE_HTTPONLY, SESSION_COOKIE_SAMESITE. Размер одной куки ограничен примерно 4 КБ, поэтому в неё кладут идентификатор сессии, а не данные.
Где спотыкаются
Говорят, что HttpOnly защищает от XSS. Он только не даёт украсть куку скриптом, а внедрённый скрипт всё равно отправит запросы от имени пользователя.
Удаляют куку с другим Path или Domain, чем при установке. Браузер считает это другой кукой, и старая остаётся. delete_cookie нужно вызывать с теми же параметрами.
В FastAPI ставят куку на response из параметров обработчика, а возвращают новый JSONResponse. Кука пропадает вместе с отброшенным объектом, её нужно ставить на тот ответ, который реально возвращается.