Set-Cookie 頭
Baseline 廣泛可用 *
HTTP Set-Cookie 響應頭用於從伺服器向用戶代理傳送一個 cookie,以便使用者代理以後可以將其傳送回伺服器。要傳送多個 cookie,應在同一個響應中傳送多個 Set-Cookie 頭。
警告: 瀏覽器禁止前端 JavaScript 程式碼訪問 Set-Cookie 頭,這是 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>可以包含除控制字元(ASCII 字元 0 到 31 和 ASCII 字元 127)或分隔符(空格、製表符以及字元:( ) < > @ , ; : \ " / [ ] ? = { })之外的任何 US-ASCII 字元。<cookie-value>可以選擇性地用雙引號括起來,幷包含除控制字元(ASCII 字元 0 到 31 和 ASCII 字元 127)、空格、雙引號、逗號、分號和反斜槓之外的任何 US-ASCII 字元。編碼:許多實現對 cookie 值執行百分號編碼。但是,RFC 規範不要求這樣做。百分號編碼確實有助於滿足
<cookie-value>允許的字元要求。注意: 某些 cookie 名稱包含字首,這些字首對支援使用者代理中的 cookie 屬性施加了特定的限制。有關更多資訊,請參閱Cookie 字首。
Domain=<domain-value>可選-
定義將傳送 cookie 的主機。
只能將當前域設定為值,或更高階的域,除非它是公共字尾。設定域將使 cookie 對其以及其所有子域都可用。
如果省略,此屬性預設為當前文件 URL 的主機,不包括子域。
與早期規範相反,域名中的前導點(
.example.com)將被忽略。不允許多個主機/域值,但如果指定了域,則始終包含子域。
Expires=<date>可選-
指示 cookie 的最長生命週期,以 HTTP-date 時間戳表示。有關所需格式,請參閱
Date。如果未指定,cookie 將成為會話 cookie。會話在客戶端關閉時結束,之後會話 cookie 將被刪除。
警告: 許多網路瀏覽器都有一個會話恢復功能,它將儲存所有標籤並在下次使用瀏覽器時恢復它們。會話 cookie 也會被恢復,就好像瀏覽器從未關閉過一樣。
Expires屬性由伺服器根據其自身的內部時鐘設定,這可能與客戶端瀏覽器的時鐘不同。Firefox 和基於 Chromium 的瀏覽器在內部使用一個經過調整的過期(max-age)值,以補償時鐘差異,根據伺服器預設的時間儲存和過期 cookie。時鐘偏差的調整是根據DATE頭的值計算的。請注意,規範解釋瞭如何解析屬性,但未指明接收方是否/如何更正該值。 HttpOnly可選-
禁止 JavaScript 訪問 cookie,例如透過
Document.cookie屬性。請注意,使用HttpOnly建立的 cookie 仍將隨 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 的路徑元件。例如,如果透過對
https://example.com/docs/Web/HTTP/index.html的請求設定了 cookie,則預設路徑將是/docs/Web/HTTP/。正斜槓 (
/) 字元被解釋為目錄分隔符,子目錄也匹配。例如,對於Path=/docs,- 請求路徑
/docs、/docs/、/docs/Web/和/docs/Web/HTTP都將匹配。 - 請求路徑
/、/docsets、/en-US/docs將不匹配。
注意:
path屬性允許您根據站點的不同部分控制瀏覽器傳送哪些 cookie。它不打算作為安全措施,並且不能防止從不同路徑未經授權地讀取 cookie。 - 請求路徑
SameSite=<samesite-value>可選-
控制 cookie 是否隨跨站請求傳送:即,源自與設定 cookie 的站點(包括方案)不同的站點的請求。這提供了一些針對某些跨站攻擊的保護,包括跨站請求偽造 (CSRF) 攻擊。
可能的屬性值是
Strict-
僅對源自設定 cookie 的同一站點的請求傳送 cookie。
Lax-
僅對源自設定 cookie 的同一站點的請求傳送 cookie,以及滿足以下兩個條件的跨站請求
-
請求是頂級導航:這實質上意味著請求導致瀏覽器位址列中顯示的 URL 發生變化。
如果未指定
SameSite,某些瀏覽器將Lax用作預設值:請參閱瀏覽器相容性以瞭解詳細資訊。注意: 當
Lax作為預設值應用時,將使用更寬鬆的版本。在此更寬鬆的版本中,cookie 也包含在POST請求中,只要它們在請求發出前不超過兩分鐘設定。 -
None-
隨跨站和同站請求傳送 cookie。使用此值時,
Secure屬性也必須設定。
Secure可選-
指示僅當請求使用
https:方案(localhost 除外)時才將 cookie 傳送到伺服器,因此更能抵抗中間人攻擊。注意: 不要假設
Secure可以防止所有對 cookie 中敏感資訊(會話金鑰、登入詳細資訊等)的訪問。如果未設定HttpOnlycookie 屬性,具有此屬性的 cookie 仍然可以透過訪問客戶端硬碟或透過 JavaScript 進行讀取/修改。不安全的站點(
http:)不能設定具有Secure屬性的 cookie。當由 localhost 設定Secure屬性時,https:要求將被忽略。
Cookie 字首
某些 cookie 名稱包含字首,這些字首對支援使用者代理中的 cookie 屬性施加了特定的限制。所有 cookie 字首都以雙下劃線 (__) 開頭,以破折號 (-) 結尾。定義了以下字首
__Secure-:名稱以__Secure-開頭的 cookie 必須由安全頁面 (HTTPS) 設定Secure屬性。__Host-:名稱以__Host-開頭的 cookie 必須由安全頁面 (HTTPS) 設定Secure屬性。此外,它們不能指定Domain屬性,並且Path屬性必須設定為/。這保證了此類 cookie 僅傳送給設定它們的主機,而不傳送給域上的任何其他主機。它還保證它們在主機範圍內設定,並且不能被該主機上的任何路徑覆蓋。這種組合產生了一個儘可能接近將來源視為安全邊界的 cookie。__Http-:名稱以__Http-開頭的 cookie 必須由安全頁面 (HTTPS) 設定Secure標誌,並且必須設定HttpOnly屬性以證明它們是透過Set-Cookie頭設定的(它們不能透過 JavaScript 功能(例如Document.cookie或 Cookie Store API)設定或修改)。__Host-Http-:名稱以__Host-Http-開頭的 cookie 必須由安全頁面 (HTTPS) 設定Secure標誌,並且必須設定HttpOnly屬性以證明它們是透過Set-Cookie頭設定的。此外,它們還具有與__Host-字首 cookie 相同的限制。這種組合產生了一個儘可能接近將來源視為安全邊界的 cookie,同時確保開發人員和伺服器操作員知道其範圍僅限於 HTTP 請求。
警告: 您不能指望在不支援 cookie 字首的瀏覽器上獲得這些額外的保證;在這種情況下,帶字首的 cookie 將始終被接受。
示例
會話 cookie
會話 cookie 在客戶端關閉時移除。如果未指定 Expires 或 Max-Age 屬性,則 cookie 是會話 cookie。
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。
如果由託管在 original-company.com 上的伺服器設定,以下 cookie 將被拒絕
Set-Cookie: qwerty=219ffwef9w0f; Domain=some-company.co.uk
將拒絕為服務域的子域設定的 cookie。
如果由託管在 example.com 上的伺服器設定,以下 cookie 將被拒絕
Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
Cookie 字首
名稱以 __Secure- 或 __Host- 為字首的 Cookie 只能在安全 (HTTPS) 源設定 Secure 屬性時使用。
名稱以 __Http- 或 __Host-Http- 為字首的 Cookie 只能在安全 (HTTPS) 源設定 Secure 屬性時使用,並且必須設定 HttpOnly 屬性以證明它們是透過 Set-Cookie 標頭設定的,而不是透過 JavaScript 在客戶端設定的。
此外,帶有 __Host- 或 __Host-Http- 字首的 cookie 必須具有 / 路徑(表示主機上的任何路徑),並且不得具有 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- 字首,以使它們繫結到主機名而不是可註冊域。
規範
| 規範 |
|---|
| HTTP 狀態管理機制 # sane-set-cookie |
瀏覽器相容性
載入中…
另見
- HTTP cookie
CookieDocument.cookie- Samesite cookie 解釋 (web.dev 部落格)