diff options
author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
---|---|---|
committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
commit | 33058f2b292b3a581333bdfb21b8f671898c5060 (patch) | |
tree | 51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/web/http/headers/set-cookie | |
parent | 8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff) | |
download | translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.gz translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.bz2 translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.zip |
initial commit
Diffstat (limited to 'files/zh-cn/web/http/headers/set-cookie')
-rw-r--r-- | files/zh-cn/web/http/headers/set-cookie/index.html | 161 | ||||
-rw-r--r-- | files/zh-cn/web/http/headers/set-cookie/samesite/index.html | 114 |
2 files changed, 275 insertions, 0 deletions
diff --git a/files/zh-cn/web/http/headers/set-cookie/index.html b/files/zh-cn/web/http/headers/set-cookie/index.html new file mode 100644 index 0000000000..a899ead69a --- /dev/null +++ b/files/zh-cn/web/http/headers/set-cookie/index.html @@ -0,0 +1,161 @@ +--- +title: Set-Cookie +slug: Web/HTTP/Headers/Set-Cookie +translation_of: Web/HTTP/Headers/Set-Cookie +--- +<div>{{HTTPSidebar}}</div> + +<p>响应首部 <strong><code>Set-Cookie</code></strong> 被用来由服务器端向客户端发送 cookie。</p> + +<p>更多信息请查阅这篇指南: <a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a>.</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">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 +</pre> + +<h2 id="指令">指令</h2> + +<dl> + <dt><code><cookie-name>=<cookie-value></code></dt> + <dd>一个 cookie 开始于一个名称/值对: + <ul> + <li><code><cookie-name></code> 可以是除了控制字符 (CTLs)、空格 (spaces) 或制表符 (tab)之外的任何 US-ASCII 字符。同时不能包含以下分隔字符: ( ) < > @ , ; : \ " / [ ] ? = { }.</li> + <li><code><cookie-value></code> 是可选的,如果存在的话,那么需要包含在双引号里面。支持除了控制字符(CTLs)、空格(whitespace)、双引号(double quotes)、逗号(comma)、分号(semicolon)以及反斜线(backslash)之外的任意 US-ASCII 字符。<strong>关于编码</strong>:许多应用会对 cookie 值按照URL编码(URL encoding)规则进行编码,但是按照 RFC 规范,这不是必须的。不过满足规范中对于 <cookie-value> 所允许使用的字符的要求是有用的。</li> + <li><strong><code>__Secure-</code> 前缀</strong>:以 __Secure- 为前缀的 cookie(其中连接符是前缀的一部分),必须与 secure 属性一同设置,同时必须应用于安全页面(即使用 HTTPS 访问的页面)。</li> + <li><strong><code>__Host-</code> 前缀:</strong> 以 __Host- 为前缀的 cookie,必须与 secure 属性一同设置,必须应用于安全页面(即使用 HTTPS 访问的页面),必须不能设置 domain 属性 (也就不会发送给子域),同时 path 属性的值必须为“/”。</li> + </ul> + </dd> + <dt>Expires=<date> {{optional_inline}}</dt> + <dd> + <p>cookie 的最长有效时间,形式为符合 HTTP-date 规范的时间戳。参考 {{HTTPHeader("Date")}} 可以获取详细信息。如果没有设置这个属性,那么表示这是一个<strong>会话期 cookie </strong>。一个会话结束于客户端被关闭时,这意味着会话期 cookie 在彼时会被移除。然而,很多Web浏览器支持会话恢复功能,这个功能可以使浏览器保留所有的tab标签,然后在重新打开浏览器的时候将其还原。与此同时,cookie 也会恢复,就跟从来没有关闭浏览器一样。</p> + </dd> + <dt>Max-Age=<non-zero-digit> {{optional_inline}}</dt> + <dd>在 cookie 失效之前需要经过的秒数。秒数为 0 或 -1 将会使 cookie 直接过期。一些老的浏览器(ie6、ie7 和 ie8)不支持这个属性。对于其他浏览器来说,假如二者 (指 <code>Expires</code> 和<code>Max-Age</code>) 均存在,那么 Max-Age 优先级更高。</dd> + <dt>Domain=<domain-value> {{optional_inline}}</dt> + <dd>指定 cookie 可以送达的主机名。假如没有指定,那么默认值为当前文档访问地址中的主机部分(但是不包含子域名)。与之前的规范不同的是,域名之前的点号会被忽略。假如指定了域名,那么相当于各个子域名也包含在内了。</dd> + <dt>Path=<path-value> {{optional_inline}}</dt> + <dd>指定一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 首部。字符 %x2F ("/") 可以解释为文件目录分隔符,此目录的下级目录也满足匹配的条件(例如,如果 path=/docs,那么 "/docs", "/docs/Web/" 或者 "/docs/Web/HTTP" 都满足匹配的条件)。</dd> + <dt>Secure {{optional_inline}}</dt> + <dd>一个带有安全属性的 cookie 只有在请求使用SSL和HTTPS协议的时候才会被发送到服务器。然而,保密或敏感信息永远不要在 HTTP cookie 中存储或传输,因为整个机制从本质上来说都是不安全的,比如前述协议并不意味着所有的信息都是经过加密的。 + <p class="note"><strong>注意:</strong>非安全站点(http:)已经不能再在 cookie 中设置 secure 指令了(在Chrome 52+ and Firefox 52+ 中新引入的限制)。</p> + </dd> + <dt>HttpOnly {{optional_inline}}</dt> + <dd>设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由 {{domxref("Document.cookie")}} 属性、{{domxref("XMLHttpRequest")}} 和 {{domxref("Request")}} APIs 进行访问,以防范跨站脚本攻击({{Glossary("XSS")}})。</dd> + <dt>SameSite=Strict<br> + SameSite=Lax {{optional_inline}} {{experimental_inline}}</dt> + <dd> + <p>允许服务器设定一则 cookie 不随着跨域请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击({{Glossary("CSRF")}})。</p> + </dd> +</dl> + +<h2 id="示例">示例</h2> + +<h3 id="会话期_cookie">会话期 cookie</h3> + +<p>会话期 cookies 将会在客户端关闭时被移除。 会话期 cookie 不设置 Expires 或 Max-Age 指令。注意浏览器通常支持会话恢复功能。</p> + +<pre>Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/</pre> + +<h3 id="持久化_cookie">持久化 cookie</h3> + +<p>持久化 Cookie 不会在客户端关闭时失效,而是在特定的日期(Expires)或者经过一段特定的时间之后(Max-Age)才会失效。</p> + +<pre>Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly +</pre> + +<h3 id="非法域">非法域</h3> + +<p>属于特定域的 cookie,假如域名不能涵盖原始服务器的域名,那么<a href="https://tools.ietf.org/html/rfc6265#section-4.1.2.3">应该被用户代理拒绝</a>。下面这个 cookie 假如是被域名为 originalcompany.com 的服务器设置的,那么将会遭到用户代理的拒绝:</p> + +<pre>Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk; Path=/; Expires=Wed, 30 Aug 2019 00:00:00 GMT</pre> + +<h3 id="Cookie_前缀">Cookie 前缀</h3> + +<p>名称中包含 __Secure- 或 __Host- 前缀的 cookie,只可以应用在使用了安全连接(HTTPS)的域中,需要同时设置 secure 指令。另外,假如 cookie 以 __Host- 为前缀,那么 path 属性的值必须为 "/" (表示整个站点),且不能含有 domain 属性。对于不支持 cookie 前缀的客户端,无法保证这些附加的条件成立,所以 cookie 总是被接受的。</p> + +<pre>// 当响应来自于一个安全域(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 +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + <tr> + <td>{{RFC("6265", "Set-Cookie", "4.1")}}</td> + <td>HTTP State Management Mechanism</td> + </tr> + <tr> + <td>{{RFC("draft-ietf-httpbis-cookie-prefixes-00")}}</td> + <td>Cookie Prefixes</td> + </tr> + <tr> + <td>{{RFC("draft-ietf-httpbis-cookie-same-site-00")}}</td> + <td>Same-Site Cookies</td> + </tr> + <tr> + <td>{{RFC("draft-ietf-httpbis-cookie-alone-01")}}</td> + <td>Strict Secure Cookies</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Set-Cookie")}}</p> + +<h2 id="关于兼容性的注意事项">关于兼容性的注意事项</h2> + +<ul> + <li>从 Chrome 52 和 Firefox 52 开始,非安全站点(http:)已经不能再在 cookie 中设置 "secure" 指令了。</li> +</ul> + +<h2 id="相关内容">相关内容</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a></li> + <li>{{HTTPHeader("Cookie")}}</li> + <li>{{domxref("Document.cookie")}}</li> +</ul> diff --git a/files/zh-cn/web/http/headers/set-cookie/samesite/index.html b/files/zh-cn/web/http/headers/set-cookie/samesite/index.html new file mode 100644 index 0000000000..ea0c7f0be3 --- /dev/null +++ b/files/zh-cn/web/http/headers/set-cookie/samesite/index.html @@ -0,0 +1,114 @@ +--- +title: SameSite cookies +slug: Web/HTTP/Headers/Set-Cookie/SameSite +translation_of: Web/HTTP/Headers/Set-Cookie/SameSite +--- +<div></div> + +<p><strong><code>SameSite</code></strong> 是HTTP响应头 <span class="seoSummary">{{HTTPHeader("Set-Cookie")}}</span> 的属性之一。它允许您声明该Cookie是否仅限于第一方或者同一站点上下文。</p> + +<h2 id="值">值</h2> + +<p> <code>SameSite</code> 接受下面三个值:</p> + +<h3 id="Lax"><code>Lax</code></h3> + +<p>Cookies允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送。这是浏览器中的默认值。</p> + +<h3 id="Strict"><code>Strict</code></h3> + +<p>Cookies只会在第一方上下文中发送,不会与第三方网站发起的请求一起发送。</p> + +<h3 id="None"><code>None</code></h3> + +<p>Cookie将在所有上下文中发送,即允许跨域发送。</p> + +<p>以前 <code>None</code> 是默认值,但最近的浏览器版本将 <code>Lax</code> 作为默认值,以便对某些类型的跨站请求伪造 ({{Glossary("CSRF")}}) 攻击具有相当强的防御能力。</p> + +<p>使用 <code>None</code> 时,需在最新的浏览器版本中使用 <a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie"><code>Secure</code></a> 属性。更多信息见下文。</p> + +<h2 id="针对常见警告信息的解决办法">针对常见警告信息的解决办法</h2> + +<h3 id="SameSiteNone_需要_Secure"><code>SameSite=None</code> 需要 <code>Secure</code></h3> + +<p>如果没有设置 <code>Secure</code> 属性,控制台中可能会出现以下警告:</p> + +<blockquote> +<p>Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected.<br> + Cookie “<em>myCookie</em>” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute.</p> +</blockquote> + +<p>出现此警告是因为需要 <code>SameSite=None</code> 但未标记 <code>Secure</code> 的任何cookie都将被拒绝。</p> + +<pre class="example-bad notranslate">Set-Cookie: flavor=choco; SameSite=None</pre> + +<p>要解决此问题,必须将 <code>Secure</code> 属性添加到 <code>SameSite=None</code> cookies中。</p> + +<pre class="example-good notranslate">Set-Cookie: flavor=choco; SameSite=None; <strong>Secure</strong></pre> + +<p><a href="https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie"><code>Secure</code></a> cookie仅通过HTTPS协议加密发送到服务器。请注意,不安全站点(<code>http:</code>)无法使用 <code>Secure</code> 指令设置cookies。</p> + +<h3 id="没有_SameSite_属性的Cookies默认为_SameSiteLax">没有 <code>SameSite</code> 属性的Cookies默认为 <code>SameSite=Lax</code></h3> + +<p>最新版本的现代浏览器为cookies的 <code>SameSite</code> 提供了更安全的默认值,因此控制台中可能会显示以下消息:</p> + +<blockquote> +<p>Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected.<br> + Cookie “<em>myCookie</em>” has “sameSite” policy set to “lax” because it is missing a “sameSite” attribute, and “sameSite=lax” is the default value for this attribute.</p> +</blockquote> + +<p>出现警告是因为未显式指定cookie的 <code>SameSite</code> 属性:</p> + +<pre class="example-bad notranslate">Set-Cookie: flavor=choco</pre> + +<p>虽然您可以依赖现代浏览器自动应用 <code>SameSite=Lax</code>,但您应该显式地指定它,以便清楚地传达您的意图,即要如何将 <code>SameSite</code> 属性应用到您的cookie。这也将改善跨浏览器的体验,因为并不是所有浏览器都默认为 <code>Lax</code>。</p> + +<pre class="example-good notranslate">Set-Cookie: flavor=choco; <strong>SameSite=Lax</strong></pre> + +<h2 id="示例"><strong>示例</strong></h2> + +<pre class="notranslate">RewriteEngine on +RewriteBase "/" +RewriteCond "%{HTTP_HOST}" "^example\.org$" [NC] +RewriteRule "^(.*)" "https://www.example.org/index.html" [R=301,L,QSA] +RewriteRule "^(.*)\.ht$" "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;01;https://www.example.org;30/;SameSite=None;Secure] +RewriteRule "^(.*)\.htm$" "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;02;https://www.example.org;30/;SameSite=None;Secure] +RewriteRule "^(.*)\.html$" "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;03;https://www.example.org;30/;SameSite=None;Secure] +[...] +RewriteRule "^admin/(.*)\.html$" "admin/index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;09;https://www.example.org:30/;SameSite=Strict;Secure] +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("6265", "Set-Cookie", "4.1")}}</td> + <td>HTTP State Management Mechanism</td> + </tr> + <tr> + <td><a href="https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-05">draft-ietf-httpbis-rfc6265bis-05</a></td> + <td>Cookie Prefixes, Same-Site Cookies, and Strict Secure Cookies</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> + +<p>{{Compat("http.headers.Set-Cookie", 5)}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li><a href="/en-US/docs/Web/HTTP/Cookies">HTTP cookies</a></li> + <li>{{HTTPHeader("Cookie")}}</li> + <li>{{domxref("Document.cookie")}}</li> +</ul> |