JWT (JSON Web Token)
Struktur JWT
JSON Web Token (JWT) adalah format token berbasis JSON yang digunakan
untuk mentransmisikan klaim antar pihak secara aman. JWT terdiri
dari tiga bagian yang dipisahkan oleh titik (.):
- Header: Berisi algoritma signing yang
digunakan (misal
"alg": "HS256"atau"alg": "RS256") dan tipe token ("typ": "JWT"). Header di-encode dengan Base64URL. - Payload: Berisi klaim
(claims) seperti
sub(subject),iat(issued at),exp(expiration),iss(issuer), dan data kustom lainnya. Payload juga di-encode Base64URL. - Signature: Hasil signing dari header + payload menggunakan algoritma dan secret key tertentu. Signature menjamin integritas token dan mencegah modifikasi oleh pihak yang tidak memiliki kunci.
Contoh JWT:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTYifQ.dQw4w9WgXcQ
Algoritma Signing
HS256 (HMAC with SHA-256): Algoritma simetris - key yang sama digunakan untuk menandatangani dan memverifikasi token. Cepat dan sederhana, tetapi memerlukan distribusi secret yang aman antar service. Cocok untuk sistem monolitik atau service-to-service yang saling percaya.
RS256 (RSA Signature with SHA-256): Algoritma asimetris - private key digunakan untuk signing, public key untuk verifikasi. Lebih aman untuk lingkungan distribusi karena public key dapat disebar luas tanpa risiko keamanan. Lebih lambat dari HS256, tetapi standar di ekosistem OAuth2/OIDC.
Stateless Authentication
JWT memungkinkan stateless authentication - server tidak perlu menyimpan session di database. Semua informasi identitas dan otorisasi terkandung dalam token itu sendiri. Keuntungannya:
- Skalabilitas tinggi: Server mana pun dapat memverifikasi token tanpa shared session store.
- Decentralisasi: Cocok untuk arsitektur microservices.
- Performansi: Tidak perlu query database setiap request.
Kekurangannya: token yang dicuri tidak bisa di-revoke sebelum masa berlaku habis tanpa mekanisme token blacklist.
JWT vs Session
| Aspek | JWT | Session |
|---|---|---|
| Storage | Client-side (token) | Server-side (DB/memory) |
| State | Stateless | Stateful |
| Skalabilitas | Mudah | Butuh shared session store |
| Revoke | Sulit (tanpa blacklist) | Mudah |
| Ukuran payload | Besar (bisa ≥1KB) | Kecil (hanya session ID) |
| Keamanan XSS | Rentan jika token di localStorage | Lebih aman (httpOnly cookie) |
Common Attacks
Algorithm Confusion Attack
Eksploitasi perbedaan antara algoritma simetris dan asimetris.
Attacker mengubah alg dari RS256 ke
HS256, lalu menandatangani token menggunakan public key
(yang biasanya publik). Server yang salah konfigurasi akan
memverifikasi dengan public key sebagai secret HMAC.
Mitigasi: Selalu validasi algoritma yang diizinkan
di server; jangan bergantung pada header token.
None Algorithm Attack
Sejumlah library JWT memiliki kelemahan historis di mana token dengan
"alg": "none" dianggap valid tanpa
verifikasi signature. Mitigasi: Tolak algoritma
none secara eksplisit.
Weak Secret Attack
Jika secret key untuk HS256 lemah (misal
"secret"), attacker dapat melakukan
brute-force untuk menemukan secret dan memalsukan token.
Mitigasi: Gunakan secret minimal 256-bit yang
dihasilkan oleh CSPRNG.
Token Theft
Token di mCookie/localStorage dapat dicuri via XSS, atau dibajak via MITM jika tidak menggunakan HTTPS. Mitigasi: Gunakan HttpOnly + Secure cookies, HTTPS ketat (HSTS), dan pendekatan token binding.
JWT Injection
Attacker menyisipkan data berbahaya di payload JWT yang dapat memicu SQL injection atau NoSQL injection jika token diproses tanpa sanitasi. Mitigasi: Jangan pernah mempercayai data dari payload JWT tanpa validasi.
Mitigasi Keseluruhan
- Gunakan algoritma asimetris (RS256/ES256) untuk sistem terdistribusi.
- Selalu validasi algoritma yang diizinkan di sisi server.
- Set
exp(expiration) yang pendek - 15 - 60 menit. - Gunakan refresh token untuk session jangka panjang.
- Implementasikan token rotation dan reuse detection.
- Simpan token di HttpOnly cookie (bukan localStorage) jika memungkinkan.
- Gunakan library JWT yang mature dan selalu di-update.