Membatasi berbagi modul Wasm ke origin yang sama

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

Berbagi modul WebAssembly (Wasm) di antara lingkungan situs yang sama, tetapi lintas origin akan dihentikan penggunaannya untuk memungkinkan cluster agen diberi cakupan ke origin dalam jangka panjang. Developer yang menggunakan modul Wasm dengan cara tersebut harus memastikan untuk membuat instance modul tersebut di origin yang sama untuk 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 dengan https://main.site.example melalui postMessage(). Perhatikan bahwa domain ini 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 berasal dari origin yang sama. Dalam kasus di atas, https://iframe.site.example harus https://main.site.example atau sebaliknya.

Alasan diperlukannya hal ini

Chrome telah menangani berbagai dokumen, tab, dan frame secara internal di cluster agen dengan kunci situs. Ini berarti dokumen situs yang sama ditangani dalam proses yang sama (cara kerjanya bervariasi di setiap browser). Baru-baru ini, Chrome mulai menanganinya dalam unit yang lebih mendetail: origin. Kami menyebutnya cluster agen sesuai origin. Namun, karena melakukannya akan menghabiskan banyak resource, cluster agen dengan kunci origin hanya diterapkan secara heuristik ke situs terbatas.

Rencananya adalah membuat semua cluster agen sesuai dengan originnya secara default. Untuk mencapai hal ini, kita perlu membatasi kemampuan yang memerlukan cluster origin dengan kunci 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 akan 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 dalam cluster agen dengan kunci origin, fitur ini dinonaktifkan.

Dengan mengatasi semua perubahan di atas, Chrome akan beralih untuk menggunakan cluster agen dengan kunci origin secara default.

Untuk mempelajari lebih lanjut cluster 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, kami akan membuat document.domain menjadi hanya baca. Tim Chrome menargetkan perubahan ini akan diluncurkan pada tahun 2022.

Foto oleh Markus Winkler di Unsplash