儲存空間分區

為強化使用者隱私權並防範端管道跨網站追蹤,Chrome 現已透過稱為儲存空間分區的程序,在第三方內容中隔離大多數儲存空間和通訊 API。

導入狀態

這項功能已為 Chrome 115 以上版本的所有使用者啟用。其他主要瀏覽器 (例如 Firefox 和 Safari) 也已開始或計劃實施類似的儲存空間分割作業。GitHub 上的 儲存空間區隔提案歡迎進一步討論。

什麼是儲存空間分區?

為防止某些類型的端管道跨網站追蹤,Chrome 會在第三方內容中分割儲存空間和通訊 API。

如果沒有儲存空間分割,網站可以彙整不同網站的資料,以便在網路上追蹤使用者。此外,嵌入式網站還可使用側通道技術 (例如時間攻擊XS-LeaksCOSI) 推斷頂層網站中使用者的特定狀態。

過去,儲存空間的索引鍵只會根據來源建立。也就是說,如果 example.com 的 iframe 嵌入 a.comb.com,則系統可以透過儲存並成功從儲存空間擷取 ID,瞭解您在這些網站上的瀏覽習慣。啟用第三方儲存空間分區後,example.com 的儲存空間會位於兩個不同的分區,一個用於 a.com,另一個用於 b.com

一般來說,分割表示儲存空間 API (例如 iframe 中的本機儲存空間和 IndexedDB) 所寫入的資料,將無法再由共用相同來源的所有情境存取。相反地,這類資料現在會隔離,且只會提供給共用相同來源和相同頂層網站的內容。

之前

不分割的儲存 API。
在儲存空間分割前,example.com 可以在嵌入 a.com 時寫入資料,然後在嵌入 b.com 時讀取資料。

使用後

使用分區的儲存 API。
在儲存空間分割後,當 example.com 嵌入 b.com 時,便無法存取 example.com 的儲存空間。

鏈結 iframe 上的儲存空間分區

當 iframe 重疊時,儲存空間分割作業的複雜度會大幅增加,尤其是當相同來源在鏈結中出現多次時。

舉例來說,A1 包含 B 的 iframe,而 B 包含 A2 的 iframe,且 A1 和 A2 都位於同一網站。如果分割作業只考量頂層網站和目前框架的來源,iframe A2 可能會誤認為是「第一方」,因為它與頂層網站 (A1) 共用一個網站,但中間有跨網站 iframe B。如果 A2 預設可存取未分割的儲存空間,可能會讓 A2 面臨點按盜用等安全性風險。

為解決這個問題,Chrome 會在儲存空間分割區索引鍵中新增「祖系位元」。如果目前 iframe 和頂層網站之間的任何文件來自不同的 (跨網站) 來源,系統就會設定這個位元。在這個案例中,網站 B 是跨網站,因此會為 A2 設定位元,並將儲存空間從 A1 分割。

如果 iframe 鏈結僅包含同網站內容 (例如網站 A1 包含 A2,而 A2 包含 A3),祖系位元就不會進一步分割儲存空間。在這種情況下,系統會以共同來源和頂層網站做為索引,讓儲存空間保持共用。

對於需要在連接的 iframe 之間提供未分割存取權的網站,Chrome 正在實驗擴充 Storage Access API 以支援此用途。由於 Storage Access API 要求框架網站明確叫用 API,因此可降低點按劫持風險。

因分割而變更的 API

受分割影響的 API 可分為下列幾組:

Storage API

  • 配額系統
    配額系統會用來決定儲存空間的磁碟空間分配量。配額系統會將每個區隔視為獨立的值區,以便判斷允許的空間大小,以及清除時間。
    navigator.storage.estimate() 方法現在會提供儲存空間分割區的特定資訊。僅限 Chrome 的 API (例如 window.webkitStorageInfonavigator.webkitTemporaryStorage) 已淘汰。
    IndexedDB快取儲存空間會使用分割配額系統。
  • Web Storage API
    Web Storage API 提供機制,讓瀏覽器儲存鍵/值組合。有兩種機制:本機儲存空間工作階段儲存空間。這些資料並未受配額管理,但仍會分割。
  • Origin 私人檔案系統
    File System Access API 可讓網站在使用者授予存取權後,直接讀取或儲存裝置上的檔案和資料夾變更。來源私人檔案系統可讓來源直接將私人內容儲存至磁碟。使用者仍可存取這項內容,但現在已分割。
  • Storage Bucket API
    Storage Bucket API 是為 Storage Standard 開發的,可透過名為值區的新概念,整合各種儲存空間 API,例如 IndexedDB 和 localStorage。儲存在值區中的資料和與值區相關聯的中繼資料會分割。
  • Clear-Site-Data 標頭
    在回應中加入 Clear-Site-Data 標頭,可讓伺服器要求清除儲存在使用者瀏覽器中的資料。您可以清除快取、Cookie 和 DOM 儲存空間。使用標頭只會清除一個分區內的儲存空間。
  • Blob 網址儲存空間
    Blob 網址可提供 blob 的存取權,Blob 是一種可儲存原始資料的物件。如果沒有儲存空間分區,在某個網站的第三方 iframe 中產生的 Blob 網址,可用於在另一個網站中嵌入的相同來源 iframe。舉例來說,如果 example.com iframe 已嵌入 a.comb.com,則在 a.com 嵌入的 iframe 中產生的 blob URL 可傳遞給 b.com 嵌入的 iframe,並由後者使用,不受任何限制。自 Chrome 137 版 (2025 年 5 月 27 日發布) 起,Blob 網址會針對所有用途進行分割,但頂層導覽除外。目前會遭到封鎖的情況包括:跨分區 Blob 網址與 fetch() 一起使用,或做為各種 HTML 元素的 src 屬性值。頂層瀏覽 (例如呼叫 window.open() 或點選含有 target='_blank' 的連結) 到 Blob 網址的瀏覽作業,如果是跨區域,則不會遭到封鎖,但如果 Blob 網址網站與啟動瀏覽的網頁頂層網站屬於不同網站,則會強制執行 noopener。強制執行 noopener 表示系統會禁止啟動導覽的文件取得所開 Blob URL 文件的視窗句柄。在前述範例中,分割功能會防止 b.com 上的 iframe 擷取 Blob 網址的內容,但仍可 window.open() 該內容。

通訊 API

除了儲存空間 API 外,允許一個情境跨來源邊界進行通訊的通訊 API 也會分割。這項變更主要會影響允許使用廣播或同源交會來探索其他情境的 API。

由於分割功能,以下通訊 API 會防止第三方 iframe 與其同源內容交換資料:

  • 廣播頻道
    Broadcast Channel API 可讓瀏覽內容 (視窗、分頁或 iframe) 與同源的工作站之間進行通訊。
    我們不建議變更跨網站 iframe postMessage() 的行為,因為這些內容之間的關係已清楚定義。
  • SharedWorker
    SharedWorker API 提供可跨相同來源瀏覽內容存取的工作站。
  • 網頁封鎖功能
    Web Locks API 可讓在相同來源的一個分頁或 worker 中執行的程式碼,在執行某些工作時取得共用資源的鎖定。

Service Worker API

Service Worker API 可讓網站在背景執行工作。網站會註冊服務工作者,以便建立新的 worker 內容,用於回應事件。傳統上,這些 worker 可以與任何相同來源的內容互動。不過,由於服務工作站可以變更導覽要求的時間,因此可能會發生跨網站資訊外洩的風險,例如記錄嗅探

因此,從第三方內容註冊的服務工作者現在會分割。

擴充功能 API

擴充功能是可讓使用者自訂瀏覽體驗的程式。

擴充功能頁面 (使用 chrome-extension:// 配置的頁面) 可嵌入網際網路上的網站。在這種情況下,擴充功能頁面仍可存取其頂層區隔。擴充功能也可以嵌入其他網站;如果擴充功能具有主機權限,這些嵌入的網站就能存取其頂層分區。

詳情請參閱擴充功能說明文件

示範:測試儲存空間分區

示範網站:https://storage-partitioning-demo-site-a.glitch.me/

示範網站顯示左側的綠色勾號和右側的紅色叉號。
示範畫面截圖,顯示瀏覽器的輸出內容,左側為有儲存空間分割的瀏覽器,右側則是沒有儲存空間分割的瀏覽器。

本示範使用兩個網站:網站 A 和網站 B。

  • 當您在頂層情境中造訪網站 A 時,該網站會使用各種儲存方法設定資料。
  • 網站 B 嵌入網站 A 的網頁,而該嵌入內容會嘗試讀取先前設定的儲存選項。
  • 當網站 A 嵌入網站 B 時,如果儲存空間已分割,則網站 A 無法存取該資料,因此讀取作業會失敗。
  • 這個示範會根據每次讀取的成功或失敗結果,顯示資料是否已分區。

目前,您可以使用 --disable-features=ThirdPartyStoragePartitioning 指令列切換鈕,在 Chrome 中關閉儲存空間分割功能。注意:這個命令列切換鍵適用於開發和測試用途,日後可能會在 Chrome 版本中移除或變更。

您也可以以相同方式測試其他瀏覽器,查看其分割區狀態。

互動及分享意見回饋