Membatasi berbagi modul Wasm ke origin yang sama

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

Berbagi modul WebAssembly (Wasm) antara lingkungan situs yang sama, tetapi lintas origin tidak akan digunakan lagi agar cluster agen dicakup ke origin dalam jangka panjang. Developer yang menggunakan modul Wasm dengan cara semacam ini 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 kode contoh berikut, modul Wasm yang diimpor dari https://iframe.site.example dibagikan kepada 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 memiliki asal yang sama. Dalam kasus di atas, https://iframe.site.example harus berupa https://main.site.example, atau sebaliknya.

Mengapa ini diperlukan

Chrome telah menangani berbagai dokumen, tab, dan frame secara internal di cluster agen dengan kunci situs. Artinya, dokumen di situs yang sama ditangani dalam proses yang sama (cara kerjanya bervariasi per browser). Baru-baru ini, Chrome mulai menanganinya dalam unit yang lebih mendetail: origin. Kami menyebutnya cluster agen sesuai origin. Namun, karena biayanya mahal, cluster agen sesuai origin hanya diterapkan pada situs yang terbatas secara heuristis.

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

  • (Khusus Chrome) Anda tidak dapat lagi mengirim objek SharedArrayBuffer atau WebAssembly.Memory ke halaman lintas origin situs yang sama lainnya. Hal 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. Fitur ini adalah fitur lama yang biasanya memungkinkan halaman lintas origin situs yang sama mengakses DOM masing-masing secara sinkron, tetapi dalam cluster agen dengan kunci origin, fitur ini dinonaktifkan.

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

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

Langkah selanjutnya dan sumber daya

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

Foto oleh Markus Winkler di Unsplash