Pantau & Putus Akses Perangkat dari Jarak Jauh
Melihat daftar semua ponsel dan komputer yang sedang login ke akun, serta bisa mengeluarkan perangkat lain kapan saja jika lupa keluar di komputer kantor.
Melihat daftar semua ponsel dan komputer yang sedang login ke akun, serta bisa mengeluarkan perangkat lain kapan saja jika lupa keluar di komputer kantor.
Tantangan & Kebutuhan Pengguna
JWT stateless murni tidak dapat dicabut sebelum masa berlakunya habis. Dalam aplikasi enterprise, celah ini sangat berisiko: ketika seorang karyawan dinonaktifkan, rolenya diturunkan, atau password-nya bocor di komputer publik, token JWT lama tetap bisa mengakses sistem hingga kedaluwarsa. Sebaliknya, jika hanya menggunakan session ID murni tanpa tanda tangan kriptografi, aplikasi kehilangan kemampuan verifikasi cepat di lapisan Edge Proxy.
Kecepatan tanda tangan kriptografi JWT di tepi jaringan dan kendali penuh pencabutan sesi di database dapat bekerja berdampingan melalui duet klaim sid dan sessionVersion.
Solusi & Cara Kerja
Saat pengguna berhasil login, sistem mencatat baris baru di tabel `user_sessions` (menyimpan alamat IP, User-Agent perangkat, dan waktu kedaluwarsa 12 jam) lalu menerbitkan JWT HS256 yang memuat klaim `sid` (UUID sesi perangkat) dan `ver` (`sessionVersion` milik akun user). Pada setiap request ke area terproteksi, fungsi `getSession()` memverifikasi tanda tangan JWT dengan `jose`, mencocokkan keberadaan `sid` di tabel `user_sessions`, memastikan `user.isActive` bernilai `true`, dan membandingkan `payload.ver === user.sessionVersion`.
Detail & Hal yang Diperhatikan
- Write Amplification pada `lastSeenAt`: Jika kolom waktu aktif perangkat diperbarui pada setiap pembacaan halaman, database akan kebanjiran operasi UPDATE. Sistem menahan pembaruan `lastSeenAt` sehingga hanya menulis ke disk maksimal satu kali setiap 5 menit per perangkat.
- Global Invalidation Otomatis: Setiap kali password diubah, MFA diaktifkan/dinonaktifkan, atau role akun diubah oleh admin, nilai `sessionVersion` dinaikkan (`{ increment: 1 }`) sehingga seluruh token JWT di perangkat lain langsung gugur seketika.
- Proteksi Self-Revoke di UI: Pada halaman `/dashboard/security`, fungsi `revokeSession` secara eksplisit menolak pencabutan `currentSessionUuid` dari daftar perangkat agar pengguna tidak memutus sesinya sendiri secara tidak sengaja tanpa alur logout resmi.
Pastikan variabel lingkungan SESSION_SECRET memiliki panjang minimal 32 karakter acak kriptografis; fungsi `getKey()` akan langsung melempar exception jika panjang secret di bawah standar tersebut.