TDCTF Academy Logo TDCTF ACADEMY

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

  1. Gunakan algoritma asimetris (RS256/ES256) untuk sistem terdistribusi.
  2. Selalu validasi algoritma yang diizinkan di sisi server.
  3. Set exp (expiration) yang pendek - 15 - 60 menit.
  4. Gunakan refresh token untuk session jangka panjang.
  5. Implementasikan token rotation dan reuse detection.
  6. Simpan token di HttpOnly cookie (bukan localStorage) jika memungkinkan.
  7. Gunakan library JWT yang mature dan selalu di-update.
PADA HALAMAN INI