Инициаторы записи cookie в браузере
Кто является инициатором записи cookie в браузере?
Суть вопроса: кто «инициирует»?
Под «инициатором записи cookie» часто смешиваются две разные роли: источник команды на установку cookie и исполнитель фактической записи в cookie-хранилище.
Команда на установку может исходить от сервера (через Set-Cookie) или от JavaScript в документе (через setter document.cookie или через cookieStore.set()), а фактическую операцию сохранения/обновления выполняет браузер (user agent), так как cookie store принадлежит браузеру и подчиняется его правилам.
Запись cookie по HTTP (Set-Cookie)
При установке cookie по HTTP инициатором команды является сервер: он отправляет в ответе заголовок Set-Cookie, предназначенный для передачи параметров cookie в браузер.
Далее браузер разбирает имя/значение и атрибуты, проверяет применимость и либо сохраняет cookie, либо отклоняет установку (например, из‑за требований безопасности и ограничений приватности).
Примеры HTTP-ответа:
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: SID=abc123; Path=/; HttpOnly; Secure; SameSite=Lax
HTTP/1.1 200 OK
Set-Cookie: PREF=dark; Max-Age=31536000; Path=/; Secure; SameSite=None
Пример последующего запроса, где браузер сам добавляет заголовок Cookie с подходящими значениями:
GET /account HTTP/1.1
Host: example.com
Cookie: SID=abc123; PREF=dark
Set-Cookie не означает гарантированную запись: часть cookie может блокироваться или модифицироваться (например, по атрибутам SameSite/Secure и по настройкам браузера).Запись cookie из JavaScript (document.cookie)
При установке cookie из JavaScript инициатором команды является код страницы, который присваивает строку в document.cookie, причём за одно присваивание задаётся одна cookie.
Браузер интерпретирует строку вида key=value; attr=... и применяет её к cookie текущего контекста с учётом области видимости (domain/path), срока жизни, а также ограничений доступа (например, cookie с HttpOnly не читаются через document.cookie).
Пример установки cookie:
document.cookie = "theme=dark; Path=/; Max-Age=86400; SameSite=Lax"
Пример удаления cookie через истёкшую дату:
document.cookie = "theme=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT"
Пример чтения cookie:
const cookieLine = document.cookie
document.cookie не устанавливается HttpOnly, поэтому cookie, которые не должны быть доступны JavaScript (например, идентификатор сессии), обычно инициируются сервером через Set-Cookie с HttpOnly.Cookie Store API (cookieStore.set)
Cookie Store API предоставляет асинхронный интерфейс для установки cookie из документа или service worker: инициатором команды выступает скрипт, а запись выполняется браузером.
Операция установки выполняется методом cookieStore.set(), который обычно требует безопасного контекста и возвращает промис, поэтому типичный шаблон включает await и обработку ошибок.
Пример установки cookie по имени и значению:
await cookieStore.set("cookie1", "cookie1-value")
Пример установки cookie объектом:
async function cookieTest() {
const day = 24 * 60 * 60 * 1000;
try {
await cookieStore.set({
name: "cookie2",
value: "cookie2-value",
expires: Date.now() + day,
partitioned: true
});
} catch (error) {
console.log(`Error setting cookie2: ${error}`);
}
}
Разбор «инициатор vs исполнитель»
Инициатор команды на установку cookie может быть внешним по отношению к браузеру (сервер) или внутренним (скрипт), но исполнитель сохранения — браузер (user agent), поскольку cookie являются механизмом состояния, управляемым клиентом.
Это разделение помогает объяснить поведение безопасности: HttpOnly ограничивает доступ скриптов, но не отменяет автоматическую отправку cookie браузером в запросах при выполнении условий области видимости.
Также встречаются дополнительные источники команд (например, расширения браузера), однако даже в этих случаях физическое изменение cookie store выполняется браузером.
Таблица ролей и каналов установки:
| Канал установки | Инициатор команды | Исполнитель записи | Типичный пример |
|---|---|---|---|
HTTP Set-Cookie | Сервер | Браузер (user agent) | Set-Cookie: SID=...; HttpOnly; Secure |
document.cookie | Скрипт страницы | Браузер (user agent) | document.cookie = "theme=dark; Path=/" |
cookieStore.set() | Скрипт (страница/SW) | Браузер (user agent) | await cookieStore.set("a","b") |
| API расширений | Расширение | Браузер (user agent) | установка через API cookies |
Схема потоков (упрощённо):
server --(response: Set-Cookie)--> browser(cookie store)
js -----(document.cookie / cookieStore.set)--> browser(cookie store)
browser --(request: Cookie)--> server
Кратко: инициирование установки cookie возможно со стороны сервера (Set-Cookie) и со стороны скрипта (document.cookie/cookieStore.set()), но реальную запись и применение правил всегда выполняет браузер (user agent).