Pelajari alasan isolasi lintas asal diperlukan untuk menggunakan fitur canggih seperti SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
, dan timer resolusi tinggi dengan presisi yang lebih baik.
Pengantar
Dalam Membuat situs Anda "diisolasi lintas origin" menggunakan COOP dan COEP, kami menjelaskan cara menerapkan model "cross-origin" terisolasi" status menggunakan COOP dan COEP. Ini adalah artikel pendamping yang menjelaskan mengapa isolasi lintas asal diperlukan untuk mengaktifkan fitur canggih pada browser.
Latar belakang
Web dibuat berdasarkan sumber yang sama
policy: fitur keamanan yang membatasi
bagaimana dokumen dan skrip dapat berinteraksi
dengan resource dari asal lain. Ini
membatasi cara situs dapat mengakses resource lintas origin. Sebagai
contoh, dokumen dari https://a.example
dicegah mengakses data
yang dihosting di https://b.example
.
Namun, kebijakan origin yang sama memiliki beberapa pengecualian historis. Situs web apa pun dapat:
- Menyematkan iframe lintas origin
- Sertakan resource lintas origin seperti gambar atau skrip
- Buka jendela pop-up lintas origin dengan referensi DOM
Jika web dapat dirancang dari awal, pengecualian ini tidak akan ada. Sayangnya, pada saat komunitas web menyadari manfaat utama dari kebijakan origin yang sama yang ketat, web sudah mengandalkan pengecualian ini.
Efek samping keamanan dari kebijakan origin yang sama yang longgar tersebut di-patch menjadi dua
cara. Salah satunya adalah melalui pengenalan protokol baru bernama Crossover
Origin Resource Sharing (CORS)
yang bertujuan untuk memastikan bahwa server
memungkinkan berbagi sumber daya dengan
asal tertentu. Cara lain adalah dengan secara implisit menghapus
akses skrip langsung ke
resource lintas origin sekaligus mempertahankan kompatibilitas mundur. Seperti
resource lintas origin disebut "buram" Google Cloud Platform. Sebagai contoh, inilah
alasan mengapa
memanipulasi piksel gambar lintas origin melalui CanvasRenderingContext2D
akan gagal kecuali jika CORS diterapkan ke image.
Semua keputusan kebijakan ini terjadi dalam grup konteks penjelajahan.
Sejak lama, kombinasi CORS dan resource buram sudah cukup untuk browser Anda aman. Terkadang kasus ekstrem (seperti JSON kerentanan) ditemukan, dan perlu diperbaiki, tetapi secara keseluruhan prinsip tidak memungkinkan akses baca langsung ke byte mentah dari sumber daya lintas asal berhasil.
Semua ini diubah dengan
Spectre, yang
membuat data apa pun yang dimuat ke grup konteks penjelajahan yang sama dengan kode Anda
dapat dibaca. Dengan mengukur waktu yang dibutuhkan oleh
operasi tertentu, penyerang
bisa menebak isi {i>cache<i} CPU, dan melalui itu, isi dari
proses' memori. Serangan pengaturan waktu tersebut dapat dilakukan dengan timer dengan perincian rendah
yang ada di platform, tetapi dapat
dipercepat dengan timer terperinci,
eksplisit (seperti performance.now()
) maupun implisit (seperti
SharedArrayBuffer
). Jika evil.com
menyematkan gambar lintas origin, ia dapat menggunakan
Serangan Spectre untuk membaca data pikselnya, sehingga perlindungan bergantung pada
"buram" tidak efektif.
Idealnya, semua permintaan lintas asal harus diperiksa secara eksplisit oleh server yang memiliki resource tersebut. Jika pemeriksaan tidak disediakan oleh server pemilik sumber daya, maka data tidak akan bisa masuk ke dalam konteks tambahan dari aktor jahat, dan karenanya akan tetap berada di luar jangkauan Spectre serangan yang dapat dilakukan oleh sebuah laman web. Kami menyebutnya status terisolasi lintas origin. Inilah yang dimaksud dengan COOP+COEP.
Dengan status terisolasi lintas origin, situs yang meminta dianggap lebih sedikit
berbahaya dan tindakan ini akan membuka fitur canggih seperti SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
dan resolusi tinggi
timer dengan presisi lebih baik, yang dapat
jika tidak, akan digunakan untuk
serangan seperti Spectre. Hal ini juga mencegah modifikasi
document.domain
.
Kebijakan Penyemat Lintas Asal
Penyemat Lintas Asal Kebijakan (COEP) mencegah dokumen agar tidak memuat resource lintas origin yang tidak secara eksplisit memberikan izin dokumen (menggunakan CORP atau CORS). Dengan fitur ini, Anda dapat mendeklarasikan bahwa dokumen tidak dapat memuat sumber daya tersebut.
Untuk mengaktifkan kebijakan ini, tambahkan header HTTP berikut ke dokumen:
Cross-Origin-Embedder-Policy: require-corp
Kata kunci require-corp
adalah satu-satunya nilai yang diterima untuk COEP. Hal ini memberlakukan
kebijakan bahwa dokumen hanya dapat memuat
resource dari asal yang sama, atau
resource yang secara eksplisit ditandai sebagai
dapat dimuat dari asal lain.
Agar resource dapat dimuat dari asal lain, resource tersebut harus mendukung Cross Origin Resource Sharing (CORS) atau Cross Origin Resource Policy (CORP).
Cross-Origin Resource Sharing (CORS)
Jika resource lintas origin mendukung Cross Origin Resource Sharing
(CORS), Anda dapat menggunakan
crossorigin
untuk memuatnya ke halaman web Anda tanpa diblokir oleh COEP.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Misalnya, jika resource gambar ini ditampilkan dengan header CORS, gunakan
crossorigin
sehingga permintaan untuk mengambil resource akan menggunakan CORS
mode. Hal ini juga
mencegah gambar dimuat kecuali jika header CORS ditetapkan.
Demikian pula, Anda dapat mengambil data lintas origin melalui metode fetch()
, yang
tidak memerlukan penanganan khusus selama server merespon dengan
HTTP
header.
Kebijakan Resource Lintas Asal
Kebijakan Resource Lintas Asal (CORP) awalnya diperkenalkan sebagai keikutsertaan untuk melindungi sumber daya agar tidak dimuat oleh asal lain. Dalam konteks COEP, CORP dapat menentukan sumber daya kebijakan pemilik mengenai siapa yang dapat memuat sumber daya.
Header Cross-Origin-Resource-Policy
menggunakan tiga kemungkinan nilai:
Cross-Origin-Resource-Policy: same-site
Resource yang ditandai same-site
hanya dapat dimuat dari situs yang sama.
Cross-Origin-Resource-Policy: same-origin
Resource yang ditandai same-origin
hanya dapat dimuat dari asal yang sama.
Cross-Origin-Resource-Policy: cross-origin
Resource yang ditandai cross-origin
dapat dimuat oleh situs apa pun. (Ini
nilai tambahan telah ditambahkan ke
CORP beserta COEP.)
Kebijakan Pembuka Lintas Asal
Kebijakan Pembuka Lintas Asal
(COOP) memungkinkan Anda memastikan
bahwa jendela tingkat atas diisolasi dari dokumen lain dengan menempatkannya dalam
grup konteks penjelajahan yang berbeda, sehingga mereka tidak dapat berinteraksi langsung dengan
{i>top-level window <i}(tingkat tertinggi). Misalnya, jika dokumen dengan COOP membuka jendela pop-up,
Properti window.opener
akan menjadi null
. Selain itu, properti .closed
dari elemen
referensi pembukanya akan menampilkan true
.
Header Cross-Origin-Opener-Policy
menggunakan tiga kemungkinan nilai:
Cross-Origin-Opener-Policy: same-origin
Dokumen yang ditandai sebagai same-origin
dapat berbagi konteks penjelajahan yang sama
grup dengan dokumen dari origin yang sama yang juga secara eksplisit ditandai same-origin
.
Cross-Origin-Opener-Policy: same-origin-allow-popups
Dokumen tingkat atas dengan same-origin-allow-popups
mempertahankan referensi ke
pop-up yang tidak menetapkan COOP atau memilih untuk tidak mengisolasi
menetapkan COOP sebesar unsafe-none
.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none
adalah setelan default dan memungkinkan dokumen ditambahkan ke file pembuka
grup konteks penjelajahan kecuali pembuka itu sendiri memiliki COOP same-origin
.
Ringkasan
Jika Anda menginginkan akses yang terjamin ke fitur-fitur canggih seperti SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
atau resolusi tinggi
timer dengan presisi yang lebih baik. Perlu diingat
bahwa dokumen Anda perlu menggunakan COEP dengan nilai require-corp
COOP dengan nilai same-origin
. Jika tidak ada keduanya, browser akan
tidak menjamin isolasi yang memadai untuk mengaktifkan fitur-fitur canggih tersebut dengan aman. Anda
dapat menentukan situasi halaman Anda dengan memeriksa apakah
self.crossOriginIsolated
akan menampilkan true
.
Pelajari langkah-langkah untuk menerapkannya di Membuat situs Anda "lintas asal terisolasi" menggunakan COOP dan COEP.