Pengembangan

Cara Decode dan Debug JWT

JSON Web Token hanyalah tiga bagian yang di-encode dengan Base64URL. Setelah kamu bisa membacanya, sebagian besar error “invalid token” bisa dipahami dalam hitungan detik. Panduan ini menunjukkan cara decode JWT, memeriksa claim yang paling sering bermasalah, serta kesalahan yang membuat JWT jadi celah keamanan.

Pemula · 7 menit baca · Diperbarui 30 Oktober 2026

Cara Decode dan Debug JWT

Apa saja isi sebuah JWT

JWT terlihat seperti xxxxx.yyyyy.zzzzz. Ketiga bagian yang dipisahkan titik itu adalah:

  1. Header — JSON berisi algoritma penandatanganan (alg) dan tipe token, misalnya {"alg":"HS256","typ":"JWT"}.
  2. Payload — JSON berisi claim: token ini milik siapa dan kapan token berlaku.
  3. Signature — hash dari dua bagian pertama yang dibuat dengan secret (HMAC) atau private key (RSA, ECDSA).

Dua bagian pertama hanya di-encode, bukan dienkripsi. Siapa pun yang memegang token bisa membacanya, makanya jangan pernah memasukkan password atau data pribadi ke payload JWT.

Decode token

Tempel token ke JWT Decoder dan alat ini akan menampilkan header, payload, serta setiap timestamp dalam format tanggal yang mudah dibaca. Prosesnya berjalan di browser kamu, jadi token production tidak dikirim ke mana pun. Untuk melakukannya secara manual, decode tiap bagian dengan Base64URL — ganti - dengan +, _ dengan /, lalu tambahkan padding — atau di Node:

const [header, payload] = token.split('.').slice(0, 2)
  .map(part => JSON.parse(Buffer.from(part, 'base64url').toString()));
console.log(header, payload);

Claim yang paling sering bermasalah

ClaimArtiError yang umum
expKedaluwarsa, dalam detik Unix“jwt expired” — periksa juga jam server dan client
nbfBelum berlaku sebelum waktu iniToken dipakai beberapa detik lebih awal karena jam issuer berjalan lebih cepat
iatDiterbitkan padaDitolak sebagai “issued in the future” setelah clock drift
audAudience yang dituju tokenToken untuk satu API dikirim ke API lain — verifier wajib memeriksanya
issIssuerIssuer dev dan production tertukar

Timestamp dihitung dalam detik, bukan milidetik. Jika expiry terlihat seperti tahun 55.000, berarti seseorang menulis Date.now() alih-alih Math.floor(Date.now() / 1000). Unix Timestamp Converter bisa memastikannya. Kebanyakan library menerima clock tolerance kecil (30–60 detik) untuk menyerap selisih jam antar server.

Kenapa muncul “invalid signature”?

  • Secret atau key salah — penyebab paling umum. Periksa environment variable di server yang melakukan verifikasi, bukan hanya yang menandatangani.
  • Algoritma salah — token ditandatangani dengan RS256 tapi diverifikasi sebagai HS256, atau sebaliknya.
  • Token sudah diubah — mengubah satu karakter pada payload akan merusak signature, dan itulah tujuannya.
  • Rotasi key — key issuer sudah berubah. Dengan JWKS, cocokkan kid di header dengan key yang dipublikasikan.

Untuk mengecek token HS256 secara manual, hitung HMAC-SHA256 atas header.payload dengan secret tersebut di HMAC Generator, lalu bandingkan hasilnya (yang sudah di-encode Base64URL) dengan bagian ketiga.

Kesalahan keamanan yang harus dihindari

  • Decode bukan verifikasi. Jangan pernah percaya claim dari jwt.decode(); gunakan fungsi verify dari library kamu dengan daftar algoritma yang diizinkan secara eksplisit.
  • Tolak alg: none dan kunci algoritmanya — jangan pernah biarkan token menentukan sendiri cara pengecekannya.
  • Buat token berumur pendek (beberapa menit untuk access token) dan gunakan refresh token untuk sesi panjang; JWT tidak bisa dicabut sebelum kedaluwarsa tanpa state tambahan di server.
  • Jangan simpan token di localStorage jika ada bug XSS yang bisa membacanya; cookie HttpOnly, Secure, SameSite lebih aman untuk aplikasi browser.

Butuh token uji dengan claim tertentu? Buat dengan JWT Encoder.

Pertanyaan yang sering diajukan

Bisa orang lain membaca JWT saya?
Bisa. Header dan payload hanya di-encode dengan Base64URL. Signature mencegah orang mengubah isinya, bukan membacanya. Gunakan JWE (token terenkripsi) jika isinya harus dirahasiakan.
Aman tidak menempelkan token ke decoder online?
Hanya jika alatnya berjalan secara lokal. JWT Decoder devpack men-decode di browser kamu dan tidak mengirim apa pun; hindari alat yang mengirim token ke server, terutama untuk token production.
Apa arti “jwt malformed”?
String tersebut bukan tiga bagian Base64URL yang dipisahkan titik. Penyebabnya sering kali “Bearer ” yang masih tertinggal di depannya, atau token yang terpotong saat disalin.

Baca juga