Permissions Policy Membatasi Fitur Browser Berkemampuan Tinggi

Sebuah halaman web dapat memuat kode dari beberapa domain kepercayaan sambil tetap berbagi akses ke kapabilitas browser. Script pihak pertama, widget pihak ketiga, dan nested frame dapat berjalan dalam satu permukaan aplikasi. Prompt izin browser tetap penting, tetapi aplikasi dapat mempersempit dokumen yang berhak meminta atau memakai fitur tertentu sebelum prompt menjadi relevan.

Permissions Policy menyediakan batas tersebut. Header response menyatakan origin mana yang boleh memakai fitur terkontrol di dalam dokumen dan frame tree-nya. Policy ini tidak memberikan izin pengguna. Fungsinya membatasi ketersediaan fitur di browser.

Permissions-Policy: camera=(), microphone=(), geolocation=(self)

Pada konfigurasi ini, akses camera dan microphone dinonaktifkan oleh policy, sedangkan geolocation dibatasi ke origin dokumen itu sendiri.

Header menetapkan allowlist

Setiap directive policy menyebut fitur dan allowlist. Daftar kosong menonaktifkan fitur. self menunjuk origin dokumen. Origin eksplisit dapat dicantumkan ketika deployment perlu mendelegasikan fitur ke origin lain.

Permissions-Policy: geolocation=(self "https://maps.example.net")

Header ini paling berguna ketika mencerminkan peta kapabilitas aplikasi yang nyata. Situs tanpa alur camera dapat menonaktifkan akses camera secara global alih-alih membiarkan kapabilitas tersebut tersedia bagi setiap dokumen yang sebaliknya memenuhi syarat.

Ini merupakan pengurangan kapabilitas yang terekspos, bukan pengganti authorization aplikasi atau pemeriksaan izin browser.

Batas frame berpengaruh

Konten tertanam merupakan alasan umum untuk menetapkan policy eksplisit. Dokumen top-level dapat membatasi fitur yang diwarisi descendant, sedangkan iframe dapat membawa atribut allow yang mengontrol lebih lanjut fitur yang didelegasikan ke frame tersebut.

<iframe
  src="https://maps.example.net/widget"
  allow="geolocation">
</iframe>

Delegasi bukan sekadar permintaan iframe untuk memperoleh otoritas tambahan. Hasil efektif dibatasi oleh policy yang diwarisi dari ancestor sekaligus deklarasi frame itu sendiri. Child frame tidak dapat memakai atribut allow untuk melewati policy ancestor yang lebih ketat.

Properti ini membuat aplikasi peng-embed tetap memegang kendali atas kapabilitas browser yang terekspos ke konten pihak ketiga.

Penolakan policy terpisah dari persetujuan pengguna

Permissions Policy dan izin pengguna bekerja pada lapisan berbeda. Fitur yang diblokir policy tidak tersedia bagi dokumen meski pengguna sebelumnya telah memberikan izin terkait. Sebaliknya, mengizinkan fitur melalui policy tidak otomatis memenuhi persyaratan izin yang diterapkan browser.

Model ringkasnya:

policy mengizinkan fitur
        |
        v
izin browser atau aturan fitur lain
        |
        v
fitur dapat menjadi tersedia

Pemisahan ini mencegah interpretasi keliru bahwa header tersebut merupakan mekanisme pemberian izin. Ia berfungsi sebagai batas atas kapabilitas.

Mulai dari fitur yang tidak diperlukan aplikasi

Policy praktis dapat dimulai dengan menonaktifkan kapabilitas sensitif yang tidak memiliki kegunaan valid di aplikasi. Pendekatan ini membentuk baseline sempit tanpa membutuhkan daftar origin spekulatif.

Permissions-Policy: camera=(), microphone=(), geolocation=(), usb=()

Nama fitur dan dukungan browser berbeda-beda, sehingga policy produksi perlu diperiksa terhadap fitur yang benar-benar diterapkan browser target. Directive yang tidak didukung user agent tidak dapat memberikan enforcement yang diharapkan pada browser tersebut.

Ketika sebuah fitur diperlukan, delegasi sebaiknya mengikuti origin dan scope frame terkecil yang mendukung alur tersebut.

Widget pihak ketiga memerlukan tinjauan kapabilitas eksplisit

Service tertanam dapat memerlukan satu fitur browser tanpa alasan operasional untuk menerima fitur lain. Memperlakukan seluruh frame pihak ketiga secara sama memperluas paparan kapabilitas dan membuat perubahan integrasi berikutnya lebih sulit diaudit.

Inventaris kapabilitas dapat mencatat relasinya secara langsung:

origin frame                  fitur yang diperlukan
maps.example.net              geolocation
video.example.net             camera, microphone
analytics.example.net         tidak ada

Policy yang dihasilkan kemudian dapat ditinjau bersama CSP, iframe sandboxing, dan authorization aplikasi. Kontrol tersebut melindungi batas yang berbeda. CSP terutama membatasi sumber pemuatan dan eksekusi konten; iframe sandboxing mengubah perilaku yang tersedia bagi frame; Permissions Policy mengatur fitur browser yang ditetapkan.

Pengujian perlu memverifikasi batas efektif

Header dapat hadir secara sintaksis tetapi tidak mewakili hierarki frame yang dimaksud. Integration test perlu menjalankan jalur embedding sebenarnya dan memastikan frame yang diizinkan dapat memakai kapabilitas yang dibutuhkan sementara frame lain tidak dapat memakainya.

Developer tooling browser juga dapat menampilkan diagnostic terkait policy. Automated test tetap bernilai karena delegasi dapat berubah ketika widget berpindah ke origin lain atau memperoleh lapisan nesting tambahan.

Tinjauan policy perlu mencakup redirect dan URL iframe yang dihasilkan secara dinamis. Origin allowlist hanya cocok dengan origin yang dicakup sintaksnya; perubahan deployment karena itu dapat mengubah batas kapabilitas efektif tanpa perubahan pada kode aplikasi yang memanggil browser API.

Minimalisasi kapabilitas berada di batas dokumen

Permissions Policy paling efektif sebagai kontrol least-capability. Aplikasi top-level menetapkan fitur browser yang memang diperlukan dalam document tree, lalu hanya mendelegasikan bagian yang dibutuhkan konten tertanam tertentu.

Batas ini tidak membuat kode pihak ketiga menjadi tepercaya dan tidak menggantikan consent, authorization, CSP, atau sandboxing. Policy menghapus kapabilitas browser dari dokumen yang tidak memiliki kebutuhan operasional atas fitur tersebut, sehingga otoritas yang tersedia mengecil ketika kode tertanam berperilaku tidak terduga atau integrasi berubah.

Referensi