Cookie 具有獨立分區狀態 (CHIPS)

允許開發人員將 Cookie 設為「已分割」儲存空間,每個頂層網站都有各自的 Cookie 罐。

導入狀態

Browser Support

  • Chrome: 114.
  • Edge: 114.
  • Firefox: 141.
  • Safari: not supported.

Source

什麼是 CHIPS?

具有獨立分區狀態的 Cookie (CHIPS) 可讓開發人員選擇將 Cookie 儲存在分區儲存空間中,每個頂層網站都有各自的 Cookie 罐,進而提升使用者隱私權和安全性。

如果沒有分割,第三方 Cookie 就能讓服務追蹤使用者,並合併來自許多不相關頂層網站的資訊。這就是所謂的跨網站追蹤。

封鎖第三方 Cookie 後,只有 CHIPS、Storage Access API相關網站集合,才能在跨網站環境 (例如 iframe) 中讀取及寫入 Cookie。

圖表:顯示兩個不同網站如何共用 Cookie。
如果沒有 Cookie 分區,第三方服務在嵌入某個頂層網站時可以設定 Cookie,並在嵌入其他頂層網站時存取該 Cookie。

CHIPS 導入新的 Cookie 屬性 Partitioned,支援依頂層環境分區的跨網站 Cookie。

Set-Cookie 標頭:

Set-Cookie: __Host-name=value; Secure; Path=/; SameSite=None; Partitioned;

JavaScript:

document.cookie="__Host-name=value; Secure; Path=/; SameSite=None; Partitioned;"

分割的第三方 Cookie 會與最初設定的頂層網站建立關聯,無法從其他位置存取。這樣一來,第三方服務設定的 Cookie 就只能在頂層網站的相同嵌入式環境中讀取。

這張圖表顯示,兩個嵌入相同第三方的不同網站,將不再共用該第三方的 Cookie。
透過 Cookie 分區,嵌入某個頂層網站時設定的第三方服務 Cookie,在嵌入其他頂層網站時無法存取。

使用分割 Cookie 時,如果使用者造訪網站 A,且網站 C 的嵌入內容設定了具有 Partitioned 屬性的 Cookie,系統就會將該 Cookie 儲存在專為網站 C 設定的 Cookie 指定的分割罐中。只有在頂層網站為 A 時,瀏覽器才會傳送該 Cookie。

舉例來說,當使用者造訪新網站 (例如網站 B) 時,嵌入的 C 框架不會收到 C 嵌入網站 A 時設定的 Cookie。

如果使用者以頂層網站身分造訪網站 C,系統也不會傳送 C 嵌入 A 時設定的分區 Cookie。

圖表:顯示在兩個不同網站上嵌入相同的第三方時,系統不會共用 Cookie。
啟用 Cookie 分割後,嵌入網站時設定 Cookie 的第三方服務,即使使用者將該服務視為頂層網站造訪,也無法存取該 Cookie。

用途

舉例來說,網站 retail.example 可能想與第三方服務 support.chat.example 合作,在網站上嵌入支援即時通訊方塊。目前許多可嵌入的即時通訊服務都依賴 Cookie 來儲存狀態。

圖表:顯示內嵌即時通訊小工具的網站
頂層網站 retail.example 嵌入第三方服務 support.chat.example

如果無法設定跨網站 Cookie,support.chat.example 就必須尋找替代方法 (通常較為複雜) 來儲存狀態。或者,必須將其嵌入頂層網頁,但這會帶來風險,因為這樣一來,support.chat.example 指令碼就能在 retail.example 上取得進階權限,例如存取驗證 Cookie 的權限。

CHIPS 提供更簡單的選項,讓您繼續使用跨網站 Cookie,且不會有未經分割的 Cookie 相關風險。

CHIPS 的適用情境包括:跨網站子資源需要某種工作階段或持續性狀態的概念,且該狀態的範圍僅限於使用者在單一頂層網站上的活動,例如:

  • 嵌入第三方即時通訊
  • 嵌入第三方地圖
  • 嵌入第三方付款服務
  • 子資源 CDN 負載平衡
  • 無頭 CMS 供應商
  • 用於提供不受信任使用者內容的沙箱網域 (例如 googleusercontent.com 和 githubusercontent.com)
  • 使用 Cookie 放送內容的第三方 CDN,而這些內容的存取權是由第一方網站的驗證狀態控管 (例如,社群媒體網站上由第三方 CDN 代管的個人資料相片)
  • 前端架構依賴遠端 API,並在要求中使用 Cookie
  • 需要為每個發布商設定狀態範圍的嵌入式廣告 (例如擷取該網站的使用者廣告偏好設定)

為什麼 CHIPS 使用選擇加入的分割模型

如果無法存取未分割的第三方 Cookie,我們也嘗試了其他幾種分割方法。

Firefox 宣布將在 ETP 嚴格模式和私密瀏覽模式中預設分割所有第三方 Cookie,因此所有跨網站 Cookie 都會依頂層網站分割。不過,如果沒有第三方選擇加入,就分割 Cookie,可能會導致非預期的錯誤,因為部分第三方服務已建構伺服器,預期會收到未分割的第三方 Cookie。

Safari 先前曾嘗試根據啟發式方法分割 Cookie,但最終選擇完全封鎖 Cookie,並以開發人員混淆為其中一個原因。最近,Safari 對採用選擇加入模式表示興趣

CHIPS 與現有分割 Cookie 實作方式的不同之處在於,第三方必須選擇加入。淘汰 (未分區) 第三方 Cookie 後,必須使用新屬性設定 Cookie,才能在跨方要求中傳送 Cookie。

雖然第三方 Cookie 仍存在,但 Partitioned 屬性提供選擇加入更嚴格、更安全的 Cookie 行為類型。CHIPS 是重要的一步,有助於服務順利過渡到沒有第三方 Cookie 的未來。

目前,Cookie 是以設定 Cookie 的網站主機名稱或網域為鍵,也就是 Cookie 的主機金鑰

舉例來說,如果是來自 https://support.chat.example 的 Cookie,主機金鑰就是 ("support.chat.example")

在 CHIPS 中,選擇分割的 Cookie 會以主機金鑰和分割區金鑰為雙重索引鍵。

Cookie 的分割區金鑰是網站 (配置和可註冊網域),也就是瀏覽器在要求傳送至設定 Cookie 的端點時,所造訪的頂層網址。

在先前的範例中,https://support.chat.example 嵌入 https://retail.example,因此頂層網址為 https://retail.example

在這種情況下,分割區鍵為 ("https", "retail.example")

同樣地,要求的分區鍵是瀏覽器在要求開始時造訪的頂層網址網站。瀏覽器只能在要求中傳送具有 Partitioned 屬性的 Cookie,且要求必須與該 Cookie 具有相同的分割區金鑰。

以下是範例中 Cookie 金鑰在 CHIPS 前後的樣子。

網站 A 和嵌入的網站 C 共用分區 Cookie。如果未嵌入,網站 C 就無法存取分割的 Cookie。
網站 A 和嵌入的網站 C 共用分區 Cookie。如果未嵌入,網站 C 就無法存取分割區 Cookie。

CHIPS 推出前

key=("support.chat.example")

CHIPS 推出後

key={("support.chat.example"),("https", "retail.example")}

安全設計

為鼓勵採用良好的安全性做法,CHIPS 只會透過安全通訊協定設定及傳送 Cookie。

  • 分區 Cookie 必須使用 Secure 設定。
  • 設定分割 Cookie 時,建議使用 __Host- 前置字串,將 Cookie 繫結至主機名稱 (而非可註冊網域)。

範例:

Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;

CHIPS 的替代方案

Storage Access API 和相關的相關網站集合 (RWS) 是網路平台機制,可針對特定使用者用途,啟用有限的跨網站 Cookie 存取權。

如果需要存取未經分割的跨網站 Cookie,可以使用這些替代方案。

如果服務內嵌於多個相關網站,且您需要讓這些網站都能存取同一個 Cookie,請考慮使用 Storage Access API 和相關網站集合。

CHIPS 可讓服務在多個網站中做為獨立元件運作,不必在多個網站中提供相同的 Cookie。如果服務設定了分割 Cookie,其分割鍵會是頂層網站,而其他也使用該服務的網站無法存取該 Cookie。

相關網站集合設計依賴 Storage Access API,且不會與 CHIPS 分割整合。如果您有用途需要 RWS 內跨網站的共用 Cookie 分區,請在 GitHub 問題中提供範例和意見回饋

示範

這項示範將逐步說明分割區 Cookie 的運作方式,以及如何在開發人員工具中檢查這些 Cookie。

網站 A 嵌入網站 B 的 iframe,並使用 JavaScript 設定兩個 Cookie:分區和未分區 Cookie。網站 B 會使用 document.cookie 顯示可從該位置存取的所有 Cookie。

封鎖第三方 Cookie 後,網站 B 只能在跨網站環境中,設定及存取含有 Partitioned 屬性的 Cookie。

允許第三方 Cookie 時,網站 B 也能設定及存取未分割的 Cookie。

網站 A 和網站 B
左側:第三方 Cookie 已遭封鎖。右側:允許第三方 Cookie。

必要條件

  1. Chrome 118 以上版本。
  2. 前往 chrome://flags/#test-third-party-cookie-phaseout 並啟用這項設定

使用開發人員工具檢查分區 Cookie

  1. 前往 https://chips-site-a.glitch.me
  2. 按下 Control+Shift+J 鍵 (Mac 上為 Command+Option+J 鍵) 開啟開發人員工具。
  3. 按一下「應用程式」分頁標籤。
  4. 依序前往「Application」>「Storage」>「Cookies」
  5. 按一下「https://chips-site-b.glitch.me」。

開發人員工具會顯示所選來源的所有 Cookie。

開發人員工具「應用程式」分頁中的網站 B Cookie。

網站 B 只能在跨網站環境中設定分割 Cookie,系統會封鎖未分割的 Cookie:

  • 您應該會看到 __Host-partitioned-cookie,其中包含頂層網站的分割區金鑰 https://chips-site-a.glitch.me
__Host 分區 Cookie 的分區鍵。
  1. 按一下「前往網站 B」
  2. 在開發人員工具中,依序前往「應用程式」>「儲存空間」>「Cookie」
  3. 按一下「https://chips-site-b.glitch.me」。
地點 B
在頂層,網站 B 可以看到所有 Cookie,包括分區和非分區 Cookie

在這種情況下,由於您位於頂層環境中的網站 B,因此可以設定及存取下列兩種 Cookie:

  • unpartitioned-cookie 的分區索引鍵為空白。
  • __Host-partitioned-cookie Cookie 具有分區索引鍵 https://chips-site-b.glitch.me
在開發人員工具的「應用程式」分頁中,網站 B 的 Cookie (以頂層網站的形式造訪 B 時)。__Host-partitioned-cookie 的分割區金鑰為 https://chips-site-b.glitch.me。

如果您返回網站 A,瀏覽器現在會儲存 unpartitioned-cookie,但網站 A 無法存取該值。

  1. 按一下「前往網站 A」
  2. 按一下 [網路] 分頁標籤。
  3. 按一下「https://chips-site-b.glitch.me」。
  4. 按一下「Cookie」分頁標籤。

在網站 A 上,您應該會看到 __Host-partitioned-cookie,其中包含頂層網站的分割區金鑰 https://chips-site-a.glitch.me

「網路」分頁標籤,顯示從網站 B iframe 存取的 Cookie,這些 Cookie 嵌入網站 A 時可供存取。

如果您勾選「顯示篩除的 Cookie 要求」,開發人員工具會顯示未分區的 Cookie 已遭封鎖,並以黃色醒目顯示,以及顯示工具提示:「這個 Cookie 因使用者偏好設定而遭到封鎖」

「網路」分頁標籤,顯示來自網站 B iframe 的已封鎖 Cookie。

在「Application」>「Storage」>「Cookies」中,按一下 https://chips-site-b.glitch.me 會顯示:

  • unpartitioned-cookie,並將分區鍵留空。
  • __Host-partitioned-cookie Cookie,並提供分區鍵 https://chips-site-a.glitch.me
開發人員工具「應用程式」分頁中的網站 B Cookie。__Host-partitioned-cookie Cookie 具有分區索引鍵 https://chips-site-a.glitch.meunpartitioned-cookie,但當 iframe 嵌入網站 A 時,網站 B iframe 無法存取該物件。

清除 Cookie

如要重設示範內容,請清除網站的所有 Cookie:

  • 按下 Control+Shift+J 鍵 (Mac 上為 Command+Option+J 鍵) 開啟開發人員工具。
  • 按一下「應用程式」分頁標籤。
  • 依序前往「Application」>「Storage」>「Cookies」
  • https://chips-site-b.glitch.me 上按一下滑鼠右鍵。
  • 按一下「清除」

資源