Strict-Transport-Security
Penggunaan
Header Strict-Transport-Security adalah mekanisme di balik HTTP Strict Transport Security (HSTS). Ketika browser menerima header ini melalui koneksi aman, browser mencatat direktif tersebut dan secara otomatis meningkatkan semua permintaan HTTP berikutnya menjadi HTTPS untuk domain yang ditentukan. Jika koneksi aman tidak tersedia, browser menolak akses sepenuhnya alih-alih kembali ke HTTP biasa.
Header ini hanya dipatuhi bila dikirimkan melalui HTTPS. Response yang disajikan melalui HTTP biasa yang memuat Strict-Transport-Security akan diabaikan, karena penyerang di jalur jaringan dapat menyisipkan atau memodifikasi header tersebut.
Header ini menerima tiga direktif: max-age, includeSubDomains, dan preload.
max-age
Direktif max-age bersifat wajib. Nilainya menentukan jumlah detik browser mengingat untuk menerapkan HTTPS pada domain tersebut. Nilai produksi yang umum adalah 63072000 (dua tahun). Menyetel max-age=0 akan langsung menghapus entri HSTS dari cache browser.
includeSubDomains
Direktif includeSubDomains memperluas pemaksaan HTTPS ke setiap subdomain dari host tersebut. Tanpa direktif ini, HSTS hanya berlaku untuk domain persis yang ada pada response. Menambahkan includeSubDomains mencegah penyerang memanfaatkan subdomain berbasis HTTP biasa untuk menyetel Cookie atau mengalihkan trafik.
preload
Direktif preload bukan bagian dari spesifikasi HSTS. Vendor browser memelihara daftar HSTS preload, dan direktif preload menandakan niat pemilik domain untuk disertakan di dalamnya. Begitu sebuah domain muncul pada daftar preload, browser menerapkan HTTPS sejak koneksi pertama, sehingga menghilangkan jendela kerentanan sebelum header Strict-Transport-Security pertama diterima. Mengajukan sebuah domain ke daftar preload mensyaratkan max-age minimal satu tahun (31536000 detik) dan direktif includeSubDomains.
Contoh
Sebuah server yang menerapkan HTTPS selama dua tahun pada seluruh subdomain, dengan kelayakan preload:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Konfigurasi minimal yang menetapkan HSTS selama enam bulan hanya pada domain utama:
Strict-Transport-Security: max-age=15768000
Menghapus entri HSTS dengan menyetel ulang max-age menjadi nol, berguna saat migrasi atau pengujian:
Strict-Transport-Security: max-age=0
Pemecahan masalah
Masalah HSTS cenderung muncul sebagai kegagalan koneksi atau loop redirect yang tetap bertahan bahkan setelah perubahan di server, karena browser menyimpan kebijakan tersebut secara lokal.
Terkunci di luar setelah mengaktifkan HSTS dengan max-age yang panjang. Begitu browser mencatat kebijakan HSTS, semua permintaan otomatis ditingkatkan ke HTTPS. Kembali ke HTTP tidak dimungkinkan sampai max-age kedaluwarsa atau pengguna menghapus entri HSTS secara manual. Pada Chrome, buka chrome://net-internals/#hsts, masukkan nama domain di bawah “Delete domain security policies,” lalu hapus entri tersebut. Pada Firefox, tutup browser, edit SiteSecurityServiceState.txt di folder profil, lalu hapus baris domain yang bersangkutan.
Subdomain rusak akibat includeSubDomains. Menambahkan includeSubDomains memaksa HTTPS pada setiap subdomain, termasuk perkakas internal, server staging, dan layanan lama yang tidak memiliki sertifikat valid. Pastikan setiap subdomain menyajikan sertifikat TLS tepercaya sebelum mengaktifkan direktif ini. Hapus includeSubDomains dan kerahkan ulang header dengan max-age=0 untuk membersihkan entri yang tersimpan di cache apabila ada subdomain yang rusak.
Penghapusan dari daftar preload memakan waktu berbulan-bulan. Daftar HSTS preload dikirimkan bersama rilis browser, sehingga penghapusan mengharuskan pengajuan permintaan di hstspreload.org, menunggu pembaruan daftar berikutnya, dan menunggu pembaruan tersebut sampai ke pengguna melalui peningkatan versi browser. Proses ini memakan waktu beberapa bulan. Perlakukan preload sebagai komitmen jangka panjang dan pastikan kesiapan HTTPS secara penuh sebelum mengajukannya.
Header HSTS yang dikirim melalui HTTP biasa akan diabaikan. Browser membuang header Strict-Transport-Security ketika response tiba melalui koneksi yang tidak terenkripsi. Header ini hanya berlaku pada response HTTPS. Pastikan header tersebut ada pada response HTTPS dengan memeriksanya menggunakan: curl -sI https://example.re | grep -i strict.
Error mixed content setelah mengaktifkan HSTS. HSTS meningkatkan halaman ke HTTPS, tetapi sumber daya tertanam yang masih mereferensikan URL http:// memicu peringatan atau pemblokiran mixed content. Audit seluruh URL sumber daya (gambar, skrip, stylesheet, endpoint API) dan perbarui referensinya agar menggunakan https:// atau jalur protocol-relative. Direktif CSP upgrade-insecure-requests menangani hal ini secara otomatis untuk sisa URL HTTP yang masih tertulis secara hard-code.
Kegagalan perpanjangan sertifikat yang menyebabkan situs terkunci total. Sertifikat yang kedaluwarsa atau tidak valid pada domain yang dilindungi HSTS mengakibatkan kegagalan keras tanpa opsi bypass bagi pengguna. Browser menolak menampilkan situs tersebut maupun menawarkan opsi “proceed anyway”. Otomatiskan perpanjangan sertifikat (certbot Let’s Encrypt menangani hal ini dengan cron job) dan pantau tanggal kedaluwarsa sertifikat. Pasang peringatan setidaknya 14 hari sebelum kedaluwarsa.