JWT cocok ketika beberapa layanan perlu memverifikasi klaim tanpa selalu bertanya ke session store. JWT bukan otomatis lebih aman atau lebih skalabel daripada session; ia memindahkan trade-off ke rotasi token, revocation, dan pengelolaan key.
Isi token sesedikit mungkin
{
"iss": "https://auth.example.com",
"sub": "user_1842",
"aud": "inventory-api",
"iat": 1785052800,
"exp": 1785053700,
"scope": ["products:read"]
}Payload JWT dapat dibaca oleh siapa pun yang memegang token. Jangan simpan password, nomor identitas, atau data rahasia di dalamnya.
Access token pendek, refresh token terkendali
| Token | Masa hidup | Penyimpanan | Fungsi |
|---|---|---|---|
| Access token | 5–15 menit | Memory atau secure client storage | Mengakses API. |
| Refresh token | Hari/minggu | Secure HttpOnly cookie / secure storage | Mendapat access token baru. |
Verifikasi lebih dari signature
$claims = $jwt->decode($token, $publicKey);
if ($claims->issuer !== $expectedIssuer) throw new UnauthorizedException();
if (!in_array($apiAudience, $claims->audience, true)) throw new UnauthorizedException();
if ($claims->expiresAt <= time()) throw new UnauthorizedException();
if (!in_array('products:read', $claims->scope, true)) throw new ForbiddenException();Logout dan pencabutan token
Access token stateless sulit dicabut sebelum kedaluwarsa. Solusinya: masa hidup pendek, rotation refresh token, daftar token yang dicabut untuk kejadian darurat, dan versi sesi per pengguna.
Kapan session lebih sederhana?
Untuk aplikasi monolith dengan browser sebagai satu-satunya client, session server-side sering lebih mudah diaudit dan dicabut. Pilih JWT karena kebutuhan arsitektur, bukan karena tren.
