JWT (JSON Web Token) adalah format ringkas untuk mengirim data yang ditandatangani, paling sering berupa informasi tentang pengguna yang terautentikasi. Sebuah token terdiri dari tiga bagian yang dipisahkan titik: header.payload.signature. Di ekosistem startup Indonesia, kombinasi Laravel atau Node.js di backend dengan JWT untuk API mobile app (dompet digital, e-commerce, ride-hailing) adalah pola yang sangat umum.
Nama Indonesia di dalam claim tetap ASCII — tapi tidak selalu
Nama seperti "Budi Santoso" atau "Siti Rahayu" seluruhnya huruf Latin biasa, jadi payload semacam {"nama": "Budi Santoso"} tidak menambah ukuran token dibanding versi bahasa Inggris. Yang justru sering menjadi sumber bug adalah field alamat atau nama daerah yang mengandung karakter non-ASCII hasil salinan dari sistem lama (misalnya nama jalan dengan simbol khusus), yang membuat ukuran payload membengkak tanpa disadari saat dienkode ke Base64URL.
Tiga bagian sebuah token
- Header — JSON berisi jenis token dan algoritma tanda tangan (misalnya HS256 atau RS256), dienkode dalam Base64URL.
- Payload — JSON berisi "claim": data pengguna, waktu penerbitan, kedaluwarsa, dll., juga dalam Base64URL.
- Signature — tanda tangan yang dihitung dari header dan payload menggunakan kunci rahasia atau privat, mengonfirmasi bahwa token belum diubah.
Base64URL, bukan Base64 biasa
JWT menggunakan varian Base64 dengan alfabet yang aman untuk URL: karakter + dan / diganti dengan - dan _, dan padding = biasanya dihilangkan. Ini memungkinkan token disisipkan langsung ke URL atau header tanpa enkode tambahan.
Perbedaan penting: mendekode ≠ memverifikasi
Header dan payload hanyalah Base64URL — siapa pun dapat mendekode dan membaca isinya tanpa kunci apa pun. Mendekode token tidak membuktikan bahwa data belum diubah. Isi token hanya bisa dipercaya setelah tanda tangannya diverifikasi dengan kunci yang sesuai — dan verifikasi ini dilakukan oleh server, bukan oleh klien yang sekadar melihat isi token.
Serangan berbahaya: penggantian algoritma menjadi "none"
Spesifikasi JWT mengizinkan algoritma none — token tanpa tanda tangan. Jika backend secara naif mempercayai kolom alg dari header token alih-alih memverifikasi tanda tangan dengan algoritma tetap yang sudah diketahui sebelumnya, penyerang dapat mengganti alg menjadi none, menghapus tanda tangan, dan token dengan data sembarang akan lolos verifikasi. Library JWT yang andal mewajibkan penentuan algoritma yang diharapkan secara eksplisit saat verifikasi.
Kasus umum: aplikasi dompet digital dan multi-device
Aplikasi dompet digital dan super-app di Indonesia biasanya menerbitkan JWT berumur pendek plus refresh token, sekaligus menyimpan daftar perangkat yang sedang login lewat klaim khusus seperti device_id. Memeriksa klaim exp dan iat saat debugging sering menjadi langkah pertama untuk memahami kenapa sesi di satu perangkat tiba-tiba logout padahal perangkat lain masih aktif.