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 dikaitkan dengan 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 berada di situs yang sama, tetapi berasal dari berbagai 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 berupa 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 same-site ditangani dalam proses yang sama (cara kerjanya bervariasi di setiap browser). Baru-baru ini, Chrome mulai menanganinya dalam unit yang lebih terperinci: 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 origin 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, kita akan membuat document.domain hanya baca. Tim Chrome menargetkan perubahan ini akan diterapkan pada tahun 2022.

Foto oleh Markus Winkler di Unsplash