Permissions Policy Membatasi Akses Fitur Browser

Sebuah dokumen web dapat memuat kode first-party, script third-party, dan frame tertanam yang berjalan dari origin berbeda. API browser menambah batas lain: sebagian fitur mengekspos sensor, perangkat media, state display, atau kapabilitas lain yang tidak selalu perlu tersedia bagi setiap konteks tertanam.

Permissions-Policy memungkinkan sebuah respons menyatakan origin mana yang boleh memakai fitur browser tertentu pada dokumen dan turunannya. Policy ini merupakan batas kapabilitas, bukan pengganti permission prompt yang ditampilkan kepada pengguna. Sebuah fitur dapat diizinkan oleh policy tetapi tetap ditolak oleh permission state browser, pengaturan platform, persyaratan secure context, atau kondisi khusus API lainnya.

Respons dapat menghapus kapabilitas dari document tree

Policy yang restriktif dapat dikirim melalui header respons HTTP:

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

Pada konfigurasi ini, geolocation diizinkan untuk origin respons melalui self. Allowlist kosong untuk camera dan microphone menonaktifkan kedua fitur tersebut bagi dokumen dan frame yang berada di bawah policy itu.

Batas negatif seperti ini berguna untuk keamanan. Aplikasi yang tidak pernah memerlukan kamera dapat menolaknya pada tingkat dokumen, tanpa bergantung pada setiap script dan komponen tertanam untuk tidak memanggil API tersebut.

Nama fitur dan dukungan browser tidak seragam pada setiap implementasi. Deployment perlu menyusun policy berdasarkan fitur yang didukung browser target dan menguji perilaku akhirnya, bukan menganggap directive yang tidak dikenali tetap memberikan enforcement.

Mengizinkan fitur tidak memberikan permission pengguna

Permissions Policy dan permission state browser menjawab pertanyaan yang berbeda.

Policy menentukan apakah sebuah dokumen memenuhi syarat untuk memakai controlled feature. Sistem permission secara terpisah dapat meminta keputusan pengguna sebelum API mengembalikan data sensitif atau mengaktifkan perangkat.

permintaan fitur
      |
      v
diizinkan Permissions Policy?
      |
      +-- tidak -> diblokir policy
      |
      `-- ya
            |
            v
      pemeriksaan khusus API
      permission state
      secure context
      kondisi platform

Policy yang permisif tidak otomatis menyetujui akses kamera, mikrofon, atau geolocation. Sebaliknya, permission browser yang sudah pernah diberikan tidak membuat sebuah frame dapat melewati policy yang menonaktifkan fitur tersebut untuk konteks itu.

Pemisahan lapisan ini penting saat menganalisis insiden. Munculnya permission prompt bukan bukti bahwa seluruh hubungan embedding sudah dibatasi dengan tepat, sedangkan header restriktif bukan bukti bahwa pengguna telah memberikan permission API.

Delegasi frame bersifat eksplisit

Konten tertanam sering hanya memerlukan sebagian kecil kapabilitas milik aplikasi tingkat atas. Sebuah iframe dapat memakai atribut allow untuk mengontrol akses fitur pada frame tersebut:

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

Policy pada frame bekerja di dalam batas yang diwarisi dari ancestor. Atribut iframe tidak dapat memulihkan kapabilitas yang sudah dihapus oleh Permissions Policy pada konteks di atasnya.

Urutan ini mencegah deklarasi child memperluas kewenangan melampaui batas yang sudah ditetapkan ancestor. Delegasi paling tepat dipakai ketika policy tingkat atas mengizinkan sebuah kapabilitas untuk kasus embedding yang disengaja, lalu deklarasi frame mempersempit lokasi tersedianya kapabilitas tersebut.

Frame cross-origin perlu perhatian khusus. Widget yang membutuhkan controlled feature sebaiknya hanya menerima fitur dan cakupan origin yang diperlukan integrasi, bukan kumpulan kapabilitas lain yang tidak terkait.

Default allowlist berbeda untuk setiap fitur

Permissions Policy tidak memiliki satu default universal bagi seluruh controlled feature. Setiap fitur mempunyai default allowlist sendiri, dan default tersebut memengaruhi perilaku ketika respons tidak menyertakan directive terkait.

Karena itu, directive yang tidak dicantumkan berbeda dari allowlist kosong yang dinyatakan secara eksplisit.

Permissions-Policy: camera=()

Baris tersebut menyatakan penolakan camera secara sengaja. Jika camera tidak dicantumkan, perilakunya mengikuti default fitur tersebut dan state policy di sekitarnya.

Aplikasi sensitif terhadap keamanan mendapat batas yang lebih jelas dengan directive eksplisit untuk kapabilitas yang memang hendak ditolak. Policy eksplisit juga memudahkan review karena batas yang diinginkan terlihat pada konfigurasi respons, bukan disimpulkan dari default browser yang berbeda antarfitur.

Policy ancestor membatasi descendant

Inheritance policy menjadi penting ketika frame tersusun bertingkat. Dokumen tingkat atas dapat membatasi sebuah fitur sebelum descendant frame menerapkan deklarasinya sendiri.

Pertimbangkan hierarki berikut:

app.example
  |
  +-- partner.example
        |
        `-- tool.example

Jika policy tingkat atas menonaktifkan controlled feature untuk frame partner, frame yang lebih dalam tidak dapat mengaktifkan kembali fitur tersebut hanya dengan memintanya melalui atribut allow.

Properti ini memberi aplikasi peng-embed batas atas yang nyata terhadap kapabilitas browser yang didelegasikan. Konsekuensinya, proses diagnosis perlu memeriksa seluruh rantai ancestor. Konfigurasi sebuah frame dapat tampak benar secara lokal tetapi tetap tidak memenuhi syarat karena parent menetapkan policy yang lebih ketat.

Policy perlu mengikuti graph embedding yang nyata

Header yang disalin dari aplikasi lain dapat terlalu luas atau justru mengganggu integrasi. Policy yang berguna berangkat dari graph frame dan kebutuhan kapabilitas situs yang benar-benar digunakan.

Untuk setiap controlled feature, pertanyaannya bersifat konkret: apakah aplikasi tingkat atas memakainya, apakah origin tertanam membutuhkannya, dan ancestor mana yang bertanggung jawab atas delegasi? Allowlist kemudian dapat mencerminkan hubungan tersebut secara langsung.

Situs tanpa penggunaan mikrofon yang sah dapat menyatakan:

Permissions-Policy: microphone=()

Situs yang memakai geolocation hanya pada origin sendiri dapat menyatakan:

Permissions-Policy: geolocation=(self)

Delegasi yang lebih kompleks perlu diuji dengan origin dan jalur navigasi yang benar-benar dipakai di produksi. Redirect, host alternatif, sandboxed frame, dan nested embed dapat mengubah konteks tempat policy dievaluasi.

Diagnostik console adalah bukti observasi, bukan enforcement

Browser dapat melaporkan pelanggaran policy atau pemakaian fitur yang diblokir melalui developer tooling. Pesan tersebut berguna ketika policy baru mengganggu integrasi, terutama jika panggilan yang diblokir berasal dari frame third-party.

Diagnostik tidak seharusnya menjadi kontrol keamanan. Enforcement produksi berasal dari policy yang dikirim bersama dokumen dan implementasi controlled feature pada browser. Output console merupakan permukaan observasi untuk memvalidasi batas tersebut.

Automated browser test dapat melengkapi inspeksi manual dengan menjalankan halaman yang seharusnya menerima atau menolak kapabilitas tertentu. Pengujian perlu mencakup jalur yang diizinkan maupun ditolak, termasuk nested frame ketika delegasi menjadi bagian dari desain.

Pertahankan batas yang sempit dan dapat diuji

Permissions Policy paling efektif ketika menyatakan peta kapabilitas yang kecil dan disengaja. Nonaktifkan fitur yang tidak diperlukan aplikasi, batasi fitur yang dibutuhkan ke origin yang memang memerlukannya, dan selaraskan delegasi iframe dengan policy respons.

Header ini tidak mengautentikasi konten tertanam, melakukan sanitasi script, menegakkan otorisasi aplikasi, atau menggantikan Content Security Policy. Ia mengontrol batas browser yang terpisah: kelayakan untuk memanggil fitur tertentu dari sebuah konteks dokumen.

Dengan memisahkan batas tersebut, konfigurasi menjadi lebih mudah diaudit. Dokumen dapat mengekspos hanya kapabilitas browser yang diperlukan graph embedding-nya, sementara permission pengguna, pemeriksaan origin, otorisasi aplikasi, dan kontrol konten tetap ditangani oleh lapisan masing-masing.