Apa Yang Sering Salah dengan JWT
Menyimpan JWT di localStorage (rentan XSS), tidak ada token expiry yang cukup pendek, tidak ada refresh token rotation, dan tidak ada cara untuk revoke token yang masih valid.
Arsitektur JWT yang Benar
- Access token: short-lived (15 menit), disimpan di memory
- Refresh token: long-lived (7-30 hari), disimpan di httpOnly cookie
- Refresh token rotation: setiap refresh menghasilkan pair baru
- Refresh token family: deteksi reuse attack
Implementasi di Node.js
Generate access token dengan jwt.sign(payload, secret, {expiresIn: '15m'}). Generate refresh token dengan crypto.randomUUID() dan simpan hash-nya di database untuk revocation.
Refresh Flow
Ketika access token expired, frontend secara otomatis memanggil POST /auth/refresh dengan refresh token (dari cookie). Server validasi, generate pair baru, invalidate refresh token lama.
Logout yang Benar
Logout harus menghapus httpOnly cookie DAN menginvalidate refresh token di database. Logout dari semua device: invalidate semua refresh token user.
Security Headers
Terapkan CORS yang ketat, helmet.js untuk security headers, dan rate limiting pada endpoint autentikasi.