Struktur Token JWT Dijelaskan: Header, Payload, dan Signature
Struktur Token JWT Dijelaskan
Setiap JSON Web Token (JWT) adalah string yang ringkas dan aman untuk URL yang membawa klaim antara dua pihak. Memahami struktur internalnya sangat penting bagi setiap developer yang bekerja dengan keamanan berbasis token.
Tiga Bagian JWT
Sebuah JWT terdiri dari tiga bagian yang dipisahkan oleh titik (.):
header.payload.signature
Contoh:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Setiap bagian adalah JSON yang di-encode dengan base64url. JWT ditandatangani, bukan dienkripsi — siapa pun dapat mendekode dan membaca isinya.
Bagian 1: Header
Header berisi metadata tentang token — algoritma penandatanganan dan tipe token.
| Field | Deskripsi | Contoh Nilai |
|-------|-----------|--------------|
| alg | Algoritma penandatanganan (wajib) | HS256, RS256, ES256 |
| typ | Tipe token (opsional) | JWT |
| kid | Key ID (opsional) | "key-1" |
{
"alg": "HS256",
"typ": "JWT"
}
Field alg memberi tahu verifier algoritma mana yang membuat signature. Ketidakcocokan algoritma — atau menerima alg: "none" — adalah kerentanan keamanan JWT yang umum.
Bagian 2: Payload
Payload berisi klaim tentang pengguna dan metadata. Klaim terbagi dalam tiga kategori:
Klaim Terdaftar (Registered Claims)
| Klaim | Nama Lengkap | Tujuan |
|-------|-------------|--------|
| iss | Issuer | Siapa yang menerbitkan token |
| sub | Subject | Mengidentifikasi pengguna |
| aud | Audience | Penerima yang dituju |
| exp | Expiration | Timestamp kedaluwarsa token |
| nbf | Not Before | Token tidak valid sebelum waktu ini |
| iat | Issued At | Timestamp pembuatan token |
| jti | JWT ID | Pengidentifikasi token unik |
Contoh Payload yang Didekode
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"iss": "https://auth.example.com"
}
Klaim publik didefinisikan dalam registri IANA atau menggunakan URI yang tahan benturan. Klaim privat adalah klaim khusus yang disepakati antara issuer dan consumer.
Bagian 3: Signature
Signature dibuat dengan menggabungkan header yang di-encode, payload yang di-encode, dan kunci rahasia menggunakan algoritma dari header. Signature memiliki dua tujuan:
- Integritas — memastikan token tidak dimodifikasi setelah ditandatangani.
- Autentikasi — membuktikan token ditandatangani oleh pihak yang diharapkan.
Pembuatan Signature HS256
HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
Pembuatan Signature RS256
RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Base64url vs Base64 Standar
| Aspek | Base64 Standar | Base64url |
|-------|---------------|-----------|
| Karakter 62 | + | - |
| Karakter 63 | / | _ |
| Padding | = | Dihilangkan |
Encoding ini memastikan JWT aman untuk header HTTP, parameter query, dan path URL tanpa percent-encoding.
Proses Pembuatan JWT Lengkap
- Buat header JSON dan base64url-encode.
- Buat payload JSON dan base64url-encode.
- Gabungkan dengan pemisah
.. - Tandatangani dengan algoritma dan kunci yang dipilih.
- Base64url-encode signature.
- Gabungkan ketiga bagian dengan pemisah
..
Pertimbangan Keamanan
- Jangan pernah menyimpan kunci rahasia di payload. Payload di-encode, bukan dienkripsi.
- Selalu validasi signature. Tanpa verifikasi, siapa pun dapat memalsukan token.
- Periksa header
alg. Tolakalg: "none"dan upaya downgrade algoritma. - Tetapkan waktu kedaluwarsa yang singkat. Gunakan klaim
expdalam hitungan menit atau jam, bukan bulan.
Dekode Token JWT Secara Online
Gunakan alat JWT decoder untuk memeriksa token apa pun. Tempelkan dan langsung lihat header, payload, dan algoritma penandatanganan yang didekode. Semua pemrosesan terjadi di browser Anda.