Membatasi berbagi modul Wasm ke origin yang sama

Berbagi modul WebAssembly antara lingkungan situs yang sama akan dibatasi hanya untuk origin yang sama.

Berbagi modul WebAssembly (Wasm) antara lingkungan situs yang sama, tetapi lintas origin akan tidak digunakan lagi agar cluster agen dapat dicakup ke origin dalam jangka panjang. Developer yang menggunakan modul Wasm dengan cara tersebut harus memastikan untuk membuat instance modul tersebut di origin yang sama agar dapat terus menggunakannya setelah Chrome 95.

Apa itu modul Wasm dan cara kerjanya

Program WebAssembly diatur ke dalam modul, yang merupakan unit deployment, pemuatan, dan kompilasi.

Dalam contoh kode berikut, modul Wasm yang diimpor dari https://iframe.site.example dibagikan ke https://main.site.example melalui postMessage(). Perhatikan bahwa domain ini berada di situs yang sama, tetapi lintas origin.

Modul Wasm di https://iframe.site.example:

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

Mulai Chrome 95, pengirim dan penerima harus memiliki origin yang sama. Dalam kasus di atas, https://iframe.site.example harus berupa https://main.site.example atau sebaliknya.

Alasan hal ini diperlukan

Chrome telah menangani berbagai dokumen, tab, dan frame secara internal di cluster agen dengan kunci situs. Artinya, dokumen situs yang sama ditangani dalam proses yang sama (cara kerjanya bervariasi per browser). Baru-baru ini, Chrome mulai menanganinya dalam unit yang lebih terperinci: origin. Kami menyebutnya cluster agen sesuai origin. Namun, karena hal ini memerlukan banyak resource, cluster agen sesuai origin hanya diterapkan ke situs tertentu secara heuristik.

Rencananya adalah membuat semua cluster agen sesuai origin secara default. Untuk mencapai hal ini, kita perlu membatasi kemampuan yang memerlukan cluster origin berkunci situs:

  • (Khusus Chrome) Anda tidak dapat lagi mengirim objek SharedArrayBuffer atau WebAssembly.Memory ke halaman lintas origin situs yang sama lainnya. Fitur ini sudah diterapkan sejak Chrome 92.
  • Anda tidak dapat lagi mengirim objek WebAssembly.Module ke halaman lintas origin situs yang sama lainnya melalui postMessage(). Perubahan ini dijelaskan secara lebih mendetail di bawah.
  • Anda tidak dapat lagi menetapkan document.domain. Ini adalah fitur lama yang biasanya memungkinkan halaman lintas origin situs yang sama untuk mengakses DOM satu sama lain secara sinkron, tetapi di pengelompokan agen sesuai origin, fitur ini dinonaktifkan.

Dengan mengatasi semua perubahan di atas, Chrome akan beralih menggunakan pengelompokan agen sesuai origin secara default.

Untuk mempelajari lebih lanjut pengelompokan agen sesuai origin, lihat Meminta isolasi performa dengan header Origin-Agent-Cluster.

Langkah selanjutnya dan sumber daya

Agar Chrome berfungsi dengan cluster agen sesuai origin secara default, kita akan membuat document.domain hanya baca. Tim Chrome berencana menerapkan perubahan ini pada tahun 2022.

Foto oleh Markus Winkler di Unsplash