Spec-Zone.ru › HTTP

Заголовки: Set-Cookie

Заголовок Set-Cookie

Базовая поддержка Широко доступно *

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в разных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

* Некоторые части этой функции могут поддерживаться на разных уровнях.

  • Подробнее
  • Полная таблица совместимости
>

HTTP-заголовок Set-Cookie ответа используется для отправки cookie с сервера пользовательскому агенту, чтобы тот мог позже отправить его обратно на сервер. Чтобы отправить несколько cookie, в одном ответе следует передать несколько заголовков Set-Cookie.

Предупреждение: Браузеры блокируют доступ к заголовку Set-Cookie из кода JavaScript на стороне клиента, как того требует спецификация Fetch. В ней Set-Cookie определяется как запрещённое имя заголовка ответа, которое должно быть отфильтровано из любого ответа, доступного коду на стороне клиента.

Когда запрос Fetch API или XMLHttpRequest API использует CORS, браузеры игнорируют заголовки Set-Cookie в ответе сервера, если запрос не включает учётные данные. Узнайте, как включить учётные данные, в статье Использование Fetch API — включение учётных данных и в статье о XMLHttpRequest.

Дополнительные сведения см. в руководстве Использование HTTP-cookie.

Тип заголовка Заголовок ответа
Запрещённый заголовок запроса Нет
Запрещённый заголовок ответа Да

Синтаксис

Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>
Set-Cookie: <cookie-name>=<cookie-value>; Partitioned
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure

Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure

// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

Атрибуты

<cookie-name>=<cookie-value>

Определяет имя и значение cookie. Определение cookie начинается с пары «имя-значение».

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

<cookie-value> можно заключить в двойные кавычки. Оно может содержать любые символы US-ASCII, кроме управляющих символов (символов ASCII с кодами от 0 до 31 и символа ASCII с кодом 127), пробельных символов, двойных кавычек, запятых, точек с запятой и обратных косых черт.

Кодирование: Многие реализации выполняют процентное кодирование значений cookie. Однако спецификация RFC этого не требует. Процентное кодирование помогает соблюдать требования к допустимым символам для <cookie-value>.

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

Domain=<domain-value> Необязательный

Определяет узел, которому будет отправляться cookie.

В качестве значения можно задать только текущий домен или домен более высокого уровня, если только он не является публичным суффиксом. Если задать домен, cookie будет доступен ему и всем его поддоменам.

Если атрибут не указан, cookie возвращается только узлу, который его отправил (то есть становится cookie, ограниченным узлом). Это более строгий вариант, чем указание имени узла, поскольку cookie не становится доступным поддоменам этого узла.

В отличие от более ранних спецификаций, начальные точки в доменных именах (.example.com) игнорируются.

Указывать несколько значений узла/домена нельзя, но если домен указан, то поддомены всегда включаются.

Expires=<date> Необязательный

Задаёт максимальный срок действия cookie в виде временной метки HTTP-date. Требуемый формат см. в разделе Date.

Если атрибут не указан, cookie становится сеансовым cookie. Сеанс завершается при выключении клиента, после чего сеансовый cookie удаляется.

Предупреждение: Во многих браузерах есть функция восстановления сеанса, которая сохраняет все вкладки и восстанавливает их при следующем запуске браузера. Сеансовые cookie также будут восстановлены, как если бы браузер никогда не закрывался.

Атрибут Expires задаётся сервером относительно его собственных внутренних часов, которые могут отличаться от часов браузера клиента. Браузеры Firefox и Chromium используют внутри срок действия (max-age), скорректированный с учётом разницы во времени: cookie сохраняются и истекают в соответствии со временем, заданным сервером. Коррекция расхождения часов вычисляется на основе значения заголовка DATE. Обратите внимание: в спецификации описано, как следует разбирать атрибут, но не указано, должен ли получатель корректировать его значение и, если должен, как именно.

HttpOnly Необязательный

Запрещает JavaScript обращаться к cookie, например через свойство Document.cookie. Обратите внимание: cookie, созданный с атрибутом HttpOnly, всё равно будет отправляться в запросах, инициированных JavaScript, например при вызове XMLHttpRequest.send() или fetch(). Это помогает защититься от атак с использованием межсайтового скриптинга (XSS).

Max-Age=<number> Необязательный

Задаёт количество секунд до истечения срока действия cookie. Нулевое или отрицательное значение приведёт к немедленному истечению срока действия cookie. Если заданы оба атрибута — Expires и Max-Age, — приоритет имеет Max-Age.

Partitioned Необязательный

Указывает, что cookie следует хранить в секционированном хранилище. Обратите внимание: если задан этот атрибут, необходимо также задать директиву Secure. Дополнительные сведения см. в статье Cookie с независимым секционированным состоянием (CHIPS).

Path=<path-value> Необязательный

Указывает путь, который должен присутствовать в запрошенном URL, чтобы браузер отправил заголовок Cookie.

Если атрибут не указан, по умолчанию используется компонент пути из URL запроса. Например, если cookie устанавливается запросом к https://example.com/docs/Web/HTTP/index.html, путём по умолчанию будет /docs/Web/HTTP/.

Символ косой черты (/) трактуется как разделитель каталогов, и совпадения также находятся во вложенных каталогах. Например, для Path=/docs

  • пути запросов /docs, /docs/, /docs/Web/ и /docs/Web/HTTP будут совпадать.
  • пути запросов /, /docsets, /fr/docs совпадать не будут.

Примечание: Атрибут path позволяет управлять тем, какие cookie браузер отправляет для разных частей сайта. Он не предназначен для обеспечения безопасности и не защищает от несанкционированного чтения cookie с другого пути.

SameSite=<samesite-value> Необязательный

Определяет, отправляется ли cookie в межсайтовых запросах, то есть запросах, исходящих с другого сайта, включая схему, по сравнению с сайтом, установившим cookie. Это обеспечивает некоторую защиту от определённых межсайтовых атак, в том числе от подделки межсайтовых запросов (CSRF).

Возможные значения атрибута:

Strict

Отправлять cookie только в запросах, исходящих с того же сайта, который установил cookie.

Lax

Отправлять cookie только в запросах, исходящих с того же сайта, который установил cookie, а также в межсайтовых запросах, соответствующих обоим условиям:

  • Запрос является навигацией верхнего уровня: по сути, это означает, что запрос приводит к изменению URL в адресной строке браузера.

    • Например, сюда не относятся запросы, выполняемые с помощью API fetch(), запросы подресурсов из элементов <img> или <script>, а также навигации внутри элементов <iframe>.

    • Сюда относятся запросы, выполняемые, когда пользователь нажимает ссылку в контексте просмотра верхнего уровня для перехода с одного сайта на другой, присваивает значение document.location или отправляет <form>.

  • В запросе используется безопасный метод: в частности, сюда не относятся POST, PUT и DELETE.

Если SameSite не указан, некоторые браузеры используют Lax в качестве значения по умолчанию. Подробнее см. в разделе Совместимость с браузерами.

Примечание: Если Lax используется по умолчанию, применяется более разрешительный вариант. В этом варианте cookie также включаются в запросы POST, если с момента их установки прошло не более двух минут.

None

Отправлять cookie как в межсайтовых, так и в односайтовых запросах. При использовании этого значения необходимо также задать атрибут Secure.

Secure Необязательный

Указывает, что cookie отправляется на сервер только при запросе, использующем схему https: (кроме localhost), и поэтому лучше защищён от атак типа «человек посередине».

Примечание: Не следует считать, что Secure предотвращает любой доступ к конфиденциальной информации в cookie (ключам сеанса, данным для входа и т. д.). Cookie с этим атрибутом всё ещё можно прочитать или изменить, получив доступ к жёсткому диску клиента либо через JavaScript, если не задан атрибут cookie HttpOnly.

Незащищённые сайты (http:) не могут устанавливать cookie с атрибутом Secure. Требования https: игнорируются, если атрибут Secure задан для localhost.

Префиксы cookie

Некоторые имена cookie содержат префиксы, накладывающие определённые ограничения на атрибуты cookie в поддерживающих их пользовательских агентах. Все префиксы cookie начинаются с двух символов подчёркивания (__) и заканчиваются дефисом (-). Определены следующие префиксы:

  • __Secure-: cookie с именами, начинающимися с __Secure-, должны устанавливаться защищённой страницей (HTTPS) с атрибутом Secure.
  • __Host-: cookie с именами, начинающимися с __Host-, должны устанавливаться защищённой страницей (HTTPS) с атрибутом Secure. Кроме того, для них нельзя указывать атрибут Domain, а атрибут Path должен иметь значение /. Это гарантирует, что такие cookie отправляются только узлу, который их установил, а не другим узлам домена. Кроме того, это гарантирует, что они устанавливаются для всего узла и не могут быть переопределены ни для какого пути на этом узле. Такое сочетание обеспечивает максимально возможное приближение к модели, в которой источник считается границей безопасности.
  • __Http-: cookie с именами, начинающимися с __Http-, должны устанавливаться защищённой страницей (HTTPS) с флагом Secure, а также иметь атрибут HttpOnly, подтверждающий, что они были установлены через заголовок Set-Cookie (их нельзя установить или изменить средствами JavaScript, например через Document.cookie или Cookie Store API).
  • __Host-Http-: cookie с именами, начинающимися с __Host-Http-, должны устанавливаться защищённой страницей (HTTPS) с флагом Secure и иметь атрибут HttpOnly, подтверждающий, что они были установлены через заголовок Set-Cookie. Кроме того, на них распространяются те же ограничения, что и на cookie с префиксом __Host-. Такое сочетание обеспечивает максимально возможное приближение к модели, в которой источник считается границей безопасности, и одновременно даёт разработчикам и операторам серверов понять, что область действия cookie ограничена HTTP-запросами.

Предупреждение: Нельзя рассчитывать на эти дополнительные гарантии в браузерах, не поддерживающих префиксы cookie; в таких браузерах cookie с префиксами всегда принимаются.

Примеры

>

Сеансовый cookie

Сеансовые cookie удаляются при выключении клиента. Cookie являются сеансовыми, если для них не заданы атрибуты Expires или Max-Age.

Set-Cookie: sessionId=38afes7a8

Постоянный cookie

Постоянные cookie удаляются в указанную дату (Expires) или по истечении заданного периода времени (Max-Age), а не при закрытии клиента.

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
Set-Cookie: id=a3fWa; Max-Age=2592000

Недопустимые домены

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

Следующий cookie будет отклонён, если его установит сервер, размещённый на original-company.com:

Set-Cookie: qwerty=219ffwef9w0f; Domain=some-company.co.uk

Cookie для поддомена обслуживающего домена будет отклонён.

Следующий cookie будет отклонён, если его установит сервер, размещённый на example.com:

Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com

Префиксы cookie

Имена cookie с префиксами __Secure- или __Host- можно использовать только в том случае, если они установлены с атрибутом Secure из защищённого источника (HTTPS).

Имена cookie с префиксами __Http- или __Host-Http- можно использовать только в том случае, если они установлены с атрибутом Secure из защищённого источника (HTTPS), а также имеют атрибут HttpOnly, подтверждающий, что они были установлены через заголовок Set-Cookie, а не на стороне клиента с помощью JavaScript.

Кроме того, cookie с префиксом __Host- или __Host-Http- должны иметь путь / (то есть любой путь на узле) и не должны иметь атрибут Domain.

// Both accepted when from a secure origin (HTTPS)
Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-ID=123; Secure; Path=/

// Rejected due to missing Secure attribute
Set-Cookie: __Secure-id=1

// Rejected due to the missing Path=/ attribute
Set-Cookie: __Host-id=1; Secure

// Rejected due to setting a Domain
Set-Cookie: __Host-id=1; Secure; Path=/; Domain=example.com

// Only settable via Set-Cookie
Set-Cookie: __Http-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-Http-ID=123; Secure; Path=/

Секционированный cookie

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

Примечание: Секционированные cookie необходимо устанавливать с атрибутом Secure. Кроме того, при установке секционированных cookie рекомендуется использовать префикс __Host или __Host-Http-, чтобы привязать их к имени узла, а не к регистрируемому домену.

Спецификации

Спецификация
Механизм управления состоянием HTTP>
# sane-set-cookie>

Совместимость с браузерами

Настольные компьютеры Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome для Android Firefox для Android Opera для Android Safari для iOS Samsung Internet WebView для Android WebView для iOS
HttpOnly 1 12 3 11 5 18 4 14 4 1.0 4.4 4
Max-Age 1 12 1 15 1 18 4 14 1 1.0 4.4 1
Partitioned 114 114 141 100 26.218.4–18.5 114 141 76 26.218.4–18.5 23.0 114 26.218.4–18.5
SameSite 51 16 60 39
13Safari 13 в macOS 10.14 (Mojave) трактует SameSite=None и недопустимые значения как Strict. Эта проблема исправлена в версии 10.15 (Catalina) и более поздних.
12–13В macOS до версии 10.15 Catalina SameSite=None и недопустимые значения трактуются как Strict. См. ошибку 198181.
51 60 41 13
12.2–13В iOS до версии 13 SameSite=None и недопустимые значения трактуются как Strict. См. ошибку 198181.
5.0 51 13
12.2–13В iOS до версии 13 SameSite=None и недопустимые значения трактуются как Strict. См. ошибку 198181.
Set-Cookie 1 12 1 ≤12.1
1Cookie с флагом Secure не отправляются незащищённым конечным точкам http://localhost/. См. ошибку 281149.
18 4 14
1Cookie с флагом Secure не отправляются незащищённым конечным точкам http://localhost/. См. ошибку 281149.
1.0 4.4
1Cookie с флагом Secure не отправляются незащищённым конечным точкам http://localhost/. См. ошибку 281149.
host_secure_prefixes 49 79 50 36 13 49 50 36 13 5.0 49 13
http_host-http_prefixes 140 140 143
142–143Поддержка __Host-Http- реализована под исходным именем __HostHttp-. См. ошибку 1982555.
124 Нет 140 143
142–143Поддержка __Host-Http- реализована под исходным именем __HostHttp-. См. ошибку 1982555.
92 Нет Нет 140 Нет

См. также

  • HTTP-cookie
  • Cookie
  • Document.cookie
  • Объяснение cookie SameSite (блог web.dev)

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API