將 Wasm 模組共用功能限制為相同來源

在相同網站環境中共用 WebAssembly 模組時,只能在相同來源之間共用。

相同網站但跨來源環境之間共用 WebAssembly (Wasm) 模組的功能將淘汰,讓代理程式叢集的範圍能長期限定為來源。以這種方式使用 Wasm 模組的開發人員必須確保在同源中例項化這些模組,才能在 Chrome 95 之後繼續使用這些模組。

Wasm 模組是什麼?運作方式為何?

WebAssembly 程式會整理成模組,模組是部署、載入和編譯的單位。

在以下程式碼範例中,從 https://iframe.site.example 匯入的 Wasm 模組會透過 postMessage()https://main.site.example 共用。請注意,這些網域是相同網站,但跨來源的網域。

https://iframe.site.example 上的 Wasm 模組:

(async () => {
  const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
  iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();

自 Chrome 95 版起,傳送者和接收者必須位於相同來源。在上述情況下,https://iframe.site.example 必須是 https://main.site.example,反之亦然。

為什麼需要授予存取權

Chrome 會在內部處理網站鍵值代理程式叢集中的不同文件、分頁和框架。也就是說,同網站文件會在相同程序中處理 (具體運作方式因瀏覽器而異)。最近,Chrome 開始以更精細的單位 (來源) 處理這些項目。我們稱之為origin-keyed 代理程式叢集。不過,由於這項做法會耗用大量資源,因此我們只會根據經驗,將來源鍵代理程式叢集套用至少數網站。

我們預計預設所有代理程式叢集都會使用 origin-keyed 模式。為了達成此目標,我們需要限制需要 site-keyed 來源叢集的功能:

解決上述所有變更後,Chrome 預設會改為使用以來源為鍵的代理程式叢集。

如要進一步瞭解 origin-keyed 代理程式叢集,請參閱「使用 Origin-Agent-Cluster 標頭要求成效隔離」。

後續步驟與相關資源

為了讓 Chrome 預設使用來源鍵代理程式叢集,我們會將 document.domain 設為唯讀。Chrome 團隊預計於 2022 年某個時間推出這項變更。

相片來源:Markus WinklerUnsplash 網站上提供