Set-Cookie 頭

Baseline 廣泛可用 *

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

* 此特性的某些部分可能存在不同級別的支援。

HTTP Set-Cookie 響應頭用於從伺服器向用戶代理傳送一個 cookie,以便使用者代理以後可以將其傳送回伺服器。要傳送多個 cookie,應在同一個響應中傳送多個 Set-Cookie 頭。

警告: 瀏覽器禁止前端 JavaScript 程式碼訪問 Set-Cookie 頭,這是 Fetch 規範所要求的,該規範將 Set-Cookie 定義為禁止響應頭名稱必須從暴露給前端程式碼的任何響應中過濾掉

Fetch APIXMLHttpRequest API 請求使用 CORS 時,除非請求包含憑據,否則瀏覽器將忽略伺服器響應中存在的 Set-Cookie 頭。請訪問使用 Fetch API - 包含憑據XMLHttpRequest 文章以瞭解如何包含憑據。

有關更多資訊,請參閱使用 HTTP cookie 指南。

頭型別 響應頭
禁止請求頭
禁止響應頭名稱

語法

http
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 過期。如果同時設定了 ExpiresMax-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 發生變化。

    • 這排除了例如使用 fetch() API 發出的請求,或來自 <img><script> 元素的子資源請求,或 <iframe> 元素內部的導航。

    • 它包括使用者在頂級瀏覽上下文中從一個站點點選連結到另一個站點時發出的請求,或對 document.location 的賦值,或 <form> 提交。

  • 請求使用安全方法:特別是,這排除了 POSTPUTDELETE

如果未指定 SameSite,某些瀏覽器將 Lax 用作預設值:請參閱瀏覽器相容性以瞭解詳細資訊。

注意:Lax 作為預設值應用時,將使用更寬鬆的版本。在此更寬鬆的版本中,cookie 也包含在 POST 請求中,只要它們在請求發出前不超過兩分鐘設定。

None

隨跨站和同站請求傳送 cookie。使用此值時,Secure 屬性也必須設定。

Secure 可選

指示僅當請求使用 https: 方案(localhost 除外)時才將 cookie 傳送到伺服器,因此更能抵抗中間人攻擊。

注意: 不要假設 Secure 可以防止所有對 cookie 中敏感資訊(會話金鑰、登入詳細資訊等)的訪問。如果未設定 HttpOnly cookie 屬性,具有此屬性的 cookie 仍然可以透過訪問客戶端硬碟或透過 JavaScript 進行讀取/修改。

不安全的站點(http:)不能設定具有 Secure 屬性的 cookie。當由 localhost 設定 Secure 屬性時,https: 要求將被忽略。

某些 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.cookieCookie Store API)設定或修改)。
  • __Host-Http-:名稱以 __Host-Http- 開頭的 cookie 必須由安全頁面 (HTTPS) 設定 Secure 標誌,並且必須設定 HttpOnly 屬性以證明它們是透過 Set-Cookie 頭設定的。此外,它們還具有與 __Host- 字首 cookie 相同的限制。這種組合產生了一個儘可能接近將來源視為安全邊界的 cookie,同時確保開發人員和伺服器操作員知道其範圍僅限於 HTTP 請求。

警告: 您不能指望在不支援 cookie 字首的瀏覽器上獲得這些額外的保證;在這種情況下,帶字首的 cookie 將始終被接受。

示例

會話 cookie 在客戶端關閉時移除。如果未指定 ExpiresMax-Age 屬性,則 cookie 是會話 cookie。

http
Set-Cookie: sessionId=38afes7a8

永久 cookie 在特定日期 (Expires) 或特定時間長度 (Max-Age) 後移除,而不是在客戶端關閉時移除。

http
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
http
Set-Cookie: id=a3fWa; Max-Age=2592000

無效域

使用者代理應該拒絕不包含設定它的伺服器的域的 cookie。

如果由託管在 original-company.com 上的伺服器設定,以下 cookie 將被拒絕

http
Set-Cookie: qwerty=219ffwef9w0f; Domain=some-company.co.uk

將拒絕為服務域的子域設定的 cookie。

如果由託管在 example.com 上的伺服器設定,以下 cookie 將被拒絕

http
Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com

名稱以 __Secure-__Host- 為字首的 Cookie 只能在安全 (HTTPS) 源設定 Secure 屬性時使用。

名稱以 __Http-__Host-Http- 為字首的 Cookie 只能在安全 (HTTPS) 源設定 Secure 屬性時使用,並且必須設定 HttpOnly 屬性以證明它們是透過 Set-Cookie 標頭設定的,而不是透過 JavaScript 在客戶端設定的。

此外,帶有 __Host-__Host-Http- 字首的 cookie 必須具有 / 路徑(表示主機上的任何路徑),並且不得具有 Domain 屬性。

http
// 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=/
http
Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;

注意: 分割槽 cookie 必須使用 Secure 設定。此外,建議在設定分割槽 cookie 時使用 __Host__Host-Http- 字首,以使它們繫結到主機名而不是可註冊域。

規範

規範
HTTP 狀態管理機制
# sane-set-cookie

瀏覽器相容性

另見