Cross-Origin-Opener-Policy Memisahkan Relasi Antar-Window
Sebuah window browser dapat menyimpan referensi ke window top-level lain. window.open() mengembalikan WindowProxy, sedangkan dokumen yang dibuka dapat menerima referensi window.opener. Same-origin policy membatasi bagian yang dapat diperiksa oleh window lintas origin, tetapi relasi itu sendiri masih dapat membuka state dan permukaan komunikasi tertentu.
Cross-Origin-Opener-Policy (COOP) menambahkan batas pada relasi tersebut. Header respons ini memengaruhi apakah dokumen top-level tetap berada dalam browsing context group (BCG) yang kompatibel atau berpindah ke grup baru. Ketika policy mengharuskan grup terpisah, referensi antara opener dan dokumen yang dibuka diputus.
Cakupannya lebih sempit daripada policy jaringan atau konten secara umum. COOP mengatur relasi browsing context top-level; COOP tidak memberi otorisasi pembacaan HTTP lintas origin, melakukan sanitasi konten, atau menggantikan otorisasi aplikasi.
Batasnya berada pada browsing context group
Browsing context adalah lingkungan yang menampilkan sebuah dokumen, biasanya tab atau window. Browsing context diorganisasi ke dalam grup yang anggotanya dapat mempertahankan referensi satu sama lain.
COOP mengubah keanggotaan grup untuk dokumen top-level. Respons restriktif dasar dapat memakai:
Cross-Origin-Opener-Policy: same-originDengan same-origin, dokumen berbagi grup terkait hanya ketika kondisi policy dan origin cocok. Dokumen lintas origin yang dibuka dari halaman tersebut ditempatkan ke grup berbeda, sehingga relasi opener terputus pada batas itu.
Efeknya terlihat dari JavaScript. Kode yang mengasumsikan handle dari window.open() akan bertahan tidak lagi dapat memperlakukan handle tersebut sebagai relasi aktif biasa setelah COOP menyebabkan perpindahan grup.
const popup = window.open("https://accounts.example.net/continue");
if (popup && popup.closed) {
// Relasi browsing context mungkin telah diputus.
}Relasi yang terputus bukan bukti bahwa tujuan gagal dimuat. Kondisi itu menjelaskan relasi antara dua context top-level.
same-origin memang bersifat ketat
Nilai same-origin cocok untuk halaman yang tidak perlu mempertahankan relasi scripting dengan popup lintas origin.
Cross-Origin-Opener-Policy: same-originDua dokumen same-origin dengan policy same-origin yang cocok dapat tetap berada dalam BCG yang sama. Ketidakcocokan origin atau opener policy terkait menghasilkan pemisahan.
Pemisahan tersebut mengurangi paparan terhadap serangan lintas origin yang bergantung pada referensi window dan state yang dapat diamati, termasuk kelas XS-Leaks. Policy ini juga mendukung salah satu kondisi yang dipakai untuk cross-origin isolation ketika digabungkan dengan embedder policy yang diperlukan.
COOP tidak tepat disebut sebagai jaminan bahwa dokumen mendapat proses sistem operasi khusus. Browser mengambil keputusan alokasi proses secara terpisah. Kontrak keamanan di sini adalah batas browsing context group beserta semantik relasi yang dihasilkannya.
Integrasi popup dapat memerlukan policy berbeda
Alur autentikasi dan pembayaran sering membuka layanan lintas origin serta mempertahankan relasi popup cukup lama untuk menyelesaikan protokol aplikasi. Policy same-origin secara menyeluruh dapat bertentangan dengan desain tersebut.
same-origin-allow-popups menyediakan pilihan kompatibilitas yang lebih sempit:
Cross-Origin-Opener-Policy: same-origin-allow-popupsUntuk alur Window.open(), nilai ini dapat mempertahankan dokumen baru dengan unsafe-none di BCG yang sama. Perilaku tersebut berguna hanya jika aplikasi memang membutuhkan relasinya. Ada pertukaran sebagian isolasi untuk kompatibilitas dengan integrasi berbasis popup.
Karena itu, keputusan policy sebaiknya ditempatkan pada batas route atau aplikasi, bukan sebagai header sembarang yang disalin ke setiap respons. Halaman callback pembayaran, dashboard akun, dan landing page publik dapat memiliki kebutuhan opener yang berbeda.
unsafe-none mempertahankan perilaku default yang luas
unsafe-none adalah nilai default COOP. Nilai ini mengizinkan pembagian BCG yang luas berdasarkan aturan pencocokan policy dan tidak memasukkan dokumen ke isolasi opener yang lebih kuat dari nilai COOP restriktif.
Cross-Origin-Opener-Policy: unsafe-noneMengirim nilai ini secara eksplisit dapat mendokumentasikan keputusan kompatibilitas yang disengaja, tetapi tidak tepat dianggap sebagai pengaturan protektif. Jika sebuah route tidak membutuhkan isolasi opener, aplikasi dapat menerima pertukaran tersebut. Route sensitif layak dinilai secara terpisah agar tidak mewarisi nilai paling longgar tanpa sengaja.
COOP dan noopener menangani masalah terkait dari batas berbeda
Sebuah link dapat meniadakan relasi opener keluar dengan rel="noopener":
<a href="https://external.example" target="_blank" rel="noopener">
Buka situs eksternal
</a>window.open() juga dapat meminta noopener melalui window features. Kontrol tersebut bekerja pada operasi pembukaan.
COOP dikirim oleh dokumen yang disajikan dan menetapkan policy bagi relasi browsing context top-level di sekitar dokumen tersebut. Hal ini penting ketika halaman sensitif memerlukan perlindungan walaupun situs lain menjadi pihak yang membukanya.
Pemakaian noopener pada link keluar tetap berguna. COOP tidak membuat intent pada tingkat link menjadi usang; keduanya bekerja pada batas berbeda dan dapat digunakan bersama.
Cross-origin isolation memerlukan lebih dari COOP
Cross-Origin-Opener-Policy: same-origin sering ditempatkan bersama Cross-Origin-Embedder-Policy. Pasangan ini dapat memenuhi kondisi penting untuk lingkungan cross-origin isolated ketika persyaratan di sekitarnya juga terpenuhi.
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corpKedua header memiliki tugas berbeda. COOP mengisolasi relasi opener top-level melalui pemilihan BCG. COEP mengendalikan resource lintas origin yang dapat di-embed kecuali resource tersebut memberikan opt-in melalui mekanisme seperti CORS atau Cross-Origin Resource Policy.
Aplikasi sebaiknya menguji state yang dihasilkan, bukan menyimpulkannya dari satu header:
if (crossOriginIsolated) {
// API yang bergantung pada cross-origin isolation mungkin tersedia.
}Header COOP saja tidak menetapkan crossOriginIsolated === true.
Deployment memerlukan inventaris relasi window
Sebelum memperketat COOP, periksa kode yang membuka window atau mengharapkan callback melalui referensi window. Dependensi yang umum mencakup window.open(), window.opener, polling popup, serta pertukaran postMessage() yang terikat pada handle popup.
Inventaris yang berguna mencatat origin di setiap sisi, arah komunikasi yang diperlukan, dan siklus hidup relasinya. Catatan ini memisahkan kebutuhan integrasi yang nyata dari kode yang sekadar menyimpan referensi opener karena default browser mengizinkannya.
Pengujian perlu mencakup rantai navigasi aktual. Redirect dapat memindahkan popup melintasi origin dan policy, sehingga pemeriksaan pada URL awal saja dapat melewatkan titik ketika perpindahan BCG mengubah perilaku.
Rollout juga perlu mempertimbangkan kompatibilitas browser sesuai client yang didukung aplikasi. Header keamanan bekerja mengikuti implementasi browser; konfigurasi server tidak dapat memaksa client yang tidak mendukungnya untuk menerapkan semantik COOP.
Selaraskan policy dengan relasi yang diperlukan
COOP paling efektif ketika nilainya sesuai dengan topologi window halaman. same-origin memberi default kuat bagi halaman yang tidak memiliki alasan untuk mempertahankan relasi opener lintas origin. same-origin-allow-popups tersedia bagi integrasi yang membutuhkan jalur kompatibilitas terkontrol. unsafe-none mempertahankan model relasi default yang lebih luas.
Properti keamanannya spesifik: sebuah dokumen dapat membuat context top-level yang tidak kompatibel berada dalam browsing context group terpisah, sehingga memutus relasi opener yang semestinya bertahan. Batas tersebut menghapus satu kelas interaksi lintas origin tanpa berpura-pura menggantikan kontrol lain yang melindungi request, resource, message, dan data aplikasi.
Referensi
- MDN, Cross-Origin-Opener-Policy: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Opener-Policy
- MDN, Window.open(): https://developer.mozilla.org/en-US/docs/Web/API/Window/open
- WHATWG HTML, Cross-origin opener policies: https://html.spec.whatwg.org/multipage/browsers.html#cross-origin-opener-policies