Subresource Integrity (SRI) — Security

Apa itu Subresource Integrity? SRI (Subresource Integrity) adalah fitur keamanan browser yang memverifikasi bahwa file yang diambil dari CDN atau server…

Apa itu Subresource Integrity?

SRI (Subresource Integrity) adalah fitur keamanan browser yang memverifikasi bahwa file yang diambil dari CDN atau server eksternal tidak dimodifikasi. Browser membandingkan hash file yang diunduh dengan hash yang ada di atribut integrity.

Kenapa SRI Penting?

Cara Menggunakan SRI

<!-- Tanpa SRI — tidak ada verifikasi -->
<script src="https://cdn.example.com/lib.js"></script>

<!-- Dengan SRI — browser verifikasi hash sebelum eksekusi -->
<script
    src="https://cdn.example.com/lib.js"
    integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8w"
    crossorigin="anonymous"
></script>

<!-- SRI juga bisa untuk CSS -->
<link
    rel="stylesheet"
    href="https://cdn.example.com/styles.css"
    integrity="sha384-abc123..."
    crossorigin="anonymous"
/>

Generate SRI Hash

# Menggunakan openssl di terminal
cat lib.js | openssl dgst -sha384 -binary | openssl base64 -A
# Output: oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8w

# Menggunakan shasum
shasum -b -a 384 lib.js | awk '{ print $1 }' | xxd -r -p | base64

# Online tool: https://www.srihash.org/

Multiple Hashes

<!-- Bisa menyediakan beberapa hash algorithm -->
<script
    src="https://cdn.example.com/lib.js"
    integrity="sha256-abc123... sha384-def456..."
    crossorigin="anonymous"
></script>
<!-- Browser menggunakan hash algorithm yang paling kuat -->

SRI di Build Tools

// Vite: generate SRI otomatis
// vite.config.js
import sri from "rollup-plugin-sri";
export default {
    plugins: [sri()]
};

// Webpack: html-webpack-plugin dengan SRI
const SriPlugin = require("webpack-subresource-integrity");
module.exports = {
    output: { crossOriginLoading: "anonymous" },
    plugins: [new SriPlugin({ hashFuncNames: ["sha384"] })]
};

Keterbatasan SRI

Best Practices

Yang akan kamu pelajari