[Lv1] Apa Struktur dari JWT?
Pewawancara sering bertanya lanjutan: "Seperti apa bentuk JWT? Mengapa dirancang demikian?" Memahami struktur, metode encoding, dan alur verifikasi akan membantu Anda menjawab dengan cepat.
1. Gambaran Dasar
JWT (JSON Web Token) adalah format token yang mandiri (self-contained) yang digunakan untuk mengirimkan informasi secara aman antara dua pihak. Terdiri dari tiga string yang dihubungkan dengan .:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Jika diuraikan, ini adalah tiga segmen JSON yang di-encode dengan Base64URL:
- Header: Mendeskripsikan algoritma dan tipe yang digunakan oleh token.
- Payload: Berisi informasi pengguna dan klaim (claims).
- Signature: Ditandatangani dengan secret key untuk memastikan konten tidak diubah.
2. Header, Payload, dan Signature secara Detail
2.1 Header
{
"alg": "HS256",
"typ": "JWT"
}
alg: Algoritma penandatanganan, misalnyaHS256(HMAC + SHA-256),RS256(RSA + SHA-256).typ: Tipe token, biasanyaJWT.
2.2 Payload
{
"sub": "1234567890",
"name": "Jane Doe",
"iat": 1516239022,
"exp": 1516242622,
"role": "admin"
}
- Registered Claims (dicadangkan secara resmi, tetapi tidak wajib):
iss(Issuer): Entitas yang menerbitkan tokensub(Subject): Subjek (biasanya ID pengguna)aud(Audience): Penerima yang ditujuexp(Expiration Time): Waktu kedaluwarsa (Unix timestamp, dalam detik)nbf(Not Before): Token tidak valid sebelum waktu iniiat(Issued At): Waktu token diterbitkanjti(JWT ID): Pengenal unik untuk token
- Public / Private Claims: Field kustom dapat ditambahkan (misalnya
role,permissions), tetapi hindari membuat payload terlalu besar.
2.3 Signature
Proses pembuatan signature:
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
- Dua segmen pertama ditandatangani menggunakan secret key (atau private key).
- Ketika server menerima token, server menghitung ulang signature. Jika cocok, ini mengonfirmasi bahwa token tidak diubah dan diterbitkan oleh sumber yang sah.
Catatan: JWT hanya menjamin integritas data, bukan kerahasiaan, kecuali enkripsi tambahan diterapkan.
3. Apa itu Base64URL Encoding?
JWT menggunakan Base64URL alih-alih Base64, dengan perbedaan berikut:
+diganti dengan-, dan/diganti dengan_.- Padding
=di akhir dihapus.
Ini memastikan token dapat ditempatkan dengan aman di URL, Cookie, atau Header tanpa masalah yang disebabkan oleh karakter khusus.
4. Gambaran Alur Verifikasi
- Klien menyertakan
Authorization: Bearer <JWT>di header permintaan. - Server menerima token dan:
- Mem-parse Header dan Payload.
- Mengambil algoritma yang ditentukan oleh
alg. - Menghitung ulang signature menggunakan shared secret atau public key.
- Membandingkan signature dan memeriksa field terkait waktu seperti
expdannbf.
- Hanya setelah verifikasi berhasil, server dapat mempercayai konten Payload.
5. Kerangka Jawaban Wawancara
"JWT terdiri dari tiga bagian — Header, Payload, dan Signature — yang dihubungkan dengan
.. Header mendeskripsikan algoritma dan tipe; Payload berisi informasi pengguna dan field standar sepertiiss,sub, danexp; Signature menandatangani dua bagian pertama dengan secret key untuk memverifikasi bahwa konten tidak diubah. Kontennya adalah JSON yang di-encode dengan Base64URL, tetapi tidak dienkripsi — hanya di-encode. Jadi data sensitif tidak boleh ditempatkan langsung di dalamnya. Ketika server menerima token, server menghitung ulang signature untuk perbandingan. Jika cocok dan belum kedaluwarsa, token dianggap valid."
6. Pengingat Pertanyaan Lanjutan Wawancara
- Keamanan: Payload dapat di-decode — jangan pernah menyimpan kata sandi, nomor kartu kredit, atau informasi sensitif lainnya di dalamnya.
- Kedaluwarsa dan Pembaruan: Biasanya dipasangkan dengan Access Token berumur pendek + Refresh Token berumur panjang.
- Algoritma Penandatanganan: Anda dapat menyebutkan perbedaan antara pendekatan simetris (HMAC) dan asimetris (RSA, ECDSA).
- Mengapa tidak bisa sangat panjang?: Token yang terlalu besar meningkatkan biaya transmisi jaringan dan mungkin ditolak oleh browser.