Spec-Zone.ru › HTTP

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

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

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

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

Для получения дополнительной информации см. руководство по использованию HTTP-cookie.

Тип заголовка Заголовок ответа
Запрещённое имя заголовка нет
Запрещённое имя заголовка ответа да

Синтаксис

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

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, кроме управляющих символов, пробелов или табуляции. Оно также не должно содержать разделительных символов, таких как следующие: ( ) < > @ , ; : \ " / [ ] ? = { }.

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

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

Примечание: У некоторых <cookie-name> есть определённый смысл:

__Secure-: Cookie с именами, начинающимися с __Secure- (тире является частью префикса), должны устанавливаться с флагом secure с защищённой страницы (HTTPS).

__Host-: Cookie с именами, начинающимися с __Host- должны устанавливаться с флагом secure, должны быть с защищённой страницы (HTTPS), не должны иметь указанного домена (и, следовательно, не отправляются на поддомены), а путь должен быть /.

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

Указывает максимальный срок действия cookie в формате HTTP-датированного отметки времени. См. Date для требуемого формата.

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

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

Когда устанавливается дата Expires, крайний срок относится к клиенту, на котором устанавливается cookie, а не к серверу.

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

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

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

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

Если опущено, этот атрибут по умолчанию устанавливается на хост текущего URL-адреса документа, не включая поддомены.

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

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

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

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

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

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

Указывает, что cookie отправляется на сервер только тогда, когда запрос выполняется со схемой https: (кроме localhost), и, следовательно, более устойчив к атакам man-in-the-middle.

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

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

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

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

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

Управляет отправкой cookie с межсайтовыми запросами, предоставляя некоторую защиту от межсайтовых атак подделки запросов (CSRF).

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

Strict

означает, что браузер отправляет cookie только для запросов со своего сайта, то есть запросов, исходящих с того же сайта, который установил cookie. Если запрос исходит с другого домена или схемой (даже с тем же домена), cookie с атрибутом SameSite=Strict не отправляются.

Lax

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

None

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

Примечание: Стандарты, относящиеся к cookie SameSite, недавно изменились, так что:

  1. Поведение отправки cookie, если SameSite не указано, равно SameSite=Lax. Раньше cookie отправлялись по умолчанию для всех запросов.
  2. Cookie с SameSite=None теперь также должны указывать атрибут Secure (другими словами, они требуют защищённого контекста).
  3. Cookie с одного и того же домена больше не считаются с одного и того же сайта, если отправляются с использованием другой схемы (http: или https:).

См. таблицу совместимости браузеров по SameSite: По умолчанию Lax, SameSite: Требуется защищённый контекст, SameSite: Учёт URL-схемы ("схема").

Примеры

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 будет отклонена, если её установит сервер, размещённый на originalcompany.com:

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

Cookie для поддомена домена сервера будет отклонена.

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

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

Префиксы куки

Имена куки, начинающиеся с __Secure- или __Host-, могут быть использованы только в том случае, если они установлены с атрибутом secure из безопасного (HTTPS) источника.

Кроме того, куки с префиксом __Host- должны иметь путь / (что означает любой путь на хосте) и не должны иметь атрибут 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

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

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

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

Рабочий стол Мобильный
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari на iOS Samsung Internet
HttpOnly
1
12
3
9
11
5
37
Да
4
Да
4
Да
Max-Age
Да
12
Да
8
Да
Да
Да
Да
Да
Да
Да
Да
SameSite
51
16
60
11
39
13
Safari 13 на macOS 10.14 (Mojave) обрабатывает SameSite=None и недопустимые значения как Strict. Это исправлено в версии 10.15 (Catalina) и более поздних.
12
Обрабатывает SameSite=None и недопустимые значения как Strict в macOS до 10.15 Catalina. См. ошибку 198181.
51
51
60
41
13
12.2
Обрабатывает SameSite=None и недопустимые значения как Strict в iOS до 13. См. ошибку 198181.
5.0
Set-Cookie
Да
12
Да
Да
Да
Да
Да
Да
Да
Да
Да
Да
cookie_prefixes
49
79
50
Нет
36
Да
49
49
50
36
Да
5.0

Примечания по совместимости

  • Начиная с Chrome 52 и Firefox 52, небезопасные сайты (http:) больше не могут устанавливать куки с атрибутом Secure.

См. также

  • HTTP-куки
  • Cookie
  • Document.cookie
  • Куки SameSite

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

Spec-Zone.ru

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