Через что передаются куки
Что проверяют
Понимаете ли вы, что куки это пара HTTP-заголовков, и знаете ли, чем ограничена их отправка. Вопрос короткий, но по ответу видно, настраивали ли вы авторизацию и кросс-доменные запросы или только читали document.cookie.
Как отвечать
Куки живут в двух заголовках:
- сервер ставит куку заголовком
Set-Cookieв ответе, по одному заголовку на каждую куку; - браузер возвращает их заголовком
Cookieв запросе, склеивая пары через точку с запятой.
Важная деталь: обратно уходят только имя и значение. Атрибуты (Path, Domain, Expires, Max-Age, HttpOnly) сервер видит лишь в момент установки, дальше они живут в браузере и управляют тем, когда куку прикреплять.
Кроме заголовков есть запись из JavaScript через document.cookie и асинхронный CookieStore в новых браузерах, но это доступ к тому же хранилищу, а не другой канал передачи.
Дальше стоит сказать, что отправка идёт по правилам, а не всегда:
- совпадение домена (
Domainрасширяет видимость на поддомены) и префикса пути; Secure: кука уходит только по HTTPS;SameSite:Laxпо умолчанию, значениеNoneработает только вместе сSecure;HttpOnly: кука не видна из JavaScript, но в запросах уходит как обычно.
Для запросов из кода нужен credentials: "include" у fetch, иначе кроссдоменный запрос уйдёт без кук, а на сервере потребуется Access-Control-Allow-Credentials.
Где спотыкаются
Путают Secure с шифрованием. Атрибут ничего не шифрует, он лишь запрещает браузеру отправлять куку по незащищённому соединению, шифрование даёт сам TLS.
Второе: считают, что кука изолирована по порту. Порт в область видимости не входит, поэтому сервисы на разных портах одного хоста видят один набор кук, и это регулярно ломает локальную разработку.
Третье: забывают про размер. В одну куку помещается около четырёх килобайт, и весь набор уходит с каждым запросом к домену, включая картинки и статику, поэтому хранить там профиль пользователя плохая идея.