Set-Cookie
Set-Cookie HTTP 響應頭用於從伺服器向用戶代理傳送 cookie,以便使用者代理稍後將其傳送回伺服器。要傳送多個 cookie,應在同一響應中傳送多個 Set-Cookie 頭。
警告:根據 Fetch 規範的要求,瀏覽器阻止前端 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>可以包含除以下字元之外的任何 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 到期。如果同時設定了
Expires和Max-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".
注意:
Securecookie 僅在透過 HTTPS 協議進行加密請求時才傳送到伺服器。請注意,不安全的站點 (http:) 無法設定帶有Secure指令的 cookie,因此無法使用SameSite=None。警告:將來版本的瀏覽器可能會阻止在跨站點上下文中設定了
SameSite=None; Secure但沒有設定Partitioned屬性的 cookie。此行為保護使用者資料免受跨站點跟蹤。請參閱 具有獨立分割槽狀態的 Cookie (CHIPS) 和 第三方 cookie。
Secure可選-
表示僅當使用
https:方案進行請求時才將 cookie 傳送到伺服器(除了在本地主機上),因此,它對 中間人 攻擊更具抵抗力。注意:不要假設
Secure可以阻止對 cookie 中敏感資訊的訪問(會話金鑰、登入詳細資訊等)。如果未設定HttpOnlycookie 屬性,則仍然可以使用對客戶端硬碟的訪問或從 JavaScript 來讀取/修改帶有此屬性的 cookie。不安全的站點 (
http:) 無法設定帶有Secure屬性的 cookie(從 Chrome 52 和 Firefox 52 開始)。當本地主機設定Secure屬性時,會忽略https:要求(從 Chrome 89 和 Firefox 75 開始)。
示例
會話 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,使用者代理應拒絕。
如果由託管在 originalcompany.com 上的伺服器設定,以下 cookie 將被拒絕
Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk
對於服務域的子域的 cookie 將被拒絕。
如果由託管在 example.com 上的伺服器設定,以下 cookie 將被拒絕
Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
cookie 字首
僅當從安全 (HTTPS) 源設定帶有 secure 屬性時,才能使用以 __Secure- 或 __Host- 為字首的 cookie 名稱。
此外,帶有 __Host- 字首的 cookie 必須具有 / 的路徑(表示宿主上的任何路徑),並且不得具有 Domain 屬性。
警告:對於沒有實現 cookie 字首的客戶端,您不能依賴這些額外的保證,並且始終會接受帶字首的 cookie。
// 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
分割槽 cookie
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。
另請參閱
- HTTP Cookie
CookieDocument.cookie- 同站點 Cookie 解釋 (web.dev 部落格)