Dapat dikatakan bahwa SharedArrayBuffer
mengalami sedikit masalah saat diluncurkan di web, tetapi sekarang sudah stabil. Berikut ini hal yang perlu Anda ketahui:
Singkatnya
SharedArrayBuffer
saat ini didukung di Firefox 79+, dan akan tersedia di Android Chrome 88. Namun, fitur ini hanya tersedia untuk halaman yang diisolasi lintas origin.SharedArrayBuffer
saat ini tersedia di Chrome Desktop, tetapi mulai Chrome 92,SharedArrayBuffer
akan dibatasi untuk halaman yang diisolasi lintas asal. Jika Anda merasa tidak dapat melakukan perubahan ini tepat waktu, Anda dapat mendaftar ke uji coba origin untuk mempertahankan perilaku saat ini hingga setidaknya Chrome 113.- Jika Anda ingin mengaktifkan isolasi lintas asal untuk terus menggunakan
SharedArrayBuffer
, evaluasi dampak yang akan ditimbulkan pada elemen lintas asal lain di situs Anda, seperti penempatan iklan. Periksa apakahSharedArrayBuffer
digunakan oleh salah satu resource pihak ketiga Anda untuk memahami dampak dan panduannya.
Ringkasan isolasi lintas origin
Anda dapat membuat halaman terisolasi lintas asal dengan menayangkan halaman menggunakan header berikut:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Setelah Anda melakukannya, halaman Anda tidak akan dapat memuat konten lintas asal kecuali jika resource tersebut secara eksplisit mengizinkannya melalui header Cross-Origin-Resource-Policy
atau header CORS
(Access-Control-Allow-*
dan seterusnya).
Ada juga API pelaporan, sehingga Anda
dapat mengumpulkan data tentang permintaan yang gagal akibat
Cross-Origin-Embedder-Policy
dan Cross-Origin-Opener-Policy
.
Jika Anda merasa tidak dapat melakukan perubahan ini tepat waktu untuk Chrome 92, Anda dapat mendaftar ke uji coba origin untuk mempertahankan perilaku Chrome Desktop saat ini hingga setidaknya Chrome 113.
Lihat bagian Bacaan lebih lanjut di bagian bawah halaman ini untuk mendapatkan panduan dan informasi selengkapnya tentang isolasi lintas origin.
Bagaimana kita bisa sampai di sini?
SharedArrayBuffer
hadir di Chrome 60 (yaitu Juli 2017, bagi Anda yang
memikirkan waktu dalam tanggal, bukan versi Chrome), dan semuanya berjalan lancar.
Selama 6 bulan.
Pada Januari 2018, kerentanan terungkap di beberapa CPU populer. Lihat pengumuman untuk mengetahui detail selengkapnya, tetapi pada dasarnya berarti kode dapat menggunakan timer beresolusi tinggi untuk membaca memori yang seharusnya tidak dapat diaksesnya.
Hal ini menjadi masalah bagi kami sebagai vendor browser, karena kami ingin mengizinkan situs untuk mengeksekusi kode dalam bentuk JavaScript dan WASM, tetapi mengontrol secara ketat memori yang dapat diakses oleh kode ini. Jika Anda membuka situs saya, saya tidak akan dapat membaca apa pun dari situs internet banking yang juga Anda buka. Faktanya, saya bahkan tidak boleh tahu bahwa Anda membuka situs internet banking Anda. Ini adalah dasar-dasar keamanan web.
Untuk memitigasi hal ini, kami mengurangi resolusi timer resolusi tinggi kami seperti performance.now()
. Namun, Anda dapat membuat timer resolusi tinggi menggunakan
SharedArrayBuffer
dengan mengubah memori dalam loop ketat di pekerja, dan membacanya
kembali di thread lain. Hal ini tidak dapat dimitigasi secara efektif tanpa
memengaruhi kode yang dimaksudkan dengan baik secara signifikan, sehingga SharedArrayBuffer
dinonaktifkan
seluruhnya.
Mitigasi umum adalah memastikan proses sistem halaman web tidak berisi data sensitif dari tempat lain. Chrome telah berinvestasi dalam arsitektur multi-proses sejak awal (ingat komiknya?), tetapi masih ada kasus ketika data dari beberapa situs dapat berakhir dalam proses yang sama:
<iframe src="https://your-bank.example/balance.json"></iframe>
<script src="https://your-bank.example/balance.json"></script>
<link rel="stylesheet" href="https://your-bank.example/balance.json" />
<img src="https://your-bank.example/balance.json" />
<video src="https://your-bank.example/balance.json"></video>
<!-- …and more… -->
API ini memiliki perilaku 'lama' yang memungkinkan konten dari origin lain digunakan tanpa izin dari origin lain. Permintaan ini dibuat dengan cookie asal lain, sehingga merupakan permintaan 'login' penuh. Saat ini, API baru mengharuskan asal lain untuk ikut serta menggunakan CORS.
Kami mengatasi masalah API lama ini dengan mencegah konten memasuki proses halaman web jika terlihat 'salah', dan menyebutnya pemblokiran baca lintas origin. Jadi, dalam kasus di atas, kami tidak akan mengizinkan JSON masuk ke dalam proses, karena bukan format yang valid untuk API tersebut. Artinya, kecuali iframe. Untuk iframe, kami menempatkan konten dalam proses yang berbeda.
Dengan adanya mitigasi ini, kami memperkenalkan kembali SharedArrayBuffer
di Chrome 68 (Juli 2018), tetapi hanya di desktop. Persyaratan proses tambahan berarti kami tidak dapat melakukan hal yang sama di perangkat seluler. Selain itu, solusi Chrome
juga tidak lengkap, karena kami hanya memblokir format data yang 'salah', padahal
ada kemungkinan (meskipun tidak biasa) bahwa CSS/JS/gambar yang valid di URL yang dapat ditebak
dapat berisi data pribadi.
Para pakar standar web berkumpul untuk menghasilkan solusi lintas browser yang lebih lengkap. Solusinya adalah memberi halaman cara untuk menyatakan "Saya dengan ini melepaskan kemampuan saya untuk membawa konten lintas origin ke dalam proses ini tanpa izin mereka".
Deklarasi ini dilakukan melalui header COOP dan COEP
yang ditayangkan bersama halaman. Browser akan menerapkan hal tersebut, dan sebagai gantinya, halaman akan mendapatkan
akses ke SharedArrayBuffer
dan API lain dengan kemampuan serupa. Origin lain dapat memilih untuk menyematkan konten melalui
Cross-Origin-Resource-Policy
atau CORS.
Firefox adalah yang pertama kali mengirimkan SharedArrayBuffer
dengan batasan ini, di
versi 79 (Juli 2020).
Kemudian, pada Januari 2021, saya menulis artikel ini, dan Anda membacanya. Halo.
Dan di situlah posisi kita sekarang. Chrome 88 menghadirkan SharedArrayBuffer
kembali ke
Android untuk halaman yang diisolasi lintas origin, dan Chrome 92 menghadirkan persyaratan yang sama ke desktop, baik untuk konsistensi, maupun untuk mencapai isolasi lintas origin total.
Menunda perubahan Chrome Desktop
Ini adalah pengecualian sementara dalam bentuk 'uji coba origin' yang memberi orang
lebih banyak waktu untuk menerapkan halaman yang diisolasi lintas origin. Hal ini memungkinkan
SharedArrayBuffer
tanpa mengharuskan halaman diisolasi lintas origin. Pengecualian ini akan berakhir di Chrome 113, dan hanya berlaku untuk Chrome Desktop.
- Minta token untuk asal Anda.
- Tambahkan token ke halaman Anda. Ada dua cara untuk melakukannya:
- Tambahkan tag
origin-trial
<meta>
ke bagian head setiap halaman. Misalnya, tampilannya mungkin seperti ini:
<meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">
- Jika dapat mengonfigurasi server, Anda juga dapat menambahkan token
menggunakan header HTTP
Origin-Trial
. Header respons yang dihasilkan akan terlihat seperti:
Origin-Trial: TOKEN_GOES_HERE
- Tambahkan tag
Bacaan lebih lanjut
- Panduan untuk mengaktifkan isolasi lintas asal
- Cara mengisolasi lintas asal halaman Anda
- Alasan isolasi lintas asal diperlukan
Foto banner oleh Daniel Gregoire di Unsplash