--- title: Set-Cookie slug: Web/HTTP/Headers/Set-Cookie translation_of: Web/HTTP/Headers/Set-Cookie ---
响应首部 Set-Cookie
被用来由服务器端向客户端发送 cookie。
更多信息请查阅这篇指南: HTTP cookies.
Header type | {{Glossary("Response header")}} |
---|---|
{{Glossary("Forbidden header name")}} | no |
Set-Cookie: <cookie-name>=<cookie-value> Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit> 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 // Multiple directives are also possible, for example: Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
<cookie-name>=<cookie-value>
<cookie-name>
可以是除了控制字符 (CTLs)、空格 (spaces) 或制表符 (tab)之外的任何 US-ASCII 字符。同时不能包含以下分隔字符: ( ) < > @ , ; : \ " / [ ] ? = { }.<cookie-value>
是可选的,如果存在的话,那么需要包含在双引号里面。支持除了控制字符(CTLs)、空格(whitespace)、双引号(double quotes)、逗号(comma)、分号(semicolon)以及反斜线(backslash)之外的任意 US-ASCII 字符。关于编码:许多应用会对 cookie 值按照URL编码(URL encoding)规则进行编码,但是按照 RFC 规范,这不是必须的。不过满足规范中对于 <cookie-value> 所允许使用的字符的要求是有用的。__Secure-
前缀:以 __Secure- 为前缀的 cookie(其中连接符是前缀的一部分),必须与 secure 属性一同设置,同时必须应用于安全页面(即使用 HTTPS 访问的页面)。__Host-
前缀: 以 __Host- 为前缀的 cookie,必须与 secure 属性一同设置,必须应用于安全页面(即使用 HTTPS 访问的页面),必须不能设置 domain 属性 (也就不会发送给子域),同时 path 属性的值必须为“/”。cookie 的最长有效时间,形式为符合 HTTP-date 规范的时间戳。参考 {{HTTPHeader("Date")}} 可以获取详细信息。如果没有设置这个属性,那么表示这是一个会话期 cookie 。一个会话结束于客户端被关闭时,这意味着会话期 cookie 在彼时会被移除。然而,很多Web浏览器支持会话恢复功能,这个功能可以使浏览器保留所有的tab标签,然后在重新打开浏览器的时候将其还原。与此同时,cookie 也会恢复,就跟从来没有关闭浏览器一样。
Expires
和Max-Age
) 均存在,那么 Max-Age 优先级更高。注意:非安全站点(http:)已经不能再在 cookie 中设置 secure 指令了(在Chrome 52+ and Firefox 52+ 中新引入的限制)。
允许服务器设定一则 cookie 不随着跨域请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击({{Glossary("CSRF")}})。
会话期 cookies 将会在客户端关闭时被移除。 会话期 cookie 不设置 Expires 或 Max-Age 指令。注意浏览器通常支持会话恢复功能。
Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/
持久化 Cookie 不会在客户端关闭时失效,而是在特定的日期(Expires)或者经过一段特定的时间之后(Max-Age)才会失效。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
属于特定域的 cookie,假如域名不能涵盖原始服务器的域名,那么应该被用户代理拒绝。下面这个 cookie 假如是被域名为 originalcompany.com 的服务器设置的,那么将会遭到用户代理的拒绝:
Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk; Path=/; Expires=Wed, 30 Aug 2019 00:00:00 GMT
名称中包含 __Secure- 或 __Host- 前缀的 cookie,只可以应用在使用了安全连接(HTTPS)的域中,需要同时设置 secure 指令。另外,假如 cookie 以 __Host- 为前缀,那么 path 属性的值必须为 "/" (表示整个站点),且不能含有 domain 属性。对于不支持 cookie 前缀的客户端,无法保证这些附加的条件成立,所以 cookie 总是被接受的。
// 当响应来自于一个安全域(HTTPS)的时候,二者都可以被客户端接受 Set-Cookie: __Secure-ID=123; Secure; Domain=example.com Set-Cookie: __Host-ID=123; Secure; Path=/ // 缺少 Secure 指令,会被拒绝 Set-Cookie: __Secure-id=1 // 缺少 Path=/ 指令,会被拒绝 Set-Cookie: __Host-id=1; Secure // 由于设置了 domain 属性,会被拒绝 Set-Cookie: __Host-id=1; Secure; Path=/; domain=example.com
Specification | Title |
---|---|
{{RFC("6265", "Set-Cookie", "4.1")}} | HTTP State Management Mechanism |
{{RFC("draft-ietf-httpbis-cookie-prefixes-00")}} | Cookie Prefixes |
{{RFC("draft-ietf-httpbis-cookie-same-site-00")}} | Same-Site Cookies |
{{RFC("draft-ietf-httpbis-cookie-alone-01")}} | Strict Secure Cookies |
{{Compat("http.headers.Set-Cookie")}}