Subresource Integrity Mengikat Resource Eksternal ke Byte yang Diharapkan

Memuat script atau stylesheet dari host lain menciptakan dependensi langsung terhadap byte yang dikembalikan host tersebut. TLS melindungi koneksi selama transit, tetapi tidak menyatakan bahwa response merupakan objek persis yang dimaksudkan operator halaman untuk dieksekusi atau diterapkan.

Subresource Integrity (SRI) menambahkan syarat pada level byte. Elemen HTML dapat membawa metadata integrity berisi satu atau beberapa digest kriptografis. Browser yang mendukungnya mengambil resource, menghitung digest yang relevan, lalu memakai response hanya jika hasilnya memenuhi metadata tersebut.

Kontrol ini sengaja memiliki cakupan sempit. SRI tidak mengautentikasi pengguna, mengotorisasi request, memeriksa perilaku JavaScript, atau menjadikan kode pihak ketiga aman. SRI mengikat referensi resource ke konten yang diharapkan.

Metadata integrity membawa digest yang diharapkan

Referensi script dapat menyertakan digest bersama URL-nya:

<script
  src="https://cdn.example.net/app.min.js"
  integrity="sha384-BASE64_DIGEST"
  crossorigin="anonymous"></script>

Stylesheet dapat memakai mekanisme yang sama:

<link
  rel="stylesheet"
  href="https://cdn.example.net/app.min.css"
  integrity="sha384-BASE64_DIGEST"
  crossorigin="anonymous">

Token metadata menggabungkan nama algoritma hash dengan digest berformat Base64. Metadata SRI lazim memakai algoritma seperti sha256, sha384, atau sha512. Digest harus dihasilkan dari representasi resource yang diharapkan oleh algoritma integrity browser; nilainya bukan nama file, label versi, atau fingerprint sertifikat.

Ketidakcocokan membuat resource yang dilindungi ditolak. Untuk script, response yang sudah diambil tidak dieksekusi melalui elemen tersebut. Untuk stylesheet yang dilindungi, response yang tidak cocok tidak diterapkan melalui link itu.

Browser mengambil keputusan ini saat resource dimuat. Kode aplikasi tidak perlu mengambil objek terlebih dahulu lalu membandingkan hash sesudahnya.

Digest mengikat konten, bukan hostname

SRI mengubah pernyataan kepercayaan dari sebuah referensi resource. Tanpa metadata integrity, halaman pada dasarnya menerima response yang memenuhi syarat dari URL yang dirujuk. Dengan SRI, URL dan digest membentuk syarat yang lebih ketat: resource harus berasal dari lokasi yang diminta dan cocok dengan byte yang disetujui.

Perbedaan ini penting ketika CDN, package mirror, object store, atau lapisan distribusi lain berada di luar boundary deployment langsung aplikasi. Response HTTPS yang valid dari infrastruktur tersebut tetap dapat berisi byte yang berbeda dari versi yang dipilih operator halaman. SRI dapat mencegah byte yang berubah itu dipakai oleh elemen yang dilindungi.

Perlindungan tersebut juga berlaku pada penggantian yang tidak disengaja. Deployment yang menimpa URL asset stabil dengan build baru sementara HTML masih membawa digest lama akan menghasilkan kegagalan pemuatan, bukan menerima objek baru secara diam-diam.

Perilaku itu sekaligus menjadi properti keamanan dan batas operasional. Setiap perubahan byte yang disengaja memerlukan metadata integrity yang sesuai pada dokumen yang mereferensikannya.

Load lintas origin juga melibatkan CORS

Pemeriksaan integrity tidak menghapus aturan cross-origin browser. Untuk resource yang diambil dari origin lain, response juga harus memenuhi syarat yang berlaku bagi SRI dan fetch lintas origin. Pola yang umum memakai crossorigin="anonymous" pada elemen dan mengonfigurasi server resource dengan response CORS yang sesuai.

Kedua kontrol memiliki peran berbeda. CORS menentukan apakah response lintas origin memenuhi syarat untuk dibagikan pada konteks browser yang relevan. SRI memeriksa apakah byte response yang memenuhi syarat tersebut cocok dengan digest yang dideklarasikan. Lolos dari satu pemeriksaan tidak berarti lolos dari pemeriksaan lainnya.

Pemisahan ini berguna saat mendiagnosis insiden. Resource dapat gagal karena digest sudah tidak sesuai, header response cross-origin tidak cocok, request jaringan gagal, atau kebijakan browser lain memblokir pemuatan. Menganggap setiap kegagalan yang terkait SRI sebagai masalah hash dapat menutupi boundary yang sebenarnya menolak response.

Beberapa digest mendukung transisi terkontrol

Atribut integrity dapat memuat beberapa token metadata yang dipisahkan whitespace. Ini memungkinkan dokumen membawa lebih dari satu digest yang dapat diterima sesuai aturan pemrosesan SRI.

Kemampuan tersebut dapat membantu transisi, tetapi sebaiknya tidak berubah menjadi daftar versi historis tanpa batas. Setiap digest yang diterima memperbesar himpunan byte yang dapat memenuhi kondisi integrity elemen. Digest lama sebaiknya dipertahankan hanya selama versi resource terkait memang masih valid untuk referensi tersebut.

Pemilihan algoritma juga penting. Browser mengevaluasi algoritma integrity yang didukung sesuai aturan pemrosesan SRI, bukan memperlakukan kumpulan token sembarang sebagai string fallback yang independen. Tooling deployment sebaiknya menghasilkan metadata secara konsisten dan memverifikasi HTML hasil render daripada mengandalkan penyuntingan digest manual.

URL mutable memerlukan deployment yang terkoordinasi

SRI paling cocok ketika konten resource immutable atau memiliki versi. URL seperti /assets/app.8f31c2.js dapat dipasangkan dengan metadata integrity yang tetap stabil selama umur objek tersebut. URL mutable seperti /assets/app.js memerlukan koordinasi lebih ketat karena penggantian byte membuat dokumen yang masih membawa digest sebelumnya menjadi tidak valid.

Caching dapat memperpanjang jendela koordinasi tersebut. Dokumen HTML lama mungkin merujuk digest lama sementara URL asset mutable kini menyajikan body baru. Kegagalan yang terjadi sesuai dengan kontrak SRI: byte tidak lagi cocok dengan ekspektasi yang dideklarasikan dokumen.

Nama asset content-addressed atau ber-fingerprint mengurangi ambiguitas ini. Build baru dapat menerbitkan URL dan digest baru sementara HTML lama tetap merujuk objek immutable sebelumnya. SRI kemudian menjadi pemeriksaan byte tambahan, bukan kompensasi untuk kontrak deployment yang mutable.

Pembuatan digest sebaiknya berada di jalur build

Metadata integrity manual rapuh untuk asset yang sering berubah. Jalur rilis yang lebih aman menghasilkan digest dari artifact persis yang akan dipublikasikan, menulis metadata hasilnya ke HTML yang dibuat, lalu menjaga revisi asset dan dokumen tetap terkoordinasi.

Input yang penting adalah byte resource final. Minification, bundling, penyisipan banner, konversi newline, atau transformasi lain yang dilakukan setelah pembuatan digest akan mengubah objek dan membuat metadata tidak valid. Pipeline sebaiknya menghitung digest setelah transformasi yang memengaruhi representasi yang dipublikasikan.

Validasi juga dapat mengambil atau memeriksa artifact rilis dan membandingkan digest-nya dengan halaman hasil render sebelum promosi. Pemeriksaan itu menangkap metadata yang sudah tidak sesuai tanpa melemahkan enforcement di sisi browser.

Metadata SRI sendiri harus dilindungi oleh integrity normal pada jalur pengiriman HTML. Penyerang yang dapat menulis ulang dokumen secara arbitrer juga dapat menghapus atau mengganti atribut integrity. Karena itu, SRI bukan pengganti pengamanan origin yang menyajikan halaman.

SRI tidak menilai maksud resource

Digest yang cocok membuktikan fakta yang terbatas: byte yang diambil memenuhi metadata integrity yang dipilih browser. Hal itu tidak menyatakan bahwa kode bebas dari kerentanan, bahwa dependensi dapat dipercaya, atau bahwa perilaku runtime-nya sesuai bagi aplikasi.

Jika script pihak ketiga yang disetujui memang mengirim data ke operatornya, SRI tidak memblokir perilaku tersebut. Jika versi yang diikat memiliki cacat keamanan, digest yang benar tetap mengizinkan versi yang cacat itu. Review dependensi, kebijakan update, Content Security Policy, boundary privilege, dan otorisasi aplikasi tetap merupakan kontrol terpisah.

SRI juga tidak menyediakan revocation dengan sendirinya. Menghapus digest yang bermasalah dari HTML baru memengaruhi dokumen yang menerima markup terbaru; dokumen dan asset yang sudah tersimpan di cache mengikuti masa cache serta perilaku browser masing-masing. Prosedur insiden perlu memperhitungkan state distribusi tersebut.

Boundary keamanan berada pada penerimaan konten yang tepat

Subresource Integrity efektif karena janjinya spesifik. Mekanisme ini memungkinkan dokumen menyatakan bahwa script atau stylesheet eksternal dapat diterima hanya jika byte yang diambil cocok dengan metadata kriptografis yang dideklarasikan.

Jaminan tersebut paling kuat ketika URL asset immutable, pembuatan digest menjadi bagian dari pipeline rilis, kebijakan response cross-origin dikonfigurasi secara sengaja, dan digest lama yang tidak lagi diperlukan dihapus. SRI tetap merupakan mekanisme pengikatan konten, bukan penilaian umum atas keamanan kode yang diizinkannya.