狀態分割槽
狀態分割槽 是 Mozilla 的一項廣泛舉措,旨在重新設計 Firefox 如何管理客戶端狀態(即瀏覽器中儲存的資料),以減輕網站濫用狀態進行跨站點跟蹤的能力,例如透過 第三方 cookie。
這項工作旨在透過為使用者訪問的每個網站提供一個分割槽儲存位置來實現。本文概述了該機制,列出了受影響的 API,並解釋瞭如何除錯受影響的站點。
從 Firefox 103 開始,狀態分割槽預設開啟。
動機
使用共享狀態進行跨站點跟蹤
瀏覽器傳統上透過資源載入來源的域(或有時是可註冊域)來鍵合客戶端狀態。例如,從 https://example.com/hello.html 載入的 iframe 可用的 cookie、localStorage 物件和快取將由 example.com 鍵合。無論瀏覽器當前是否以第一方資源或嵌入的第三方資源載入該域的資源,都是如此。跟蹤器利用這種跨站點狀態來儲存使用者識別符號並在網站之間訪問它們。下面的示例顯示了 example.com 如何利用其跨站點狀態(在本例中為 cookie)來跟蹤使用者在其自己的網站以及 A.example 和 B.example。

過去阻止跨站點跟蹤的方法
Firefox 過去針對 cookie 的策略試圖透過在某些條件下阻止訪問某些儲存 API(例如 cookie 和 localStorage)來緩解跟蹤。例如,我們的“阻止所有第三方 cookie”策略將阻止所有域在第三方上下文中載入時訪問某些儲存 API。我們當前的 預設 cookie 策略僅針對被歸類為跟蹤器的域在第三方上下文中阻止訪問。
狀態分割槽
狀態分割槽是防止跨站點跟蹤的一種不同方法。Firefox 沒有在第三方上下文中阻止對某些有狀態 API 的訪問,而是為每個頂級網站提供的嵌入式資源提供獨立的儲存桶。更具體地說,Firefox 透過載入資源的源和頂級站點對所有客戶端狀態進行雙重鍵合。在大多數情況下,頂級站點是使用者訪問的頂級頁面的方案和 eTLD+1。
在下面的示例中,example.com 被嵌入到 A.example 和 B.example 中。但是,由於儲存已分割槽,因此有三個不同的儲存桶(而不是一個)。跟蹤器仍然可以訪問儲存,但由於每個儲存桶都在頂級站點下進行了額外的鍵合,因此它在 A 上可以訪問的資料與在 B 上可以訪問的資料不同。這將阻止跟蹤器在直接訪問時在其 cookie 中儲存識別符號,然後在嵌入到其他網站時檢索該識別符號。

標準化
隱私社群小組有一個針對 客戶端儲存分割槽的工作項。這提供了對各個受影響的標準中儲存分割槽標準化工作的概述。隨著工作項的標準化,我們打算將我們的狀態分割槽實現與之保持一致。
Firefox 中分割槽的狀態
靜態分割槽
儲存分割槽
為了防止 JavaScript 可訪問的儲存 API 被用於跨站點跟蹤,可訪問的儲存按頂級站點進行分割槽。此機制意味著,一般來說,嵌入在一個頂級站點中的第三方無法訪問在另一個頂級站點下儲存的資料。
儲存 API
網路分割槽
網路相關 API 的設計目的不是供網站儲存資料,但它們可能被濫用進行跨站點跟蹤。因此,以下網路 API 和快取將由頂級站點永久分割槽。
注意:網路分割槽是永久性的。網站無法控制或放寬這些限制。
網路 API
動態分割槽
通常,如果可訪問儲存按頂級站點進行分割槽,則可以透過儲存訪問 API 授予對第三方未分割槽 cookie 的訪問許可權,前提是支援該 API。
- 使用 儲存訪問 API。
- 自動授予,例如,為提供聯合登入的第三方。
有關自動授予的詳細資訊,請參閱儲存訪問啟發式部分。
動態分割槽 API
儲存訪問啟發式
為了提高 Web 相容性,Firefox 目前包含一些啟發式方法,可以自動授予在第三方接收使用者互動時訪問 cookie 的許可權。這些啟發式方法旨在允許 Web 上常見的某些第三方整合繼續正常工作。
警告:儲存訪問啟發式是一種過渡性功能,旨在防止網站中斷。不應將其用於當前和未來的 Web 開發。
開啟者啟發式
當一個分割槽化的第三方開啟一個具有開啟者訪問許可權的彈出視窗,並且使用者與該彈出視窗互動時,該第三方將獲得對其嵌入方的儲存訪問許可權,有效期為 30 天。
導航啟發式
假設託管在 a.example 的站點在一個視窗中將使用者導航到 b.example,使用者與 b.example 互動,然後迅速導航回 a.example。在這種情況下,b.example 將獲得作為 a.example 上的第三方 30 天的儲存訪問許可權。
Storage Access API
第三方框架可以使用 document.requestStorageAccess 透過 儲存訪問 API 請求未分割槽 cookie 的訪問許可權。一旦授予,請求方將能夠訪問其所有第一方 cookie(即,如果作為第一方訪問,它們將能夠訪問的 cookie)。
警告:授予儲存訪問許可權時,仍可能存在對分割槽儲存的引用。但是,網站不應依賴於同時使用分割槽和未分割槽 cookie。
除錯
我們鼓勵網站所有者測試他們的網站,特別是那些依賴第三方內容整合的網站。Firefox 中有幾項功能可以使測試更容易。
日誌記錄
以下是與第三方上下文中的儲存互動時記錄到 Web 控制檯的訊息概述。在以下示例中,a.example 是嵌入第三方框架 b.example 的頂級站點。
| 原因 | 控制檯訊息 |
|---|---|
| 第三方框架的儲存已分割槽 | 已向“b.example”提供分割槽 cookie 或儲存訪問許可權,因為它是在第三方上下文中載入的,並且啟用了儲存分割槽。 |
| 透過 儲存訪問啟發式授予對未分割槽 cookie 的訪問許可權 | 已自動為“a.example”上的“b.example”授予第一方隔離儲存訪問許可權。 |
| 透過 StorageAccessAPI 授予對未分割槽 cookie 的訪問許可權 | 已授予對“a.example”上的“b.example”源的儲存訪問許可權。 |
清除第三方儲存訪問
如果第三方 iframe 被授予對父上下文的儲存訪問許可權,Firefox 會設定一個許可權。要撤銷訪問,您可以透過“跨站點 Cookie”下的許可權部分的站點資訊面板清除許可權。
測試首選項
警告:請務必在單獨的 Firefox 配置檔案中設定這些首選項,或在測試後將其重置。
停用 Web 相容性功能
將 privacy.antitracking.enableWebcompat 設定為 false 將停用所有 ETP 和狀態分割槽 Web 相容性功能。停用這些功能可能有助於測試,以確保您的網站與 Firefox 中的狀態分割槽機制完全相容,並且不依賴於臨時啟發式。
此首選項停用的功能包括:
- 儲存訪問啟發式:只能透過儲存訪問 API 獲取對 cookie 的未分割槽訪問。
- 自動儲存訪問授予:document.requestStorageAccess 將始終提示使用者。
- SmartBlock 的“選擇加入後解鎖”功能,當用戶與之互動時,允許某些跟蹤器。SmartBlock 的“選擇加入後解鎖”功能,它會在使用者與某些跟蹤器互動時允許它們。
- 透過跳過列表機制授予網站的任何臨時反跟蹤例外。
停用啟發式
以下首選項可用於透過配置編輯器停用單個儲存訪問啟發式
- 啟用/停用導航啟發式:
privacy.restrict3rdpartystorage.heuristic.navigation - 啟用/停用開啟者啟發式:
privacy.restrict3rdpartystorage.heuristic.opened_window_after_interaction
停用網路分割槽
可以使用 privacy.partition.network_state 首選項停用網路分割槽。
停用動態狀態分割槽
要為所有站點停用動態儲存分割槽,可以使用 network.cookie.cookieBehavior 首選項
| 值 | 描述 |
|---|---|
| 5 | 分割槽第三方儲存。 |
| 4 | 拒絕跟蹤器(儲存分割槽已停用)。 |
| 0 | 允許所有儲存(儲存分割槽已停用)。 |
此首選項的其他值可能會完全停用第三方儲存。
豁免特定源進行分割槽
還可以使用 privacy.restrict3rdpartystorage.skip_list 首選項為特定源停用動態狀態分割槽。此首選項包含要豁免的源的逗號分隔列表。首選項值應遵循以下格式:first-party_origin_1,third-party_origin_1;first-party_origin_2,third-party_origin_2;...。
例如,要在 example.com 上的 tracker.example 或 news.example 上的 social.example 上停用分割槽,您可以將首選項設定為以下值
https://example.com,https://tracker.example;https://news.example,https://social.example
您可以使用 * 作為第一個或第三方的萬用字元。例如,要在所有站點上停用 videos.example 的分割槽,或者在 unpartitioned.example 上停用所有分割槽,您可以將首選項設定為以下值
*,https://videos.example;unpartitioned.example,*