使用 Origin-Agent-Cluster 標頭進行效能隔離

新的 HTTP 回應標頭可限制全網域指令碼,並要求瀏覽器提供專屬資源。

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster 是新的 HTTP 回應標頭,可指示瀏覽器防止 跨網站跨來源網頁之間的同步指令碼存取。瀏覽器也可能會使用 Origin-Agent-Cluster 做為提示,表示來源應具備自己的獨立資源,例如 這套專屬程序

瀏覽器相容性

目前 Origin-Agent-Cluster 標頭只能在 Chrome 88 以上版本中實作。設計上 與 Mozilla Firefox 的代表密切合作,獲得價值 設計原型 初步正向 接球時間 WebKit 的代表,這是 Safari 所使用的瀏覽器引擎。

但在這段期間,您可以將 Origin-Agent-Cluster 標頭部署至所有 目前使用人數無法理解它的瀏覽器只會忽略它。由於 origin-keyed 代理程式叢集與 site-keyed 叢集相較,可執行的操作少很多 ( 時,您不用擔心互通性問題。

為什麼瀏覽器無法自動隔離同網站來源

網路採用同源政策,這項安全功能會 限製文件和指令碼如何與其他資源的互動方式 origin。舉例來說,代管於 https://a.example 的網頁位於 來自於 https://b.examplehttps://sub.a.example 的另一個來源。

瀏覽器在幕後採用來源提供的區隔方式有所不同。舊的 即使各個來源無法存取彼此的資料,仍可 共用資源,例如作業系統執行緒、程序和記憶體配置。也就是說 則會導致其他分頁的速度變慢。或者如果一個分頁使用太多記憶體 會讓整個瀏覽器當機。

現今的瀏覽器技術更為複雜,請嘗試將不同的來源分成不同的來源 作業。實際運作方式因瀏覽器而異:多數瀏覽器都提供一定程度的區隔 但單一分頁中的不同 iframe 則可能共用程序。由於程序 會耗用一些記憶體,並運用經驗法則,避免產生過多記憶體,例如 Firefox 具有使用者可設定的處理程序限制。 Chrome 瀏覽器在電腦和行動裝置 (記憶體用量較高) 和行動裝置 (記憶體用量較高) 之間會有所差異 稀疏度)。

這些經驗法則並非完美。其中存在一個重要限制: 同源政策則允許子網域 (例如 https://sub.a.examplehttps://a.example 互相通訊,但瀏覽器無法自動隔離來自 互相啟動。

這個預設行為稱為「site-keyed 代理程式叢集」,亦即瀏覽器會根據 網站上的完整內容。新的 Origin-Agent-Cluster 標頭會要求瀏覽器變更這項預設值 某個頁面的行為,將其放入 origin-keyed 代理程式叢集,以便歸入同一組 其他網頁只有來源完全相同的網頁。尤其是相同網站的跨來源頁面 會從代理程式叢集中排除

有了這項選擇區隔功能,瀏覽器就能為這些新的 origin-keyed 代理程式叢集建立專屬 專屬資源,並未與其他來源的資源結合。例如,這類網頁 可以有各自的程序,或分別排定在不同的執行緒上。將 Origin-Agent-Cluster 標頭,這就等於向瀏覽器指出 充分運用這類專屬資源

不過,瀏覽器必須先停用 有些舊版功能

來源輸入頁面不可執行的功能

當網頁位於 origin-keyed 代理程式叢集時,您可以賦予與相同網站對話的功能 先前可用的跨來源頁面請特別注意以下幾點:

  • 您無法再進行設定 document.domain。這是 通常允許同網站跨來源網頁同步存取 但是在 origin-keyed 代理程式叢集內 其他的 DOM 即會停用

  • 您無法再匯款 WebAssembly.Module敬上 透過 postMessage() 傳送至其他同網站跨來源頁面的物件。

  • (僅適用於 Chrome) 您將無法再傳送 SharedArrayBuffer敬上 或 WebAssembly.Memory。 將物件傳送至其他同網站跨來源頁面。

,瞭解如何調查及移除這項存取權。

使用 origin-keyed 代理程式叢集的時機

下列來源最能受惠於 Origin-Agent-Cluster 標頭:

  • 如果情況允許,請盡可能使用專屬資源取得最佳效能。範例包括 需要大量效能的遊戲、視訊會議網站,或多媒體製作應用程式。

  • 包含來源不同但來源不同,且資源密集型 iframe。舉例來說 https://mail.example.com 嵌入 https://chat.example.com iframe、origin-keying https://mail.example.com/ 可確保即時通訊團隊撰寫的程式碼不會意外 幹擾郵件小組撰寫的程式碼,並可以提示瀏覽器告訴瀏覽器 程序獨立進行,並降低兩者對成效的影響。

  • 希望能夠嵌入不同來源的相同網站頁面,但也知道為 而且耗用大量資源舉例來說,如果 https://customerservicewidget.example.com 預期使用 提供大量視訊通訊資源,同時將嵌入業界各處 https://*.example.com,維護這個小工具的團隊可以使用 Origin-Agent-Cluster 標題,嘗試降低對嵌入器的效能影響。

此外,您必須確定可以停用上述很少使用案例 跨來源通訊功能,且您的網站使用 HTTPS

但最後,這些只是規範。origin-keyed 代理程式叢集是否可協助網站 能否透過評估結果做出最佳決定具體而言,建議你評估 網站體驗指標,也可能是記憶體 來瞭解 origin-keying 的影響。( 隨著作業流程增加,使用者也能夠 每個程序的記憶體負擔)。請不要只推出來源鍵功能,並希望一切順利。

這與跨來源隔離有何關係?

透過 Origin-Agent-Cluster 標頭執行的代理程式叢集的 origin-keying 牽涉到 透過 Cross-Origin-Opener-Policy 和內部資源進行跨來源隔離 Cross-Origin-Embedder-Policy 標頭。

凡是自行進行跨來源隔離的網站,也會停用相同的同網站跨來源 通訊功能,就如同使用 Origin-Agent-Cluster 標頭時一樣。不過, 除了跨來源隔離之外,Origin-Agent-Cluster 標頭仍能做為額外的 提示瀏覽器修改資源分配經驗法則因此,建議你 並套用 Origin-Agent-Cluster 標頭並測量結果, 已將跨來源隔離

如何使用 Origin-Agent-Cluster 標頭

如要使用 Origin-Agent-Cluster 標頭,請將網路伺服器設為傳送下列 HTTP 回應標頭:

Origin-Agent-Cluster: ?1

?1 的值是「結構化」 布林值的標頭語法true 值。

請務必針對來自來源的「所有」回應傳送這個標頭,而不只是部分網頁。 否則,可能會出現不一致的結果,當瀏覽器「記住」通常來自於來源金鑰 因此即使是未提出要求的網頁 也同樣是來源鍵反之:如果第一頁 如果使用者造訪不含標頭,瀏覽器就會記住來源 設為 origin-keyed 並忽略後續頁面的標頭

為什麼瀏覽器無法一直採用標頭?

之所以出現這個「記憶體」一詞的原因是要確保來源金鑰的一致性如果 表示來源是 origin-key,有些則沒有,那麼您就可以有兩個相同來源的頁面 無法彼此通訊這會是 對網頁程式開發人員和瀏覽器的內部而言,都很奇怪。規格 如果標頭與先前的設定不一致,則 Origin-Agent-Cluster 會忽略標頭 針對特定來源看到的樣子而在 Chrome 中,則會收到控制台警告。

這項一致性的範圍僅限於瀏覽情境群組,也就是一組分頁、視窗或 這類 iframe 可以透過 window.openerframes[0]window.parent。這表示在設定來源的來源或網站鍵功能 (由 無論是否看到標頭),如要變更標頭,必須開啟全新的 而不會與舊視窗連結

測試 Origin-Agent-Cluster 標頭時,這些詳細資料非常重要。首次新增 網站,僅重新載入網頁就沒有作用;請先關閉分頁,然後重新開啟 第一項。

如要檢查是否套用 Origin-Agent-Cluster 標頭,請使用 JavaScript window.originAgentCluster 屬性。如果標頭 (或其他值)true 機制 (例如跨來源隔離) 觸發來源鍵功能;false 才不會;和 undefined (瀏覽器不支援 Origin-Agent-Cluster 標頭)。 將這些資料記錄到數據分析平台後,就能進行您所設定的重要檢查 正確設定您的伺服器

最後請注意,Origin-Agent-Cluster 標頭僅適用於安全 背景資訊,即 HTTPS 上 或 http://localhost 上的網頁。非 localhost HTTP 網頁支援 origin-keyed 代理程式 叢集內

來源金鑰並非安全防護功能

使用 origin-keyed 代理程式叢集時,會將來源與同步存取隔離開來 不同來源的相同網站頁面,並不會提供保護措施。 安全性相關標頭 (例如 Cross-Origin-Resource-Policy敬上 和 Cross-Origin-Opener-Policy。 尤其是,因為像是 Spectre

你可能會覺得這有點出乎意料,因為來源鍵有時可能會導致您的來源產生本身的 程序和獨立程序,是抵禦旁路攻擊的重要防禦措施。但請注意 此時,Origin-Agent-Cluster 標頭只是提示。瀏覽器並非 獨立程序進行獨立程序,但基於下列幾種原因而未這麼做:

  • 因為瀏覽器可能未導入這項技術。舉例來說,目前 Safari 和 Firefox 可以在各自的程序中放置個別分頁,但 iframe 目前無法這麼做。

  • 瀏覽器可能會判定並非值得另外執行程序的負擔。例如,在 記憶體不足的 Android 裝置或 Android WebView 時,Chrome 會盡可能減少使用的處理程序。

  • 瀏覽器可能會採用 Origin-Agent-Cluster 標頭指出的要求, 但可以採用與程序不同的隔離技術來實現這個目標舉例來說,Chrome 是 探索 採用執行緒,而非程序來區隔這類效能。

  • 使用者或在其他網站上執行的程式碼,可能已瀏覽到網站輸入頁面 導致一致性保證生效,且 要完全忽略 Origin-Agent-Cluster 標頭。

因此,請勿將 origin-keyed 代理程式叢集視為安全防護功能。 它可指示您的 使用專屬資源 (而且您願意放棄不確定性) 功能)。

意見回饋

Chrome 團隊十分期待您的回覆,如果您正在使用或考慮使用Origin-Agent-Cluster 標題。你的公眾興趣與支援有助於我們優先開發相關功能,以及顯示其他 有多麼重要在 @ChromiumDev 和 讓 Chrome DevRel 瞭解你的想法和經驗。

如果對規格或功能運作方式有其他疑問 前往 HTML 標準 GitHub 存放區提報問題。如果你 如果遇到任何 Chrome 實作方面的問題,請前往 new.crbug.com 並將「Component」欄位設為 Internals>Sandbox>SiteIsolation

瞭解詳情

如要進一步瞭解 origin-keyed 代理程式叢集,請點選下列連結來瞭解詳情: