JSON Web Token (JWT)
JWT adalah token berbasis JSON yang sering digunakan untuk autentikasi API. JWT terdiri dari tiga bagian yang di-encode Base64: Header, Payload, dan Signature.
// Struktur JWT
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMjN9.abc123signature
// Header (decoded)
{ "alg": "HS256", "typ": "JWT" }
// Payload (decoded)
{ "user_id": 123, "exp": 1700000000 }
// Signature
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
Vulnerability Umum JWT
1. Algorithm None Attack
Penyerang mengubah algoritma ke none, membuat signature tidak diperiksa:
// Header yang dimanipulasi
{ "alg": "none", "typ": "JWT" }
// Tanpa signature, token dianggap valid!
2. Algorithm Confusion (RS256 → HS256)
Jika server mendukung RS256 (asymmetric) dan HS256 (symmetric), penyerang bisa menandatangani token dengan public key sebagai HMAC secret.
3. Weak Secret Key
// JANGAN gunakan secret yang lemah
const secret = "secret123"; // Bisa di-brute-force
// Gunakan secret yang kuat (minimal 256 bit)
const secret = crypto.randomBytes(32).toString("hex");
Best Practices JWT
- Validasi algoritma — Jangan izinkan algorithm none atau substitution
- Gunakan expiration (exp) — Token harus kedaluwarsa
- Secret key yang kuat — Minimal 256 bit random
- Jangan simpan data sensitif di payload — JWT hanya di-encode, bukan di-encrypt
- Pertimbangkan token rotation — Access token pendek + refresh token
// Node.js: verify dengan opsi ketat
const jwt = require("jsonwebtoken");
const decoded = jwt.verify(token, secret, {
algorithms: ["HS256"], // Hanya izinkan algoritma tertentu
maxAge: "1h", // Tolak token yang terlalu lama
issuer: "myapp" // Validasi issuer
});
JWT vs Session: Kapan Menggunakan JWT?
- JWT cocok untuk: API stateless, microservices, mobile apps
- Session cocok untuk: Web apps tradisional, perlu revoke akses instan
- Pertimbangan: JWT tidak bisa di-revoke tanpa mekanisme tambahan (blacklist)