Set-Cookie

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

警告:根據 Fetch 規範的要求,瀏覽器阻止前端 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> 可以包含除以下字元之外的任何 US-ASCII 字元:控制字元(ASCII 字元 0 到 31 和 ASCII 字元 127)或分隔符(空格、製表符和以下字元:( ) < > @ , ; : \ " / [ ] ? = { }

<cookie-value> 可以選擇用雙引號括起來,幷包含任何 US-ASCII 字元,但不包括控制字元(ASCII 字元 0 到 31 和 ASCII 字元 127)、空白、雙引號、逗號、分號和反斜槓。

編碼:許多實現對 cookie 值執行 百分比編碼。但是,RFC 規範不要求這樣做。百分比編碼確實有助於滿足對 <cookie-value> 允許字元的要求。

注意:某些 <cookie-name> 具有特定語義

__Secure- 字首:名稱以 __Secure-(破折號是字首的一部分)開頭的 cookie 必須從安全頁面(HTTPS)設定,並帶有 secure 標誌。

__Host- 字首:名稱以 __Host- 開頭的 cookie 僅傳送到設定它們的宿主子域或域,而不是傳送到任何其他宿主。它們必須設定 secure 標誌,必須來自安全頁面(HTTPS),不得指定域,並且路徑必須為 /

Domain=<domain-value> 可選

定義將傳送 cookie 的宿主。

只有當前域可以設定為值,或者更高階的域可以設定為值,除非它是公共字尾。設定域將使 cookie 對其及其所有子域可用。

如果省略,此屬性預設為當前文件 URL 的宿主,不包括子域。

與之前的規範相反,域名前面的點(.example.com)會被忽略。

不允許使用多個宿主/域值,但是如果確實指定了域,則始終包含子域。

Expires=<date> 可選

將 cookie 的最大生存期指示為 HTTP 日期時間戳。有關所需格式,請參閱 Date

如果未指定,cookie 將變為 會話 cookie。會話在客戶端關閉後結束,之後會刪除會話 cookie。

警告:許多 Web 瀏覽器具有 會話恢復 功能,該功能將儲存所有選項卡並在下次使用瀏覽器時恢復它們。會話 cookie 也將被恢復,就好像瀏覽器從未關閉一樣。

當設定 Expires 日期時,截止日期是相對於設定 cookie 的 客戶端 而言的,而不是相對於伺服器而言的。

HttpOnly 可選

禁止 JavaScript 訪問 cookie,例如,透過 Document.cookie 屬性。請注意,使用 HttpOnly 建立的 cookie 仍然會隨 JavaScript 啟動的請求一起傳送,例如,當呼叫 XMLHttpRequest.send()fetch() 時。這可以減輕針對跨站點指令碼 (XSS) 的攻擊。

Max-Age=<number> 可選

指示 cookie 到期之前的秒數。零或負數將立即使 cookie 到期。如果同時設定了 ExpiresMax-Age,則 Max-Age 優先。

Partitioned 可選 Experimental

指示應使用分割槽儲存來儲存 cookie。有關更多詳細資訊,請參閱 具有獨立分割槽狀態的 Cookie (CHIPS)

Path=<path-value> 可選

指示瀏覽器傳送 Cookie 頭時請求 URL 中必須存在的路徑。

正斜槓 (/) 字元被解釋為目錄分隔符,並且還會匹配子目錄。例如,對於 Path=/docs

  • 請求路徑 /docs/docs//docs/Web//docs/Web/HTTP 將全部匹配。
  • 請求路徑 //docsets/en-US/docs 將不匹配。
SameSite=<samesite-value> 可選

控制 cookie 是否隨跨站點請求傳送,從而提供對跨站點請求偽造攻擊 (CSRF) 的一定程度的保護。

可能的屬性值為

嚴格

表示瀏覽器僅針對同站點請求傳送 cookie,即源自設定 cookie 的同一站點的請求。如果請求源自不同的域或方案(即使具有相同的域),則不會發送帶有 SameSite=Strict 屬性的 cookie。

鬆散

表示 cookie 不會在跨站點請求中傳送,例如,在載入影像或框架的請求中不會發送,但在使用者從外部站點導航到源站點時會發送(例如,當跟隨連結時)。如果未指定 SameSite 屬性,則這是預設行為。

表示瀏覽器隨跨站點請求和同站點請求一起傳送 cookie。設定此值時,還必須設定 Secure 屬性,例如 SameSite=None; Secure。如果缺少 Secure,則會記錄錯誤

Cookie "myCookie" rejected because it has the "SameSite=None" attribute but is missing the "secure" attribute.

This Set-Cookie was blocked because it had the "SameSite=None" attribute but did not have the "Secure" attribute, which is required in order to use "SameSite=None".

注意:Secure cookie 僅在透過 HTTPS 協議進行加密請求時才傳送到伺服器。請注意,不安全的站點 (http:) 無法設定帶有 Secure 指令的 cookie,因此無法使用 SameSite=None

警告:將來版本的瀏覽器可能會阻止在跨站點上下文中設定了 SameSite=None; Secure 但沒有設定 Partitioned 屬性的 cookie。此行為保護使用者資料免受跨站點跟蹤。請參閱 具有獨立分割槽狀態的 Cookie (CHIPS)第三方 cookie

Secure 可選

表示僅當使用 https: 方案進行請求時才將 cookie 傳送到伺服器(除了在本地主機上),因此,它對 中間人 攻擊更具抵抗力。

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

不安全的站點 (http:) 無法設定帶有 Secure 屬性的 cookie(從 Chrome 52 和 Firefox 52 開始)。當本地主機設定 Secure 屬性時,會忽略 https: 要求(從 Chrome 89 和 Firefox 75 開始)。

示例

會話 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,使用者代理應拒絕

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

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

對於服務域的子域的 cookie 將被拒絕。

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

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

僅當從安全 (HTTPS) 源設定帶有 secure 屬性時,才能使用以 __Secure-__Host- 為字首的 cookie 名稱。

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

警告:對於沒有實現 cookie 字首的客戶端,您不能依賴這些額外的保證,並且始終會接受帶字首的 cookie。

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

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

規範

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

瀏覽器相容性

BCD 表格只能在瀏覽器中載入

相容性說明

  • 從 Chrome 52 和 Firefox 52 開始,不安全的網站 (http:) 無法再使用 Secure 屬性設定 cookie。

另請參閱