Bisa dibilang SharedArrayBuffer
mengalami sedikit kesulitan di
web, tetapi semuanya sudah tidak berubah. Berikut hal yang perlu Anda ketahui:
Secara singkat
SharedArrayBuffer
saat ini didukung di Firefox 79+, dan akan hadir 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, fitur ini akan dibatasi untuk halaman yang diisolasi lintas origin. Jika Anda merasa tidak dapat melakukan perubahan ini secara tepat waktu, Anda dapat mendaftar ke uji coba origin untuk mempertahankan perilaku saat ini setidaknya hingga Chrome 113.- Jika Anda ingin mengaktifkan isolasi lintas asal untuk terus menggunakan
SharedArrayBuffer
, evaluasi dampaknya terhadap elemen lintas origin lainnya di situs Anda, seperti penempatan iklan. Periksa apakahSharedArrayBuffer
digunakan oleh resource pihak ketiga untuk memahami dampak dan panduan.
Ringkasan isolasi lintas asal
Anda dapat membuat halaman diisolasi lintas origin dengan menayangkan halaman menggunakan header berikut:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Setelah melakukannya, halaman Anda tidak akan dapat memuat konten lintas origin kecuali
resource secara eksplisit mengizinkannya melalui header Cross-Origin-Resource-Policy
atau header CORS
(Access-Control-Allow-*
dan seterusnya).
Ada juga reporting API, sehingga Anda
dapat mengumpulkan data tentang permintaan yang gagal akibat
Cross-Origin-Embedder-Policy
dan Cross-Origin-Opener-Policy
.
Jika Anda merasa belum dapat melakukan perubahan ini secara 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 panduan dan informasi selengkapnya tentang isolasi lintas asal.
Bagaimana kita bisa sampai di sini?
SharedArrayBuffer
hadir di Chrome 60 (pada Juli 2017, bagi Anda yang
memikirkan waktu dalam aspek tanggal, bukan versi Chrome), dan semuanya berjalan dengan baik.
Selama 6 bulan.
Pada Januari 2018, sebuah kerentanan terungkap di beberapa CPU populer. Lihat pengumuman untuk mengetahui detail selengkapnya, tetapi pada dasarnya ini berarti kode dapat menggunakan timer resolusi tinggi untuk membaca memori yang tidak dapat diaksesnya.
Ini menjadi masalah bagi vendor browser kami, karena kami ingin mengizinkan situs mengeksekusi kode dalam bentuk JavaScript dan WASM, tetapi mengontrol secara ketat memori yang dapat diakses kode ini. Jika Anda tiba di situs web saya, saya seharusnya tidak dapat membaca apa pun dari situs perbankan internet yang juga telah Anda buka. Bahkan, saya seharusnya tidak tahu bahwa situs perbankan internet Anda terbuka. Ini adalah dasar-dasar keamanan web.
Untuk mengurangi hal ini, kami mengurangi resolusi timer resolusi tinggi seperti
performance.now()
. Namun, Anda dapat membuat timer resolusi tinggi menggunakan
SharedArrayBuffer
dengan memodifikasi memori dalam loop padat di worker, dan membacanya
kembali di thread lain. Hal ini tidak dapat dimitigasi secara efektif tanpa
sangat memengaruhi kode yang ditujukan dengan baik, sehingga SharedArrayBuffer
dinonaktifkan
sama sekali.
Mitigasi umum adalah memastikan proses sistem halaman web tidak berisi data sensitif dari tempat lain. Chrome telah berinvestasi dalam arsitektur multiproses sejak awal (ingat, komiknya?), tetapi masih ada kasus di mana 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 memilih untuk ikut serta dari origin lain. Permintaan ini dibuat dengan cookie asal lain, sehingga merupakan permintaan 'login' penuh. Saat ini, API baru memerlukan origin lain untuk ikut serta menggunakan CORS.
Kami mengatasi API lama ini dengan mencegah konten masuk ke proses halaman jika terlihat 'salah', dan menyebutnya pemblokiran baca lintas origin. Jadi, dalam kasus di atas, kita tidak akan mengizinkan JSON untuk memasuki proses karena JSON bukan format yang valid untuk semua API tersebut. Yaitu, kecuali iframe. Untuk iframe, kami memasukkan konten dalam proses yang berbeda.
Dengan menerapkan mitigasi ini, kami memperkenalkan kembali SharedArrayBuffer
di Chrome
68 (Juli 2018), tetapi hanya di desktop. Persyaratan proses tambahan membuat kami tidak
dapat melakukan hal yang sama di perangkat seluler. Perlu diketahui juga bahwa solusi Chrome
tidak lengkap, karena kami hanya memblokir format data yang 'salah', sedangkan mungkin (meskipun tidak biasa) bahwa CSS/JS/gambar yang valid pada URL yang dapat ditebak dapat
berisi data pribadi.
Orang-orang membuat standar web bersama untuk menghasilkan solusi lintas browser yang lebih lengkap. Solusinya adalah memberi halaman cara untuk menyatakan "Dengan ini saya melepaskan
kemampuan saya untuk menghadirkan konten asal lain ke dalam proses ini tanpa keikutsertaan mereka".
Deklarasi ini dilakukan melalui header COOP dan COEP
yang ditayangkan dengan halaman. Browser menerapkannya, dan sebagai gantinya, halaman akan mendapatkan
akses ke SharedArrayBuffer
dan API lain dengan kemampuan serupa. Asal lain dapat memilih untuk menggunakan penyematan konten melalui Cross-Origin-Resource-Policy
atau CORS.
Firefox adalah yang pertama mengirimkan SharedArrayBuffer
dengan pembatasan ini, pada versi 79 (Juli 2020).
Kemudian, pada Januari 2021, saya menulis artikel ini, dan Anda membacanya. Halo.
Dan di situlah kita sekarang. Chrome 88 menghadirkan SharedArrayBuffer
kembali ke
Android untuk halaman yang diisolasi lintas origin, dan Chrome 92 menghadirkan persyaratan
yang sama untuk desktop, baik untuk konsistensi, maupun untuk mencapai total isolasi lintas
asal.
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
berakhir di Chrome 113, dan pengecualian hanya berlaku untuk Chrome
Desktop.
- Minta token untuk origin Anda.
- Tambahkan token ke halaman Anda. Ada dua cara untuk melakukannya:
- Tambahkan tag
origin-trial
<meta>
ke bagian atas setiap halaman. Misalnya, hal ini mungkin terlihat seperti:
<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 origin mengisolasi halaman Anda
- Alasan isolasi lintas asal diperlukan
Foto banner oleh Daniel Gregoire di Unsplash