cookiekeamananxssMenengah3 mnt baca

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.

http
Set-Cookie: session_id=abc123; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=3600
  • HttpOnly: tidak bisa dibaca JavaScript (document.cookie tidak 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

http
Set-Cookie: session_id=abc123; Secure; SameSite=None; HttpOnly

Kalau 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).

Tiga resep siap pakai:

http
Set-Cookie: sid=abc; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=3600

Session login web biasa. Aman untuk 95% kasus.

http
Set-Cookie: tema=gelap; Path=/; SameSite=Lax; Max-Age=31536000

Preferensi non-sensitif (tema). Tidak perlu HttpOnly/Secure karena dibaca JavaScript.

http
Set-Cookie: sid=abc; Domain=.contoh.id; HttpOnly; Secure; SameSite=None

Dibutuhkan 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=Lax memblokir ini karena request POST lintas situs tidak membawa cookie.

Tantangan

Audit atribut cookie website favoritmu

Buka website yang kamu pakai sehari-hari:

  1. DevTools > Application > Cookies, pilih satu cookie session/login.
  2. Catat atributnya: HttpOnly? Secure? SameSite apa?
  3. Nilai: apakah sudah mengikuti template aman (HttpOnly + Secure + SameSite)?

Tulis hasil auditmu dalam 3 baris.