Atribut Cookie: HttpOnly, Secure, SameSite
Memahami atribut keamanan cookie dan cara mengaturnya dengan benar untuk mencegah XSS dan CSRF.
Aturan main stempel tangan
Cap konser punya aturan: hanya berlaku malam ini (Expires), tidak bisa difotokopi (HttpOnly), hanya di pintu VIP (Secure), dan tidak berlaku kalau kamu datang dari calo (SameSite). Atribut cookie adalah "aturan main" yang ditempel server pada setiap cookie untuk melindunginya.
Kenapa atribut ini penting
Cookie polos tanpa atribut mudah dicuri lewat XSS (script jahat membaca document.cookie) atau disalahgunakan lewat CSRF (browser mengirim cookie ke request palsu). Tiga atribut ini adalah pertahanan berlapis yang wajib dipahami setiap web developer.
Contoh 1: cookie session yang aman
Set-Cookie: session_id=abc123; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=3600HttpOnly: tidak bisa dibaca JavaScript (document.cookietidak melihatnya). Melindungi dari pencurian via XSS.Secure: hanya dikirim lewat HTTPS. Mencegah intipan di jaringan.SameSite=Lax: dikirim ke request lintas situs hanya untuk navigasi aman (klik link), tidak untuk POST dari situs lain. Melindungi dari CSRF.Max-Age=3600: kedaluwarsa 1 jam.
Ini adalah template cookie session modern yang aman.
Contoh 2: kapan pakai SameSite=None
Set-Cookie: session_id=abc123; Secure; SameSite=None; HttpOnlyKalau frontend (app.contoh.id) dan API (api.contoh.id) beda domain dan butuh cookie lintas origin, SameSite=None diperlukan. Syarat mutlak: HARUS dengan Secure (browser menolak SameSite=None tanpa Secure). Gunakan hanya kalau benar-benar butuh; default Lax lebih aman.
Kesalahan umum
Salah: SameSite=None tanpa Secure. Browser modern menolak cookie ini. Yang benar: selalu pasangkan keduanya.
Salah: tidak pakai HttpOnly untuk session id. Script XSS bisa mencuri session. Yang benar: session id selalu HttpOnly.
Salah: mengira Secure mengenkripsi cookie. Tidak, Secure hanya memastikan pengiriman lewat HTTPS. Yang benar: enkripsi datang dari HTTPS itu sendiri.
Salah: Max-Age terlalu lama untuk session sensitif. Session banking aktif 30 hari berbahaya. Yang benar: sesuaikan dengan sensitivitas (banking: menit, media sosial: hari).
Template cookie untuk berbagai kebutuhan
Tiga resep siap pakai:
Set-Cookie: sid=abc; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=3600Session login web biasa. Aman untuk 95% kasus.
Set-Cookie: tema=gelap; Path=/; SameSite=Lax; Max-Age=31536000Preferensi non-sensitif (tema). Tidak perlu HttpOnly/Secure karena dibaca JavaScript.
Set-Cookie: sid=abc; Domain=.contoh.id; HttpOnly; Secure; SameSite=NoneDibutuhkan lintas subdomain/domain. Hanya kalau benar-benar perlu.
Jangan asal copy-paste: pahami setiap atribut sebelum memakai resep ketiga.
Catatan teknis: Serangan CSRF klasik: user login di bank.contoh.id, lalu membuka situs jahat yang diam-diam submit form transfer via cookie korban.
SameSite=Laxmemblokir ini karena request POST lintas situs tidak membawa cookie.
Tantangan
Audit atribut cookie website favoritmu
Buka website yang kamu pakai sehari-hari:
- DevTools > Application > Cookies, pilih satu cookie session/login.
- Catat atributnya: HttpOnly? Secure? SameSite apa?
- Nilai: apakah sudah mengikuti template aman (HttpOnly + Secure + SameSite)?
Tulis hasil auditmu dalam 3 baris.