Browser Support
每個 Cookie 都包含一組鍵/值組合,以及多個屬性,用於控制 Cookie 的使用時機和位置。
導入 SameSite 屬性 (定義於 RFC6265bis) 後,您就能宣告 Cookie 是否僅限於第一方或同網站情境。請務必瞭解這裡所指的「網站」確切含義。網站是網域字尾和緊接在前的網域部分組合而成。舉例來說,www.web.dev 網域是 web.dev 網站的一部分。
重要詞彙:如果使用者位於 www.web.dev,並要求 static.web.dev 的圖片,這就是「同網站」要求。
公開尾碼清單定義了哪些網頁屬於同一個網站。這不只取決於 .com 等頂層網域,也可能包含 github.io 等服務。這樣一來,your-project.github.io 和 my-project.github.io 就會視為不同網站。
重要詞彙:如果使用者在 your-project.github.io 上,並向 my-project.github.io 要求圖片,這就是跨網站要求。
使用 SameSite 屬性宣告 Cookie 用途
Cookie 的 SameSite 屬性提供三種不同的方式來控制這項行為。您可以選擇不指定屬性,也可以使用 Strict 或 Lax,將 Cookie 限制為同網站要求。
如果將 SameSite 設為 Strict,Cookie 只能在第一方情境中傳送,也就是說,Cookie 的網站必須與瀏覽器網址列中顯示的網站相符。因此,如果 promo_shown Cookie 設定如下:
Set-Cookie: promo_shown=1; SameSite=Strict
使用者造訪網站時,Cookie 會如預期隨要求傳送。不過,如果使用者是透過其他網站的連結進入您的網站,系統就不會在初始要求中傳送 Cookie。這適用於與一律在初始導覽後的功能相關的 Cookie,例如變更密碼或購物,但對於 promo_shown 等 Cookie 來說,限制過於嚴格。如果讀者透過連結進入網站,他們會希望傳送 Cookie,以便套用偏好設定。
SameSite=Lax 允許瀏覽器在這些頂層導覽中傳送 Cookie。舉例來說,如果另一個網站引用您網站的內容,在這個例子中,使用您的貓咪相片並提供文章連結,如下所示:
<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>
Cookie 設為 Lax,如下所示:
Set-Cookie: promo_shown=1; SameSite=Lax
當瀏覽器要求其他人的網誌 amazing-cat.png 時,您的網站不會傳送 Cookie。不過,當讀者點選連結前往網站上的 cat.html 時,該要求就會包含 Cookie。
建議您以這種方式使用 SameSite,將影響網站顯示的 Cookie 設為 Lax,並將與使用者動作相關的 Cookie 設為 Strict。
您也可以將 SameSite 設為 None,表示要在所有情境中傳送 Cookie。如果您提供的服務會由其他網站使用,例如小工具、嵌入內容、聯盟計畫、廣告或跨多個網站登入,請使用 None 確保意圖明確。
None、Lax 或 Strict。
未設定 SameSite 時的預設行為異動
Browser Support
SameSite 屬性廣受支援,但尚未廣泛採用。過去,如果設定 Cookie 時未指定 SameSite,系統預設會在所有情境下傳送 Cookie,這會讓使用者容易受到 CSRF 攻擊,並可能導致資訊外洩。為鼓勵開發人員聲明意圖,並為使用者提供更安全的體驗,IETF 提案「逐步改善 Cookie」提出兩項重要變更:
- 沒有
SameSite屬性的 Cookie 會視為SameSite=Lax。 - 含有
SameSite=None的 Cookie 也必須指定Secure,也就是說,這類 Cookie 需要安全情境。
這兩項變更都與瀏覽器回溯相容,無論瀏覽器是否正確實作舊版 SameSite 屬性,或不支援舊版 SameSite,都能正常運作。這些屬性旨在明確指出 Cookie 行為和預期用途,減少開發人員對瀏覽器預設行為的依賴。任何無法辨識 SameSite=None 的用戶端都應忽略該屬性。
預設為SameSite=Lax
如果傳送 Cookie 時未指定 SameSite 屬性,瀏覽器會將該 Cookie 視為設為 SameSite=Lax。我們仍建議明確設定 SameSite=Lax,讓使用者在不同瀏覽器中獲得更一致的體驗。
SameSite=None 必須安全
使用 SameSite=None 建立跨網站 Cookie 時,也必須將其設為 Secure,瀏覽器才會接受:
Set-Cookie: widget_session=abc123; SameSite=None; Secure
如要測試這項行為,請在 Chrome 76 以上版本啟用 about://flags/#cookies-without-same-site-must-be-secure,或在 Firefox 69 以上版本中前往 about:config 設定 network.cookie.sameSite.noneRequiresSecure。
此外,建議您盡快將現有 Cookie 更新為 Secure。如果網站仰賴提供第三方內容的服務,請確認服務供應商已更新 Cookie,並更新網站上的所有程式碼片段或依附元件,確保網站採用新行為。
SameSite 餅乾食譜
如要進一步瞭解如何更新 Cookie,以成功處理 SameSite=None 的這些變更和瀏覽器行為差異,請參閱後續文章「SameSite Cookie 方案」。
感謝 Lily Chen、Malte Ubl、Mike West、Rob Dodson、Tom Steiner 和 Vivek Sekhar 的貢獻和意見回饋。