SameSite Cookie 說明

Browser Support

  • 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,這些功能一律位於初始導覽後方,例如變更密碼或購物,但對於 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 確保意圖明確。

三個 Cookie,標籤分別為「無」、「寬鬆」或「嚴格」,視脈絡而定
將 Cookie 的內容明確標示為 NoneLaxStrict

沒有 SameSite 時的預設行為變更

Browser Support

  • Chrome: 80.
  • Edge: 86.
  • Firefox: behind a flag.
  • Safari: not supported.

SameSite 屬性廣受支援,但尚未普及。 過去,如果設定 Cookie 時未指定 SameSite,系統預設會在所有情境中傳送 Cookie,導致使用者容易遭受 CSRF 攻擊,或發生資訊外洩。為鼓勵開發人員聲明意圖,並為使用者提供更安全的體驗,IETF 提案「Incrementally Better Cookies」列出兩項重大變更:

  • 沒有 SameSite 屬性的 Cookie 會被視為 SameSite=Lax
  • 含有 SameSite=None 的 Cookie 也必須指定 Secure,也就是需要安全環境。

這兩項變更都可回溯相容於正確實作舊版 SameSite 屬性的瀏覽器,以及不支援舊版 SameSite 的瀏覽器。這項屬性可明確指出 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 以上版本中的這項行為,請在 about:config 中設定 network.cookie.sameSite.noneRequiresSecure

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

如要進一步瞭解如何更新 Cookie,順利處理 SameSite=None 的這些異動和瀏覽器行為差異,請參閱後續文章「SameSite Cookie 做法」。

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

Cookie 主頁橫幅圖片,由 Pille-Riin PriskeUnsplash 上提供