Cara Mendekode JWT dan Memeriksa Klaimnya dengan Aman
Jawaban Cepat
JWT adalah tiga string Base64URL yang digabungkan dengan titik: header.payload.signature. Dekode header dan payload dengan decoding Base64URL untuk memeriksa klaim —tetapi decoding hanya membaca data, tidak memverifikasi keaslian. Selalu verifikasi tanda tangan di server sebelum mempercayai klaim apa pun. Gunakan Dekoder JWT kami untuk memeriksa token di browser Anda.
Perkenalan
Token Web JSON (JWT, RFC 7519) adalah format token aman URL yang ringkas dan digunakan untuk autentikasi dan otorisasi. Ini memiliki tiga bagian berkode Base64URL yang dipisahkan oleh titik: header.payload.signature. Header menjelaskan algoritme, payload membawa klaim (id pengguna, peran, masa berlaku), dan tanda tangan membuktikan bahwa token dikeluarkan oleh pihak tepercaya. Yang terpenting, header dan payload dikodekan, bukan dienkripsi — siapa pun dapat membacanya.
Langkah demi Langkah
-
Bagi token menjadi tiga bagian
JWT terlihat seperti xxxxx.yyyyy.zzzzz. Pisahkan karakter titik untuk mendapatkan header (bagian 0), payload (bagian 1), dan tanda tangan (bagian 2). Jika tidak ada tepat tiga bagian, format token salah.
-
Base64URL-dekode header
Headernya adalah objek JSON berkode Base64URL seperti {"alg":"HS256","typ":"JWT"}. Base64URL menggunakan - dan _ alih-alih + dan / dan menghilangkan padding. Decode, lalu JSON.parse untuk membaca algoritma dan mengetik. Decoder JWT kami melakukan ini secara otomatis.
-
Base64URL-decode payload (klaim)
Payloadnya adalah JSON objek klaim. Klaim terdaftar meliputi iss (penerbit), sub (subjek), aud (audiens), exp (kedaluwarsa), nbf (bukan sebelumnya), iat (dikeluarkan-at), dan jti (token id). Klaim pribadi bersifat khusus untuk aplikasi (misalnya peran, email). Decode dan periksa, tapi jangan percaya sampai diverifikasi.
-
Periksa masa kadaluwarsa dan klaim yang belum ada sebelumnya
exp dan nbf adalah cap waktu Unix (detik). Jika waktu saat ini sudah melewati exp, maka token sudah habis masa berlakunya dan harus ditolak. Jika waktu saat ini sebelum nbf, token belum valid. Periksa sisi klien ini untuk UX, tetapi terapkan di sisi server untuk keamanan.
-
Verifikasi tanda tangan di server (jangan pernah di sisi klien)
Tanda tangannya adalah HMAC-SHA256(rahasia, header.payload) untuk HS256, atau tanda tangan RSA/ECDSA untuk RS256/ES256. Verifikasi memerlukan kunci rahasia atau publik, yang tidak boleh sampai ke browser. Gunakan perpustakaan seperti jsonwebtoken (Node) atau jose untuk memverifikasi —jangan pernah menulis kripto Anda sendiri.
Contoh
Tipikal JWT (tiga bagian)
Masukan: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpmeJf36POk6yJV_adQssw5c
Keluaran: Header: {"alg":"HS256","typ":"JWT"} Payload: {"sub":"1234567890","name":"John Doe","iat":1516239022}
Muatan yang didekodekan dengan klaim standar
Masukan: Muatan token autentikasi asli
Keluaran: {"sub":"user-42","iss":"freeonlinetoolsgo.com","exp":1767229200,"iat":1767225600,"role":"admin"}
Deteksi token kedaluwarsa
Masukan: exp: 1609459200 (01-01-2021) diperiksa pada 28-08-2026
Keluaran: Token is expired —current time (1767225600) > exp (1609459200). Reject and prompt re-login.
Masalah Umum
- Memperlakukan dekode sebagai verifikasi: siapa pun dapat membuat JWT dengan klaim apa pun dan tanda tangan palsu. Decoding membaca payload tetapi tidak membuktikan apa pun. Selalu verifikasi tanda tangan dengan rahasia/kunci publik di server sebelum mempercayai klaim.
- Menggunakan algoritma 'none': spesifikasi JWT memungkinkan alg: none untuk token yang tidak aman. Jika pemverifikasi Anda menerima alg: none, penyerang dapat memalsukan token. Konfigurasikan perpustakaan Anda agar tidak menolak satu pun dan memasukkan algoritme yang diharapkan ke dalam daftar putih.
- Menyimpan JWT di Penyimpanan lokal: XSS dapat membaca Penyimpanan lokal dan mengekstrak token. Lebih suka httpOnly, Secure, SameSite=Cookie ketat untuk token sesi, atau token dalam memori yang berumur pendek dengan cookie token penyegaran.
- Tidak memeriksa exp/aud/iss: token yang dicuri masih berlaku hingga habis masa berlakunya. Selalu periksa exp (kedaluwarsa), aud (audiens yang dituju), dan iss (penerbit) pada setiap permintaan untuk mencegah pemutaran ulang token di seluruh layanan.
Kiat
- Gunakan token akses yang berumur pendek (15 menit) ditambah token penyegaran yang berumur panjang —ini membatasi jendela jika token akses dicuri.
- Lebih memilih RS256 (asimetris) daripada HS256 (simetris) ketika beberapa layanan memverifikasi token: setiap layanan mendapatkan kunci publik, dan hanya penerbit yang memiliki kunci pribadi.
- Gunakan Decoder JWT kami selama pengembangan untuk memeriksa apa yang dikeluarkan server — ini menunjukkan header yang didekodekan, payload, dan ringkasan klaim yang dapat dibaca manusia tanpa mengirimkan token ke mana pun.
- Jangan pernah memasukkan data sensitif (kata sandi, PII) ke dalam payload JWT — data tersebut dikodekan Base64, tidak dienkripsi, dan siapa pun yang mencegat token dapat membaca setiap klaim.