Инициаторы записи cookie в браузере

Кто является инициатором записи cookie в браузере?

Суть вопроса: кто «инициирует»?

Под «инициатором записи cookie» часто смешиваются две разные роли: источник команды на установку cookie и исполнитель фактической записи в cookie-хранилище.
Команда на установку может исходить от сервера (через Set-Cookie) или от JavaScript в документе (через setter document.cookie или через cookieStore.set()), а фактическую операцию сохранения/обновления выполняет браузер (user agent), так как cookie store принадлежит браузеру и подчиняется его правилам.

Технически корректнее формулировать ответ так: «инициатор команды — server или js; инициатор фактической записи (исполнитель) — браузер», поскольку наличие команды не гарантирует успешной установки из-за политик и ограничений контекста.

При установке 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.
Браузер интерпретирует строку вида 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 предоставляет асинхронный интерфейс для установки 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}`);
  }
}
На практике часто встречается разделение ответственности: серверные cookie используются для security-критичных сценариев, а клиентские cookie — для некритичных настроек интерфейса, при этом фактическая запись всегда остаётся за браузером.

Разбор «инициатор 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).