Заголовок 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 и его значение. Определение 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, если атрибут cookieHttpOnlyне установлен.Незащищённые сайты (
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, недавно изменились, так что:
- Поведение отправки cookie, если
SameSiteне указано, равноSameSite=Lax. Раньше cookie отправлялись по умолчанию для всех запросов. - Cookie с
SameSite=Noneтеперь также должны указывать атрибутSecure(другими словами, они требуют защищённого контекста). - 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
Префиксы куки
Имена куки, начинающиеся с __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
Спецификации
Совместимость с браузерами
| Рабочий стол | Мобильный | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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
|
5.0 |
Set-Cookie |
Да |
12 |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
cookie_prefixes |
49 |
79 |
50 |
Нет |
36 |
Да |
49 |
49 |
50 |
36 |
Да |
5.0 |
Примечания по совместимости
- Начиная с Chrome 52 и Firefox 52, небезопасные сайты (
http:) больше не могут устанавливать куки с атрибутомSecure.
См. также
© 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