Lompat ke konten
Kembali ke modul

API, Autentikasi, dan Keamanan · 4/7

Session, cookie, dan token

Bagaimana server mengingat siapa kamu, dan kenapa httpOnly bukan pilihan opsional.

Baca 32 menit

Setelah pelajaran ini kamu bisa

  • Menjelaskan bagaimana protokol stateless bisa mengingat seorang user
  • Mengatur cookie dengan flag keamanan yang tepat
  • Memilih antara session database dan token
  • Menjelaskan kenapa token session di-hash sebelum disimpan

HTTP bersifat stateless: server tidak punya memori tentang request terakhirmu. Jadi setelah login berhasil, server memberi browser sebuah token, dan browser mengirimkannya kembali di setiap request berikutnya. Itu seluruh isi sebuah session.

ts
const store = await cookies();
store.set("session", token, {
  httpOnly: true,                                  // JavaScript cannot read it
  secure: process.env.NODE_ENV === "production",   // HTTPS only
  sameSite: "lax",                                 // not sent on cross-site POSTs
  path: "/",
  expires: expiresAt,
});
Ini createSession dari proyek ini, tanpa perubahan. Setiap flag di situ punya fungsi penting.
FlagMencegah
httpOnlyBug XSS membaca cookie-nya dengan document.cookie
secureCookie berjalan lewat HTTP biasa di mana ia bisa dibaca
sameSite: "lax"Cookie terkirim pada POST lintas situs — pertahanan CSRF
expiresCookie yang dicuri bekerja selamanya
pathMengirimnya ke route yang tidak membutuhkannya

Dua desain

Session databaseToken bertanda tangan (JWT)
Cookie menyimpanSebuah id acakDatanya sendiri, bertanda tangan
Biaya verifikasiSatu pencarian databaseTanpa pencarian sama sekali
PencabutanHapus row-nya — seketikaSulit: ia valid sampai kedaluwarsa
Memuat data userTidakYa, bisa dibaca siapa pun yang memegangnya
Cocok untukAplikasi web biasaBanyak layanan, atau tanpa database bersama

Hash token-nya sebelum disimpan

Cookie-nya menyimpan token acak. Database hanya menyimpan SHA-256-nya. Kalau seseorang mendapatkan salinan database, yang mereka dapat adalah hash yang tidak bisa diubah kembali jadi cookie yang berfungsi.

Coba sendiri

Pembuatan token sungguhan dan SHA-256 sungguhan. Perhatikan kenapa hash biasa tepat di sini, berbeda dari untuk password.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Tugas praktik

Masuk ke proyek ini, lalu buka DevTools → Application → Cookies. Temukan cookie session dan pastikan HttpOnly serta SameSite-nya diatur. Sekarang jalankan document.cookie di console — cookie session-nya tidak ada, karena httpOnly menyembunyikannya dari script. Lalu lihat tabel sessions di database dan pastikan nilai yang tersimpan di sana bukan nilai yang ada di browser-mu.

Hasil yang diharapkan

HttpOnly tercentang, tidak ada di document.cookie, dan hash hex 64 karakter di database.