Lompat ke konten utama

Pembaca & Pemeriksa JWT

Tokennya tidak pernah meninggalkan browser Anda, dan itu dapat diperiksa

Baca header dan payload JWT, terjemahkan exp dan iat menjadi tanggal setempat, dan periksa tanda tangan HMAC lewat WebCrypto. Token tidak pernah dikirim ke server mana pun.

Contoh di atas sengaja sudah kedaluwarsa dan bukan milik siapa pun. Ganti dengan token Anda.
Disamarkan bukan karena dikirim ke mana pun — ia tidak — tetapi supaya tidak terbaca dari seberang meja. Isi hanya bila ingin memeriksa tanda tangannya.
Tidak ada yang dikirim ke server. Pembacaan dan verifikasi HMAC berjalan di browser Anda lewat WebCrypto. Aturan arsitektur CoreNet melarang seluruh tools memanggil jaringan, jadi pernyataan ini dapat Anda periksa sendiri di tab Network.
Hasil

Seluruh perhitungan berjalan di browser Anda. Alamat IP, nama interface, dan password yang Anda masukkan tidak pernah dikirim ke server CoreNet.

Kenapa halaman ini ada

Karena jwt.io menempelkan token ke halamannya, dan banyak orang menempelkan token produksi ke sana tanpa berpikir — token yang di dalamnya ada id pengguna, peran, dan masa berlaku yang masih hidup.

Halaman ini dapat menyatakan terang bahwa token Anda tidak pernah meninggalkan browser, dan pernyataan itu benar karena dipaksa oleh arsitektur: seluruh tools CoreNet dilarang memanggil fetch(). Itu bukan janji pemasaran; itu batasan yang dapat Anda periksa sendiri — buka tab Network, tempel token, dan tidak akan ada satu permintaan pun yang keluar.

Verifikasi tanda tangannya pun dikerjakan di browser, lewat WebCrypto.

Membaca bukan memeriksa

Ini kesalahpahaman paling berbahaya seputar JWT, dan tools yang menampilkan payload dengan rapi tanpa mengatakannya justru memperkuatnya.

Header dan payload JWT hanya di-encode, bukan dienkripsi. Base64url dapat dibalik siapa pun tanpa kunci apa pun, tanpa alat khusus, dalam sedetik. Artinya:

Jangan pernah menaruh rahasia di dalam payload JWT. Bukan password, bukan kunci API, bukan nomor identitas. Anggap seluruh isinya tertulis di kartu pos.

Yang membuktikan token tidak dipalsukan hanyalah tanda tangannya, dan memeriksanya menuntut kunci. Tool ini memisahkan keduanya dengan tegas: bagian yang dibaca selalu tampil, bagian yang diperiksa hanya bila Anda mengisi rahasianya.

alg: none — lubang yang masih ditemukan sampai sekarang

Bila header sebuah token berbunyi "alg":"none", token itu tidak bertanda tangan sama sekali. Siapa pun dapat menuliskan isi apa pun ke dalamnya — termasuk "role":"admin" — dan tidak ada yang dapat membedakannya dari token yang sah.

Tool ini menandainya merah.

Library JWT yang benar menolak none kecuali diminta secara khusus. Yang perlu Anda periksa di sisi server: algoritmenya ditentukan oleh Anda, bukan dibaca dari header token. Kode yang mempercayai alg dari token yang sedang diperiksanya adalah kode yang dapat ditipu.

exp dihitung dalam UTC, dan itu sumber kebingungan

exp, iat, dan nbf adalah cap waktu Unix — jumlah detik sejak 1970 dalam UTC, tanpa zona waktu.

Tool ini menerjemahkannya ke zona waktu Anda dan menyebutkan berapa lama lagi atau berapa lama lalu. Itu menghilangkan satu langkah aritmetika yang sering dikerjakan salah, terutama saat token dari server yang jam sistemnya bergeser.

Yang perlu diperhatikan: token dapat bertanda tangan sah tetapi sudah kedaluwarsa. Keduanya pemeriksaan yang berbeda, dan tool ini menyebutkannya terpisah agar tidak tertukar.

Token tanpa exp berlaku selamanya sampai kuncinya diganti. Untuk token akses itu hampir selalu keliru: yang mencurinya dapat memakainya bertahun-tahun kemudian.

RS256 sengaja tidak diperiksa di sini

Verifikasi RS256, PS256, dan ES256 menuntut kunci publik penerbitnya.

Menyediakan kotak untuk menempelkan kunci akan mengundang orang menempelkan kunci privat ke halaman web — dan justru itu kesalahan yang jauh lebih merugikan daripada tidak bisa memverifikasi. Jadi kotaknya tidak ada, dan alasannya disebutkan di tempat yang seharusnya.

Periksa yang jenis itu di sisi server, dengan library JWT yang sudah Anda pakai.

Tanda tangan tidak cocok — tiga sebab, berurutan menurut kemungkinan

  1. Rahasianya salah, atau ada spasi ikut tersalin di ujungnya.
  2. Algoritmenya berbeda dari yang Anda kira — periksa alg di header.
  3. Isi tokennya sudah diubah setelah ditandatangani. Bila rahasianya benar dan algoritmenya benar, inilah yang tersisa, dan itu berarti tokennya tidak boleh dipercaya.

Pertanyaan yang sering diajukan

Apakah JWT bisa dibatalkan sebelum kedaluwarsa? Tidak, dan ini sifat yang paling sering mengejutkan. JWT dipercaya karena tanda tangannya, bukan karena dicari di database — jadi server tidak punya kesempatan menolaknya. Yang biasa dipakai: masa berlaku pendek ditambah refresh token yang dapat dibatalkan, atau daftar blokir yang justru mengembalikan pencarian database yang ingin dihindari JWT.

Kenapa payload saya tampil rusak untuk nama berhuruf non-ASCII? Di tool ini seharusnya tidak. Banyak pembaca JWT memakai atob() apa adanya, yang menghasilkan byte alih-alih karakter UTF-8. Tool ini mengurai byte-nya dengan benar, sehingga nama berhuruf beraksen maupun huruf non-Latin tampil sebagaimana mestinya.

Aman menempelkan token produksi di sini? Lebih aman daripada di halaman mana pun yang mengirimkannya ke server. Tetapi tetap: tokennya ada di layar Anda, jadi jangan lakukan saat berbagi layar, dan tutup tabnya setelah selesai.

Apakah data saya dikirim ke server? Tidak. Baik pembacaan maupun verifikasi HMAC berjalan di browser Anda.