HTTPQUERY
Русский

Set-Cookie

Применение

Заголовок Set-Cookie указывает клиенту сохранить пару «имя — значение» вместе с необязательными атрибутами, управляющими областью действия, сроком жизни и свойствами безопасности cookie. Каждый заголовок Set-Cookie устанавливает ровно одну cookie. Серверы, отправляющие несколько cookie, включают в один и тот же ответ несколько заголовков Set-Cookie.

Общий синтаксис — имя и значение cookie, разделённые знаком равенства, за которыми следуют необязательные атрибуты, разделённые точками с запятой.

Set-Cookie: <name>=<value>; <attributes>

Имя cookie допускает символы US-ASCII, кроме управляющих символов, пробелов, табуляций и символов-разделителей ( ) < > @ , ; : \ ” / [ ] ? = { }. Значение cookie допускает символы US-ASCII, исключая управляющие символы, пробельные символы, двойные кавычки, запятые, точки с запятой и обратные косые черты. Значения при необходимости заключаются в двойные кавычки.

Браузеры запрещают фронтенд-коду на JavaScript читать заголовок Set-Cookie через Fetch API и XMLHttpRequest. В спецификации Fetch этот заголовок относится к запрещённым именам заголовков ответа. Cookie в ответах CORS игнорируются, если запрос не включает учётные данные.

Префиксы имён cookie накладывают дополнительные ограничения, которые обеспечивает браузер, давая гарантии относительно того, где и как была установлена cookie.

Префикс __Secure- требует атрибут Secure и источник HTTPS. Это не позволяет сайтам, работающим только по HTTP, устанавливать cookie с тем же именем, что и у защищённой cookie.

Set-Cookie: __Secure-ID=abc; Secure; Path=/

Префикс __Host- добавляет более строгие требования: атрибут Secure, отсутствие атрибута Domain и Path, равный /. Это привязывает cookie к точному имени хоста источника, предотвращая вмешательство поддоменов.

Set-Cookie: __Host-ID=abc; Secure; Path=/

Префикс __Http- требует одновременно атрибуты Secure и HttpOnly и может быть задан только через заголовок Set-Cookie, но не через JavaScript.

Set-Cookie: __Http-ID=abc; Secure; HttpOnly

Префикс __Host-Http- сочетает ограничения __Host- и __Http-, создавая самую строгую из доступных привязок cookie.

Set-Cookie: __Host-Http-ID=abc; Secure; HttpOnly; Path=/

Примечание

Префиксы __Http- и __Host-Http- происходят из отдельного предложения по префиксам cookie, отличного от устоявшихся префиксов __Secure- и __Host-, которые широко поддерживаются браузерами. Более новые префиксы остаются на стадии предложения.

Влияние на SEO

Googlebot отправляет cookie, установленные источником, но не сохраняет их между отдельными сеансами сканирования. Крупные cookie на доменах со статическими ресурсами увеличивают размер запросов во время рендеринга. Отдельный домен без cookie для статических ресурсов позволяет избежать этих накладных расходов. Избегайте ограничения доступа к контенту логикой, зависящей от cookie, которая мешает сканерам увидеть страницу.

Expires

Атрибут Expires задаёт абсолютную дату истечения в формате HTTP-date. После этой даты клиент перестаёт отправлять cookie. Если он опущен вместе с Max-Age, cookie становится сеансовой и удаляется при закрытии клиента. Браузеры корректируют расхождение часов, используя заголовок Date из ответа.

Expires=Thu, 31 Dec 2026 23:59:59 GMT

Примечание

Браузеры ограничивают значение Expires 400 днями с момента установки cookie. Это ограничение позволяет сайтам, посещаемым примерно раз в год, сохранять cookie, но не допускает бессрочного хранения.

Max-Age

Атрибут Max-Age задаёт срок жизни cookie в секундах с момента получения ответа клиентом. Нулевое или отрицательное значение немедленно делает cookie просроченной. Когда присутствуют и Expires, и Max-Age, приоритет имеет Max-Age.

Max-Age=2592000

Cookie Store API в JavaScript также предоставляет параметр maxAge через метод cookieStore.set(), отражающий этот атрибут для программного управления cookie. API не позволяет задать expires и maxAge для одной и той же cookie одновременно.

Примечание

Браузеры ограничивают значение Max-Age 400 днями (34 560 000 секунд), что соответствует ограничению Expires.

Domain

Атрибут Domain указывает, какие хосты получают cookie. Если он задан, cookie доступна указанному домену и всем его поддоменам. Если он опущен, cookie по умолчанию привязывается строго к хосту-источнику, исключая поддомены (host-only cookie). Допустим только текущий домен или родительский домен текущего хоста. Ведущие точки игнорируются.

Domain=example.re

Path

Атрибут Path ограничивает передачу cookie запросами, соответствующими указанному префиксу пути URL. Прямая косая черта / разделяет сегменты пути. Cookie с Path=/docs соответствует /docs, /docs/, /docs/Web/HTTP, но не / и не /docsets.

Path=/

Примечание

Атрибут Path не является механизмом безопасности. Любой скрипт в том же источнике имеет доступ ко всем cookie независимо от ограничений по пути.

Secure

Атрибут Secure ограничивает cookie соединениями HTTPS. Браузер никогда не отправляет защищённую cookie по незашифрованному HTTP. Небезопасные источники не могут устанавливать cookie с этим атрибутом. Localhost освобождён от требования HTTPS во время разработки.

HttpOnly

Атрибут HttpOnly блокирует доступ JavaScript к cookie через document.cookie, Cookie Store API и другие интерфейсы DOM. Cookie по-прежнему отправляется с HTTP-запросами, инициированными из JavaScript через fetch() и XMLHttpRequest. Этот атрибут снижает риск атак межсайтового скриптинга (XSS), направленных на кражу значений cookie.

SameSite

Атрибут SameSite определяет, отправляет ли браузер cookie с межсайтовыми запросами. Определены три значения.

Strict отправляет cookie только с запросами в пределах того же сайта. Межсайтовые переходы, включая переход по ссылке с внешнего сайта, cookie не включают.

Lax отправляет cookie с запросами в пределах того же сайта и с межсайтовыми переходами верхнего уровня, при которых меняется адресная строка. Запросы подресурсов, вызовы fetch() и переходы внутри iframe cookie не включают. Большинство браузеров по умолчанию используют Lax, когда атрибут SameSite не задан.

None отправляет cookie со всеми запросами, включая межсайтовые. При использовании SameSite=None требуется атрибут Secure. Cookie из другой схемы (HTTP против HTTPS) считаются межсайтовыми.

SameSite=Lax

Partitioned

Атрибут Partitioned сохраняет cookie в секционированном хранилище, ключом которого служат одновременно источник cookie и сайт верхнего уровня. Секционированная cookie, установленная доменом cdn.example.re, встроенным на shop.example.org, отправляется только тогда, когда cdn.example.re встроен на shop.example.org, но не при встраивании на других сайтах.

Этот атрибут является частью предложения Cookies Having Independent Partitioned State (CHIPS). Атрибут обеспечивает легитимные сценарии межсайтового использования cookie — встраиваемые виджеты, балансировку нагрузки CDN и headless-CMS — не предоставляя при этом полноценной возможности межсайтового отслеживания.

Атрибут Secure обязателен. Префикс __Host- рекомендуется для привязки cookie к точному источнику.

Set-Cookie: __Host-sess=abc; SameSite=None; Secure; Path=/; Partitioned

Поддерживается браузерами на основе Chromium и Firefox. Safari секционирует сторонние cookie по умолчанию с помощью отдельного механизма и этот атрибут не использует.

Пример

Сеансовая cookie без атрибутов истечения. Cookie удаляется по завершении клиентского сеанса.

Set-Cookie: sessionId=38afes7a8

Постоянная cookie со сроком жизни 30 дней. Атрибут Max-Age задаёт истечение относительно текущего времени.

Set-Cookie: id=a3fWa; Max-Age=2592000

Cookie с атрибутами безопасности, подходящими для токенов аутентификации. Атрибут HttpOnly блокирует доступ из JavaScript, Secure ограничивает передачу по HTTPS, а SameSite=Strict предотвращает межсайтовую передачу.

Set-Cookie: __Host-token=eyJhbGci; Secure; HttpOnly; SameSite=Strict; Path=/

Секционированная сторонняя cookie для межсайтового встраивания. Атрибут Partitioned изолирует cookie в пределах конкретного сайта верхнего уровня, на котором появляется встраиваемый элемент.

Set-Cookie: __Host-embed=34d8g; SameSite=None; Secure; Path=/; Partitioned

Несколько cookie, установленных в одном ответе. Каждой cookie требуется собственный заголовок Set-Cookie.

Set-Cookie: theme=dark; Path=/; Max-Age=31536000
Set-Cookie: __Host-sid=x8Kp2; Secure; HttpOnly; SameSite=Lax; Path=/

Диагностика

Cookie, которые не сохраняются или приходят не с теми запросами, чаще всего объясняются несогласованными атрибутами или политиками, которые применяет браузер.

Cookie не сохраняется из-за флага Secure по HTTP. Атрибут Secure требует соединения HTTPS. Cookie, установленная с Secure по обычному HTTP, молча отбрасывается. Проверьте протокол в адресной строке браузера и изучите заголовки Set-Cookie на вкладке Network в DevTools. Localhost освобождён от этого ограничения во время разработки.

Cookie не отправляется с межсайтовыми запросами (значение SameSite по умолчанию). Современные браузеры по умолчанию используют SameSite=Lax, когда атрибут SameSite отсутствует. Межсайтовые подзапросы, такие как вызовы fetch(), iframe и загрузка изображений, cookie не включают. Добавьте SameSite=None; Secure, когда cookie должна передаваться между сайтами, либо перестройте процесс так, чтобы избежать межсайтовой зависимости.

Несовпадение пути cookie. Cookie, установленная с Path=/app, не отправляется с запросами к /api или /. Убедитесь, что значение Path соответствует путям запросов, которым нужна эта cookie. Задание Path=/ делает cookie доступной на всём сайте.

Проблемы с областью действия атрибута Domain. Cookie, установленная с Domain=sub.example.re, не отправляется на example.re. Отсутствие атрибута Domain создаёт host-only cookie, ограниченную точным именем хоста. Ведущие точки в значении браузеры игнорируют. Используйте панель DevTools Application > Cookies, чтобы проверить фактический домен каждой сохранённой cookie.

Сторонняя cookie заблокирована средствами приватности браузера. Safari блокирует сторонние cookie по умолчанию с помощью Intelligent Tracking Prevention. Enhanced Tracking Protection в Firefox и Privacy Sandbox в Chrome применяют аналогичные ограничения. Атрибут Partitioned (CHIPS) предоставляет стандартизованный путь для легитимных сценариев межсайтового использования cookie. Проверяйте поведение в нескольких браузерах.

Cookie превышает максимальный размер. Браузеры применяют ограничение примерно в 4096 байт на одну cookie (имя, значение и атрибуты вместе). Cookie избыточного размера молча отбрасываются. Перенесите большие данные в серверные сессии и храните в cookie только идентификатор сессии.

Отладка сохранённых cookie. Откройте DevTools > Application > Cookies, чтобы изучить все cookie текущего сайта, включая атрибуты, срок истечения и размер. API document.cookie не раскрывает cookie с HttpOnly. Используйте curl -v, чтобы увидеть исходные заголовки Set-Cookie, возвращаемые сервером.