Wasm モジュールの共有を同一オリジンに制限する

同一サイト環境間での WebAssembly モジュールの共有は、同一オリジンのみに制限されます。

同一サイトだがクロスオリジン環境間で WebAssembly(Wasm)モジュールを共有する 非推奨となり、エージェント クラスタと オリジンにスコープを限定しますWasm モジュールを使用している開発者は、 これらのモジュールを同じオリジンでインスタンス化し 変更してください。

Wasm モジュールの概要と仕組み

WebAssembly プログラムはモジュールに編成されています。モジュールは、 デプロイ、読み込み、コンパイルです。

次のサンプルコードでは、Wasm モジュールのインポート元を 「https://iframe.site.example」を https://main.site.example さんと共有しています postMessage()。これらのドメインは同一サイトですが、クロスオリジンです。

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 は最近、 より細かい単位(オリジン)で処理し始めました。これを オリジンキー エージェント クラスタ。ただし、実行するとリソース消費が大きくなるため、 オリジンキー エージェント クラスタは、限られたウェブサイトにのみヒューリスティックに適用されていました。

すべてのエージェント クラスタをデフォルトでオリジンキーにする予定です。目的 サイトキーを必要とする機能は制限する必要があります 送信元クラスタ:

  • (Chrome のみ)送信できなくなりました。 SharedArrayBuffer または WebAssembly.Memory 他の同一サイトのクロスオリジン ページにリンクできます。これは Chrome 92 以降ですでに導入されています
  • 送信できなくなりました WebAssembly.Module 他の同一サイトのクロスオリジン ページに postMessage() でオブジェクトを追加する。この変更 以下で詳しく説明します。
  • 設定できなくなりました document.domain。 これは従来の機能で、同一サイトのクロスオリジン ページで通常 他の DOM に同期的にアクセスしますが、オリジンキー エージェント クラスタでは、 無効になります。

上記の変更すべてに対応することで、Chrome はオリジンキー エージェントの使用に移行 使用されます。

オリジンキー エージェント クラスタの詳細については、Origin-Agent-Cluster ヘッダーを使用してパフォーマンス分離をリクエストするをご覧ください。

次のステップとリソース

Chrome をオリジンキー エージェント クラスタで動作するようにするために、 document.domain を読み取り専用にします。Chrome チームはこの変更の実現を目指している 計画しています

写真撮影: Markus Winkler オン スプラッシュを解除