狀態分割槽

狀態分割槽是 Mozilla 正在進行的一項廣泛努力,旨在重新設計 Firefox 管理客戶端狀態(即儲存在瀏覽器中的資料)的方式,以降低網站利用狀態進行跨站點跟蹤的能力,例如透過 第三方 Cookie

這項努力旨在透過為使用者訪問的每個網站提供一個分割槽儲存位置來實現這一目標。本文概述了該機制,列出了受影響的 API,並說明如何除錯受影響的網站。

狀態分割槽目前在 Firefox Nightly 通道中預設啟用。自 Firefox 85 版本起,狀態分割槽工作的一部分(即 網路分割槽)已在 Firefox 的發行版通道中預設啟用。

動機

使用共享狀態進行跨站點跟蹤

瀏覽器傳統上透過資源載入位置的來源(或有時是可註冊域名)來鍵入客戶端狀態。例如,可用於從 https://example.com/hello.html 載入的 iframe 的 Cookie、localStorage 物件和快取將以 example.com 為鍵。無論瀏覽器當前是以第一方資源還是嵌入的第三方資源的形式載入來自該域的資源,情況都是如此。跟蹤器利用這種跨站點狀態來儲存使用者識別符號並在網站之間訪問它們。下面的示例顯示了 example.com 如何使用其跨站點狀態(在本例中為 Cookie)來跟蹤使用者在其自己的網站以及 A.exampleB.example 上的活動。

An example of cross-site state

過去阻止跨站點跟蹤的方法

Firefox 過去實施的 Cookie 策略試圖透過在特定條件下阻止某些域訪問某些儲存 API(例如,Cookie 和 localStorage)來減輕跟蹤問題。例如,我們的“阻止所有第三方 Cookie”策略會阻止所有域在第三方上下文中訪問某些儲存 API。我們目前的 預設 Cookie 策略 僅在第三方上下文中阻止對分類為跟蹤器的域的訪問。

狀態分割槽

狀態分割槽是防止跨站點跟蹤的一種不同方法。Firefox 不會在第三方上下文中阻止訪問某些有狀態 API,而是為嵌入的資源提供每個頂級網站的獨立儲存桶。更具體地說,Firefox 透過被載入資源的來源頂級網站 來對所有客戶端狀態進行雙重鍵入。在大多數情況下,頂級網站是使用者正在訪問的頂級頁面的方案和 eTLD+1

在下面的示例中,example.com 嵌入在 A.exampleB.example 中。但是,由於儲存已分割槽,因此存在三個獨立的儲存桶(而不是一個)。跟蹤器仍然可以訪問儲存,但由於每個儲存桶都附加了頂級網站的鍵,因此它在 A 上訪問的資料將不同於在 B 上訪問的資料。這將阻止跟蹤器在直接訪問時將其識別符號儲存在 Cookie 中,然後在嵌入在其他網站中時檢索該識別符號。

An example of state partitioning

標準化

隱私社群小組 有一個關於 客戶端儲存分割槽 的工作專案。它概述了各個受影響標準中儲存分割槽的標準化工作。我們打算將我們的狀態分割槽實現與這些工作專案標準化後的結果保持一致。

Firefox 中分割槽的狀態

靜態分割槽

儲存分割槽

為了防止 JavaScript 可訪問的儲存 API 被用於跨站點跟蹤,可訪問的儲存將按頂級網站進行分割槽。這種機制意味著,通常情況下,嵌入在一個頂級網站中的第三方無法訪問儲存在另一個頂級網站下的資料。

儲存 API

網路分割槽

與網路相關的 API 不打算用於網站儲存資料,但它們可能會被 濫用 來進行跨站點跟蹤。因此,以下網路 API 和快取將永久按頂級網站進行分割槽。

注意:網路分割槽是永久性的。網站無法控制或放鬆這些限制。

網路 API

  • HTTP 快取
  • 影像快取
  • 網站圖示快取
  • 連線池
  • 樣式表快取
  • DNS
  • HTTP 身份驗證
  • Alt-Svc
  • 推測連線
  • 字型和字型快取
  • HSTS
  • OCSP
  • 中間 CA 快取
  • TLS 客戶端證書
  • TLS 會話識別符號
  • 預取
  • 預連線
  • CORS 預檢 快取
  • WebRTC 裝置 ID

動態分割槽

通常,如果可訪問的儲存按頂級網站分割槽,則如果支援儲存訪問 API,則仍然可以授予對第三方的未分割槽 Cookie 的訪問許可權

  • 使用 儲存訪問 API
  • 自動授予,例如,為提供聯合登入的第三方授予訪問許可權。

有關自動授予的詳細資訊,請參閱 儲存訪問啟發式 部分。

動態分割槽 API

儲存訪問啟發式

為了提高網頁相容性,Firefox 目前包含一些啟發式方法,用於自動授予未分割槽 Cookie 的訪問許可權給接收使用者互動的第三方。這些啟發式方法旨在允許網頁上常見的某些第三方整合繼續正常執行。

警告:儲存訪問啟發式方法是一種過渡功能,旨在防止網站出現故障。它們不應被用於當前和未來的網頁開發。

開啟者啟發式方法

  • 當一個分割槽後的第三方開啟一個具有 開啟者訪問許可權 的彈出視窗時,該第三方將獲得對其嵌入者的儲存訪問許可權,有效期為 30 天。
  • 當一個第一方 a.example 開啟一個第三方彈出視窗 b.example 時,b.example 將獲得對 a.example 的第三方儲存訪問許可權,有效期為 30 天。

注意:對於濫用這些啟發式方法進行跟蹤目的的第三方,我們可能需要使用者與彈出視窗進行互動,然後才會授予儲存訪問許可權。

重定向啟發式方法

  • 如果網站 b.example 重定向到 a.example,則 b.example 將獲得對其嵌入者 a.example 的儲存訪問許可權,前提是 a.exampleb.example 都在過去 10 分鐘內被訪問過並進行過互動。此儲存訪問許可權將授予 15 分鐘。
  • 如果跟蹤器 tracker.example(由增強型跟蹤保護分類)重定向到非跟蹤器 a.example,並且 tracker.example 在過去 45 天內作為第一方接收過使用者互動,則 tracker.example 將獲得對 a.example 的儲存訪問許可權,有效期為 15 分鐘。

儲存訪問 API

第三方框架可以使用 document.requestStorageAccess 透過 儲存訪問 API 請求對 Cookie 的未分割槽訪問許可權。一旦獲得授權,請求方將獲得對其所有第一方 Cookie 的訪問許可權(即,如果訪問時是第一方,它將擁有的訪問許可權)。

警告:當授予儲存訪問許可權時,仍然可能存在對分割槽儲存的引用。但是,網站不應依賴於能夠同時使用分割槽和未分割槽 Cookie。

除錯

我們鼓勵網站所有者測試他們的網站,特別是那些依賴於第三方內容整合的網站。Firefox 中有幾個功能可以簡化測試過程。

日誌記錄

以下是與第三方上下文中儲存進行互動時記錄到網頁控制檯的訊息概述。在以下示例中,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 中的狀態分割槽機制完全相容,並且不依賴於臨時啟發式演算法。

pref 停用的功能包括

停用啟發式演算法

以下偏好設定可用於透過配置編輯器停用各個儲存訪問啟發式演算法

  • 啟用/停用重定向啟發式演算法privacy.restrict3rdpartystorage.heuristic.recently_visitedprivacy.restrict3rdpartystorage.heuristic.redirect
  • 啟用/停用視窗開啟啟發式演算法privacy.restrict3rdpartystorage.heuristic.window_openprivacy.restrict3rdpartystorage.heuristic.opened_window_after_interaction

停用網路分割槽

可以使用 privacy.partition.network_state pref 停用網路分割槽。

停用動態狀態分割槽

要為所有網站停用動態儲存分割槽,可以使用 network.cookie.cookieBehavior pref

描述
5 拒絕(已知)跟蹤器並分割槽第三方儲存。
4 僅拒絕跟蹤器(儲存分割槽已停用)。
0 允許所有

從分割槽中排除特定來源

也可以使用 privacy.restrict3rdpartystorage.skip_list 偏好設定,為特定來源停用動態狀態分割槽。 此 pref 包含一個以逗號分隔的來源列表以排除。 pref 值應遵循以下格式 first-party_origin_1,third-party_origin_1;first-party_origin_2,third-party_origin_2;...

例如,要為 example.com 上的 tracker.examplenews.example 上的 social.example 停用分割槽,您可以將 pref 設定為以下內容

https://tracker.example,http://example.com;https://social.example,https://news.example