Cara Mendekode JWT Token dengan Aman (Panduan Langkah demi Langkah)

25 Jan 2026 1,640 words

Cara Mendekode JWT Token dengan Aman

JWT (JSON Web Token) adalah format token ringkas yang aman untuk URL yang didefinisikan oleh RFC 7519. Ini digunakan untuk autentikasi dan pertukaran informasi antara pihak-pihak. JWT telah menjadi standar de facto untuk merepresentasikan klaim secara aman antara dua pihak, seperti klien dan server dalam aplikasi web modern. Mereka mandiri, artinya semua informasi yang diperlukan untuk mengautentikasi permintaan tertanam langsung dalam token itu sendiri, menghilangkan kebutuhan penyimpanan sesi sisi server dalam banyak arsitektur.

Popularitas JWT mencakup aplikasi satu halaman, aplikasi seluler, gateway API, dan komunikasi mikroservis. Ketika pengguna masuk ke aplikasi, server mengeluarkan JWT yang disimpan klien dan disajikan dengan setiap permintaan berikutnya. Server kemudian memverifikasi tanda tangan token untuk mengautentikasi dan mengotorisasi permintaan. Memahami cara mendekode dan memeriksa JWT dengan aman sangat penting bagi pengembang yang perlu men-debug alur autentikasi, memverifikasi klaim, dan memecahkan masalah terkait token tanpa mengekspos data sensitif atau memperkenalkan kerentanan.

Memahami Struktur JWT

JWT terdiri dari tiga bagian yang dipisahkan oleh titik, masing-masing di-encode menggunakan Base64URL (varian Base64 encoding yang aman untuk URL):

header.payload.signature

Contoh:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwi
bmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4
fwpMeJf36POk6yJV_adQssw5c

Segmen pertama adalah header, yang berisi metadata tentang token termasuk algoritma penandatanganan dan tipe token. Segmen kedua adalah payload, yang membawa klaim atau pernyataan yang dibuat. Segmen ketiga adalah tanda tangan, yang dihitung dengan mengambil header dan payload yang di-encode, menggabungkannya dengan titik, dan menandatangani hasilnya menggunakan algoritma yang ditentukan dalam header bersama dengan kunci rahasia atau kunci privat.

Detail Encoding Base64URL

JWT menggunakan encoding Base64URL, yang berbeda dari Base64 standar dalam dua hal penting. Pertama, ia mengganti karakter + dengan - untuk menghindari masalah dalam parameter query URL di mana + ditafsirkan sebagai spasi. Kedua, ia mengganti karakter / dengan _ untuk menghindari konflik dengan pemisah jalur URL. Selain itu, karakter padding (=) dihapus dari akhir segmen JWT karena tidak diperlukan untuk decoding dan hanya akan menambah byte yang tidak perlu pada token.

Klaim Header JWT

Header biasanya berisi algoritma dan tipe token, tetapi juga dapat menyertakan metadata tambahan untuk skenario lanjutan.

Klaim Nama Contoh Nilai
alg Algoritma HS256, RS256, ES256
typ Tipe Token JWT
kid ID Kunci unique-key-id
jku URL Set JWK https://example.com/.well-known/jwks.json

Klaim kid (ID Kunci) sangat penting dalam lingkungan di mana beberapa kunci penandatanganan sedang dalam rotasi. Ini memungkinkan server untuk mencari kunci yang benar dari set kunci tanpa menebak. Klaim jku menunjuk ke URL yang berisi JSON Web Key Set (JWKS), yang dapat diambil oleh verifikator untuk mendapatkan kunci publik untuk verifikasi tanda tangan. Namun, mengambil kunci dari URL yang ditentukan dalam token yang tidak tepercaya memperkenalkan risiko keamanan dan hanya boleh dilakukan dengan validasi yang tepat.

Klaim Payload JWT Umum

Payload berisi klaim yang memberikan informasi tentang pengguna dan token itu sendiri. Klaim ini dikategorikan sebagai klaim terdaftar, publik, dan privat.

Klaim Nama Deskripsi
sub Subjek Pengidentifikasi pengguna
iss Penerbit Siapa yang menerbitkan token
aud Audiens Penerima yang dituju
exp Kedaluwarsa Stempel waktu kedaluwarsa token
nbf Tidak Sebelum Token berlaku dari
iat Diterbitkan Pada Waktu pembuatan token
jti ID JWT Pengidentifikasi token unik

Klaim terdaftar distandarisasi oleh spesifikasi JWT dan memiliki arti tertentu. Klaim exp sangat penting untuk keamanan. Jika token tidak menyertakan waktu kedaluwarsa, atau jika server gagal memvalidasinya, token tetap berlaku tanpa batas waktu, menciptakan kerentanan serius jika token bocor. Klaim iat mencatat kapan token dibuat dan dapat digunakan untuk menentukan usia token atau untuk menerapkan kebijakan rotasi token.

Di luar klaim terdaftar ini, aplikasi biasanya menyertakan klaim kustom untuk peran pengguna, izin, alamat email, dan data khusus aplikasi lainnya. Misalnya, token mungkin menyertakan "role": "admin" atau "permissions": ["read", "write", "delete"]. Klaim kustom ini harus diperiksa dengan hati-hati, tetapi jangan pernah dipercaya tanpa verifikasi tanda tangan.

Mendekode vs Memverifikasi

Perbedaan antara mendekode dan memverifikasi adalah konsep paling penting untuk dipahami ketika bekerja dengan JWT. Membingungkan keduanya adalah sumber umum kerentanan keamanan.

Mendekode hanya melakukan Base64URL-decode pada header dan payload. Siapa pun dapat mendekode JWT tanpa kunci rahasia apa pun. Anda dapat mendekode JWT apa pun dengan menempelkannya ke alat decoder atau menjalankan fungsi Base64URL decode sederhana pada dua segmen pertama. Ini membuat JWT berguna untuk pemeriksaan dan debugging, tetapi juga berarti bahwa konten payload dapat dibaca secara publik.

Memverifikasi memeriksa tanda tangan menggunakan kunci rahasia (HMAC) atau kunci publik (RSA/ECDSA). Ini mengonfirmasi bahwa token tidak dirusak dan bahwa itu dikeluarkan oleh pihak yang tepercaya. Verifikasi adalah langkah yang memberikan keamanan. Tanpanya, penyerang dapat memodifikasi payload untuk mengubah ID pengguna atau peran, mengenkode ulang header dan payload, dan membuat tanda tangan baru yang akan tampak valid bagi server yang melewatkan atau menerapkan verifikasi tanda tangan secara tidak tepat.

Serangan Kebingungan Algoritma

Salah satu kerentanan JWT yang paling berbahaya adalah serangan kebingungan algoritma, juga dikenal sebagai serangan kebingungan kunci. Serangan ini mengeksploitasi fakta bahwa algoritma ditentukan dalam header, yang dikendalikan oleh penyerang karena header hanya di-encode Base64URL dan tidak dienkripsi.

Dalam skenario tipikal, server menggunakan RS256 (RSA dengan SHA-256) untuk menandatangani token. Kunci publik server tersedia secara luas, sementara kunci privat dijaga kerahasiaannya. Penyerang mencegat token yang valid dan mengubah header alg dari RS256 menjadi HS256. Karena HS256 menggunakan kunci rahasia simetris, server akan mencoba memverifikasi tanda tangan menggunakan algoritma HS256. Kesalahan kritisnya adalah jika server menggunakan kunci publik RS256 sebagai rahasia HS256. Karena kunci publik bersifat publik, penyerang dapat menghitung tanda tangan HS256 yang valid untuk payload apa pun menggunakan kunci publik sebagai rahasia HMAC. Server kemudian memverifikasi tanda tangan menggunakan kunci publik yang sama dan menerima token palsu.

Untuk mencegah serangan ini, server harus memvalidasi bahwa algoritma cocok dengan algoritma yang diharapkan sebelum memverifikasi, atau menggunakan pustaka yang kebal terhadap serangan ini secara desain. Banyak pustaka JWT modern sekarang menggunakan metode terpisah untuk verifikasi asimetris dan simetris untuk menghilangkan risiko ini.

Langkah-Langkah Dekode yang Aman

Ikuti langkah-langkah ini setiap kali Anda perlu mendekode dan memeriksa token JWT.

  1. Salin token JWT dari aplikasi Anda. Pastikan Anda telah menangkap token lengkap termasuk semua tiga segmen yang dipisahkan oleh titik. Token parsial akan gagal didekode dengan benar.

  2. Gunakan alat decoder tepercaya seperti JWT Decoder yang berjalan sepenuhnya di browser atau di mesin lokal Anda. Hindari menempelkan token ke alat online yang tidak dikenal yang mungkin mencatat atau mentransmisikan token Anda ke server jarak jauh. Bahkan jika token berumur pendek, mengeksposnya ke pihak ketiga dapat memungkinkan mereka untuk memutarnya dalam jendela validitasnya.

  3. Periksa header untuk algoritma. Konfirmasi bahwa algoritma cocok dengan yang Anda harapkan digunakan server Anda. Jika Anda melihat algoritma yang tidak terduga seperti none atau perubahan dari RS256 ke HS256, anggap token tersebut mencurigakan.

  4. Tinjau klaim payload. Periksa stempel waktu exp (kedaluwarsa) dan nbf (tidak sebelum) untuk mengonfirmasi bahwa token saat ini valid. Verifikasi bahwa iss (penerbit) cocok dengan pengidentifikasi server Anda. Periksa bahwa klaim aud (audiens), jika ada, menyertakan aplikasi Anda.

  5. Jangan pernah membagikan token secara publik. Token yang diposting ke laporan bug, pertanyaan Stack Overflow, atau GitHub gist dapat disalahgunakan oleh siapa pun yang menemukannya sebelum kedaluwarsa. Selalu redact atau ganti token dengan contoh dummy sebelum membagikan.

  6. Jangan pernah memverifikasi dengan kunci yang tidak tepercaya. Jika kode verifikasi Anda menerima kunci dari input pengguna, URL jarak jauh, atau file konfigurasi yang dapat dimodifikasi oleh penyerang, seluruh sistem autentikasi Anda dikompromikan.

Mendekode JWT dalam Kode

Meskipun alat online nyaman untuk pemeriksaan ad-hoc, Anda sering perlu mendekode JWT secara terprogram dalam aplikasi Anda. Berikut adalah cara mendekode payload JWT dalam beberapa bahasa pemrograman populer tanpa melakukan verifikasi tanda tangan.

JavaScript (Node.js)

function decodeJWT(token) {
  const payload = token.split('.')[1];
  const decoded = Buffer.from(payload, 'base64url').toString('utf8');
  return JSON.parse(decoded);
}

const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
console.log(decodeJWT(token));

Python

import base64
import json

def decode_jwt(token):
    payload = token.split('.')[1]
    # Add padding for base64 decoding
    padding = 4 - len(payload) % 4
    if padding != 4:
        payload += '=' * padding
    decoded = base64.urlsafe_b64decode(payload)
    return json.loads(decoded)

token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
print(decode_jwt(token))

Contoh-contoh ini mendemonstrasikan decoding untuk tujuan pemeriksaan saja. Untuk verifikasi produksi, selalu gunakan pustaka JWT yang telah diaudit dengan baik yang menangani validasi algoritma, manajemen kunci, dan verifikasi tanda tangan dengan benar.

Praktik Terbaik Keamanan

Selain mendekode dengan aman, mengikuti praktik terbaik ini akan menjaga implementasi JWT Anda tetap aman.

Gunakan waktu kedaluwarsa yang singkat. Token akses harus kedaluwarsa dalam 15 hingga 60 menit. Token berumur pendek membatasi kerusakan jika token bocor. Gabungkan token akses dengan token refresh yang memiliki masa hidup lebih lama dan dapat dicabut secara individual.

Validasi semua klaim yang diperlukan. Selalu periksa klaim exp, nbf, iss, dan aud selama verifikasi. Banyak serangan mengeksploitasi validasi klaim yang hilang atau tidak benar.

Gunakan algoritma asimetris untuk sistem terdistribusi. RS256 atau ES256 memungkinkan server menandatangani token dengan kunci privat sementara layanan apa pun dapat memverifikasinya dengan kunci publik. Ini menghilangkan kebutuhan untuk berbagi rahasia antar layanan.

Terapkan daftar hitam token. Untuk skenario di mana Anda perlu mencabut token sebelum kedaluwarsa, pertahankan daftar hitam atau gunakan nomor versi token yang disimpan di database Anda. Increment versi pada perubahan kata sandi atau penangguhan akun untuk membatalkan semua token yang ada.

Peringatan Keamanan

Jangan pernah menerima token dari sumber yang tidak tepercaya. Selalu verifikasi tanda tangan di server Anda sebelum mempercayai payload. Waspadai serangan kebingungan algoritma di mana penyerang mengubah RS256 menjadi HS256 untuk menggunakan kunci publik sebagai rahasia. Gunakan pustaka JWT yang bereputasi baik yang menerapkan verifikasi tanda tangan dengan aman, dan selalu perbarui untuk mendapatkan manfaat dari patch keamanan terbaru.

Ingat bahwa mendekode bukanlah memverifikasi. Siapa pun dapat membaca konten JWT hanya dengan Base64-decode payload. Perlakukan payload JWT sebagai informasi publik dalam hal kerahasiaan, andalkan verifikasi tanda tangan untuk integritas dan keaslian.


About this article

Pelajari cara mendekode JWT token dengan aman untuk memeriksa kontennya tanpa mengorbankan keamanan.


Related Articles


Related Tools

Help2Code Logo
Menu