SameSite Cookie 說明

瀏覽器支援

  • Chrome:51.
  • Edge:16.
  • Firefox:60。
  • Safari:13.

資料來源

每個 Cookie 都包含一個鍵/值組合,以及一些 控制 Cookie 的使用時間和位置

引進 SameSite 屬性 (定義請見 RFC6265bis)。 可讓您宣告 Cookie 是否僅限第一方 相同的網站內容。最好能清楚瞭解什麼是「網站」代表。 網站結合了網域字尾和網域部分 。例如,www.web.dev 網域是 web.dev 網站的一部分。

重要字詞:如果使用者位於 www.web.dev,並要求取得圖片 static.web.dev,回應為相同網站的要求。

公開後置字元清單定義了計為何種網頁 在同一個網站上不單純仰賴頂層網域 (例如 .com), 但也可能包含 github.io 等服務這樣一來, your-project.github.iomy-project.github.io:將系統視為個別網站。

重要字詞:如果使用者位於 your-project.github.io,並要求取得圖片 my-project.github.io,這是跨網站的請求。

使用 SameSite 屬性宣告 Cookie 的用途

Cookie 上的 SameSite 屬性提供三種不同的控制方式 也就是行為您可以選擇不指定屬性,也可以使用 StrictLax:將 Cookie 限制為相同網站要求。

如果將 SameSite 設為 Strict,Cookie 就只能在 第一方情境;也就是說,如果 Cookie 的網站與顯示的網站相符 。因此,如果 promo_shown Cookie 的設定如下:

Set-Cookie: promo_shown=1; SameSite=Strict

當使用者造訪您的網站時,系統會如常傳送 Cookie 與請求。 不過,如果使用者透過其他連結連至你的網站,Cookie 就會是 Cookie 不會在初始要求中傳送 如果 Cookie 必須與初始功能相關 例如變更密碼或購物等等 限制使用 (例如 promo_shown)。如果讀者追蹤連結 導入網站時,他們希望系統能傳送 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 顯示,以及與 Strict 使用者動作相關的 Cookie。

您也可以將 SameSite 設為 None,表示希望使用 Cookie 會在所有情況下傳送如果您提供其他網站使用的服務,例如 小工具、嵌入內容、聯盟計畫、廣告 有多個網站,請使用 None 確保意圖清楚易懂。

三個標示為「無」、「寬鬆」或「嚴格」的餅乾 (依個別內容而有不同)
明確將 Cookie 的內容標示為 NoneLaxStrict

變更不使用 SameSite 時的預設行為

瀏覽器支援

  • Chrome:80。
  • Edge:86,
  • Firefox:位於旗幟後方。
  • Safari:不支援。

SameSite 屬性受到廣泛支援,但目前尚未廣泛採用。 過去,如果在不含 SameSite 的情況下設定 Cookie,系統將根據預設,將 Cookie 傳送至 導致使用者容易受到 CSRF 攻擊和無意間使用 資訊外洩鼓勵開發人員說明自己的意圖 進而為使用者提供更安全的體驗、IETF 提案 Cookie 成效提升 列出兩項主要變更:

  • 不含 SameSite 屬性的 Cookie 會視為 SameSite=Lax
  • 使用 SameSite=None 的 Cookie 也必須指定 Secure,表示需要 而非安全內容

以下兩項變更皆可與使用以下功能的瀏覽器回溯相容: 導入了舊版 SameSite 屬性,以及 不支援舊版 SameSite 的瀏覽器。這個 API 能用來 減少開發人員仰賴瀏覽器取得 Cookie 的預設行為 或明確預期的用途任何無法辨識的用戶端 SameSite=None 應忽略此訊息。

預設使用SameSite=Lax

如果您傳送 Cookie 時未指定 SameSite 屬性,瀏覽器 系統會將該 Cookie 視為設為 SameSite=Lax。我們仍建議 明確設定 SameSite=Lax 以提供更一致的使用者體驗 。

必須確保「SameSite=None」安全無虞

使用 SameSite=None 建立跨網站 Cookie 時,也必須一併設定 Cookie 傳送至 Secure,以便瀏覽器接受:

Set-Cookie: widget_session=abc123; SameSite=None; Secure

如要測試自 Chrome 76 起的這項行為,請啟用 about://flags/#cookies-without-same-site-must-be-secure和 Firefox 69 將「network.cookie.sameSite.noneRequiresSecure」設為 about:config

此外,我們也建議您盡快將現有的 Cookie 更新為 Secure。 如果你仰賴的服務在網站上提供第三方內容,請務必確認 您的服務供應商更新他們的 Cookie,並更新任何程式碼片段或 務必要依賴新行為。

如需更新 Cookie 才能順利處理問題的詳細資訊 變更 SameSite=None 以及瀏覽器行為的差異,請參閱 後續文章:「SameSite Cookie 食譜」。

感謝 Lily Chen、Malte Ubl 和 Mike 的貢獻和意見回饋 West、Rob Dodson、Tom Steiner 和 Vivek Sekhar。

Cookie 主頁橫幅 皮爾萊因普萊斯克禁用