Jose dan pencabutan sesi
Jose menandatangani dan memverifikasi JWT di cookie httpOnly yang dipadukan dengan tabel sesi perangkat di database.
Membaca sekitar 1 menit
Jose menandatangani dan memverifikasi JWT di cookie httpOnly yang dipadukan dengan tabel sesi perangkat di database.
Token menyimpan id sesi (sid) dan versi sesi (ver). Hak akses dan keaktifan akun dibaca dari database tiap request, sehingga perubahan role atau pencabutan perangkat langsung berlaku.
Menjawab kelemahan klasik JWT yang tidak bisa dicabut sebelum kedaluwarsa dengan menggabungkan klaim sid dan sessionVersion.
Dilema klasik memakai JWT
Banyak aplikasi memilih JWT di cookie httpOnly karena praktis dan bisa diverifikasi cepat dengan pustaka Jose. Namun JWT murni punya kelemahan besar: sekali token diterbitkan, ia terus berlaku sampai waktu kedaluwarsanya habis. Kalau akun pengguna dinonaktifkan atau rolenya diturunkan, token lama masih bisa dipakai.
Kecepatan JWT dan kendali penuh sesi database tidak harus saling mengorbankan bila digabungkan dengan tepat.
Cara ngodingan ini menyelesaikannya
Di versi ini, JWT yang ditandatangani Jose tidak berdiri sendiri. Saat login berhasil, server mencatat baris baru di tabel user_sessions (berisi IP, User-Agent, dan waktu kedaluwarsa 12 jam), lalu menyisipkan id sesi (sid) serta nomor versi sesi pengguna (ver) ke dalam JWT:
const token = await new SignJWT({
ver: sessionVersion,
sid: session.uuid,
})
.setProtectedHeader({ alg: "HS256" })
.setSubject(userUuid)
.setIssuedAt()
.setExpirationTime(exp)
.sign(getKey());Dampaknya saat izin atau status akun berubah
Setiap kali getSession() dipanggil—dan dibungkus React cache() agar hanya menjalankan satu query per request—server mencocokkan sid di tabel user_sessions dan membandingkan ver di token dengan kolom sessionVersion milik user di database.
- Saat admin mengubah role atau menonaktifkan akun seseorang, perubahan itu berlaku pada detik itu juga tanpa menunggu pengguna logout.
- Saat pengguna mengganti password, mengubah email, atau menyalakan MFA, nilai sessionVersion dinaikkan (+1) sehingga seluruh sesi di perangkat lain otomatis gugur.
- Pengguna bisa membuka halaman Keamanan Akun, melihat daftar perangkat yang sedang aktif (browser, sistem operasi, alamat IP), dan mencabut sesi perangkat tertentu kapan saja.
- Agar database tidak dihujani operasi tulis di setiap klik halaman, kolom lastSeenAt hanya diperbarui maksimal setiap 5 menit sekali.
Ringkasnya
Jose menjaga agar tanda tangan cookie tidak bisa dipalsukan di tepi jaringan, sementara duet klaim sid dan sessionVersion memberi kita kendali penuh untuk mencabut akses perangkat mana pun secara instan.