Заголовки: 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. Определение 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, если не задан атрибут cookieHttpOnly.Незащищённые сайты (
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-, чтобы привязать их к имени узла, а не к регистрируемому домену.
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 CatalinaSameSite=None и недопустимые значения трактуются как Strict. См. ошибку 198181. |
51 | 60 | 41 |
1312.2–13В iOS до версии 13SameSite=None и недопустимые значения трактуются как Strict. См. ошибку 198181. |
5.0 | 51 |
1312.2–13В iOS до версии 13SameSite=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 | 124 | Нет | 140 | 143 | 92 | Нет | Нет | 140 | Нет |
См. также
- HTTP-cookie
CookieDocument.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