Checklist Header Keamanan HTTP (dengan Konfigurasi Copy-Paste)
Beberapa header respons bisa memblokir berbagai jenis serangan, seperti clickjacking, MIME sniffing, downgrade protokol, dan sebagian besar XSS, dengan biaya nyaris nol. Berikut header yang layak kamu kirim, nilai awal yang aman, dan cara menerapkan header yang paling rumit (CSP) tanpa merusak situsmu.
Checklist
| Header | Nilai aman | Melindungi dari |
|---|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains | Downgrade ke HTTP dan pencurian cookie di Wi-Fi publik |
Content-Security-Policy | Mulai dalam mode report-only (lihat di bawah) | XSS, skrip yang disisipkan, pencurian data |
X-Content-Type-Options | nosniff | Browser menjalankan file unggahan sebagai skrip |
CSP frame-ancestors | 'self' (atau X-Frame-Options: SAMEORIGIN) | Clickjacking |
Referrer-Policy | strict-origin-when-cross-origin | Kebocoran URL lengkap (token, ID) ke situs lain |
Permissions-Policy | camera=(), microphone=(), geolocation=() | Skrip pihak ketiga yang memakai fitur perangkat |
Cek header mana saja yang sudah dikirim situsmu saat ini, lengkap dengan nilainya, di Security Headers Checker.
HSTS: mulai dari yang pendek
Begitu browser menerima HSTS, browser akan menolak HTTP biasa selama max-age. Pastikan dulu setiap subdomain sudah berjalan lewat HTTPS (cek sertifikat dengan SSL Checker), mulai dengan max-age=300, lalu naikkan menjadi satu tahun. Tambahkan preload dan daftarkan ke daftar preload HSTS hanya jika kamu yakin, karena menghapusnya butuh waktu berbulan-bulan.
Content-Security-Policy tanpa merusak situs
CSP menentukan dari mana skrip, gaya, gambar, dan koneksi boleh berasal. Terapkan dalam mode report-only, yang hanya mencatat pelanggaran tanpa memblokir apa pun:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; report-uri /csp-report
Pantau konsol browser dan endpoint laporanmu selama seminggu, tambahkan sumber yang benar-benar kamu pakai, lalu ganti nama header menjadi Content-Security-Policy. Hindari 'unsafe-inline' untuk skrip; gunakan nonce atau hash untuk skrip inline yang kamu kendalikan. Susun kebijakan sumber demi sumber dengan CSP Generator.
Konfigurasi
Nginx (di dalam server; always memastikan header tetap ada di halaman error juga):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "frame-ancestors 'self'" always;
Apache (.htaccess, dengan mod_headers):
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Vercel (vercel.json):
{ "headers": [ { "source": "/(.*)", "headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
] } ] }
Buat konfigurasi server lengkap dengan Nginx Config Generator atau .htaccess Generator.
Header yang boleh kamu hapus
X-XSS-Protection sudah usang. Browser modern telah menghapus filter yang dikendalikannya, dan 0 adalah nilai yang direkomendasikan jika kamu tetap mengirimkannya. Expect-CT sudah tidak dipakai lagi. Menyembunyikan Server dan X-Powered-By itu baik untuk kebersihan, tetapi bukan perlindungan yang nyata.