允許開發人員將 Cookie 設為「已分割」儲存空間,每個頂層網站都有各自的 Cookie 罐。
導入狀態
- Chrome 114 以上版本預設支援這項功能。
- 來源試用目前已在 Chrome 100 至 116 推出,現在已經結束。
- 參閱「從實驗意圖」和「意圖:出貨」這兩篇文章。
什麼是 CHIPS?
具有獨立分區狀態的 Cookie (CHIPS) 可讓開發人員選擇將 Cookie 儲存在分區儲存空間中,每個頂層網站都有各自的 Cookie 罐,進而提升使用者隱私權和安全性。
如果沒有分割,第三方 Cookie 就能讓服務追蹤使用者,並合併來自許多不相關頂層網站的資訊。這就是所謂的跨網站追蹤。
封鎖第三方 Cookie 後,只有 CHIPS、Storage Access API 和相關網站集合,才能在跨網站環境 (例如 iframe) 中讀取及寫入 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 時,如果使用者造訪網站 A,且網站 C 的嵌入內容設定了具有 Partitioned 屬性的 Cookie,系統就會將該 Cookie 儲存在專為網站 C 設定的 Cookie 指定的分割罐中。只有在頂層網站為 A 時,瀏覽器才會傳送該 Cookie。
舉例來說,當使用者造訪新網站 (例如網站 B) 時,嵌入的 C 框架不會收到 C 嵌入網站 A 時設定的 Cookie。
如果使用者以頂層網站身分造訪網站 C,系統也不會傳送 C 嵌入 A 時設定的分區 Cookie。

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

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 的網站主機名稱或網域為鍵,也就是 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 前後的樣子。

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。

必要條件
- Chrome 118 以上版本。
- 前往
chrome://flags/#test-third-party-cookie-phaseout
並啟用這項設定
使用開發人員工具檢查分區 Cookie
- 前往 https://chips-site-a.glitch.me。
- 按下
Control+Shift+J
鍵 (Mac 上為Command+Option+J
鍵) 開啟開發人員工具。 - 按一下「應用程式」分頁標籤。
- 依序前往「Application」>「Storage」>「Cookies」。
- 按一下「
https://chips-site-b.glitch.me
」。
開發人員工具會顯示所選來源的所有 Cookie。

網站 B 只能在跨網站環境中設定分割 Cookie,系統會封鎖未分割的 Cookie:
- 您應該會看到
__Host-partitioned-cookie
,其中包含頂層網站的分割區金鑰https://chips-site-a.glitch.me
。

- 按一下「前往網站 B」。
- 在開發人員工具中,依序前往「應用程式」>「儲存空間」>「Cookie」。
- 按一下「
https://chips-site-b.glitch.me
」。

在這種情況下,由於您位於頂層環境中的網站 B,因此可以設定及存取下列兩種 Cookie:
unpartitioned-cookie
的分區索引鍵為空白。__Host-partitioned-cookie
Cookie 具有分區索引鍵https://chips-site-b.glitch.me
。

如果您返回網站 A,瀏覽器現在會儲存 unpartitioned-cookie
,但網站 A 無法存取該值。
- 按一下「前往網站 A」。
- 按一下 [網路] 分頁標籤。
- 按一下「
https://chips-site-b.glitch.me
」。 - 按一下「Cookie」分頁標籤。
在網站 A 上,您應該會看到 __Host-partitioned-cookie
,其中包含頂層網站的分割區金鑰 https://chips-site-a.glitch.me
。

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

在「Application」>「Storage」>「Cookies」中,按一下 https://chips-site-b.glitch.me
會顯示:
unpartitioned-cookie
,並將分區鍵留空。__Host-partitioned-cookie
Cookie,並提供分區鍵https://chips-site-a.glitch.me
。

__Host-partitioned-cookie
Cookie 具有分區索引鍵 https://chips-site-a.glitch.me
。unpartitioned-cookie
,但當 iframe 嵌入網站 A 時,網站 B iframe 無法存取該物件。清除 Cookie
如要重設示範內容,請清除網站的所有 Cookie:
- 按下
Control+Shift+J
鍵 (Mac 上為Command+Option+J
鍵) 開啟開發人員工具。 - 按一下「應用程式」分頁標籤。
- 依序前往「Application」>「Storage」>「Cookies」。
- 在
https://chips-site-b.glitch.me
上按一下滑鼠右鍵。 - 按一下「清除」。
資源
- GitHub:閱讀說明、提出問題並追蹤討論。
- 開發人員支援:在 Privacy Sandbox 開發人員支援存放區提問及參與討論。