JWT Bukan Enkripsi: Kesalahpahaman yang Masih Sering Terjadi di Dunia Developer

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
Search for a command to run...

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
No comments yet. Be the first to comment.
Ringkasan: Jika OpenClaw adalah AI Operating System yang menghubungkan berbagai layanan dan agent, maka Hermes adalah AI Worker yang fokus mengerjakan pekerjaan, belajar dari pengalaman, dan semakin p

Ketika membangun aplikasi modern seperti Next.js, Cloudflare Workers, platform AI, microservices, atau real-time dashboard, ada banyak istilah jaringan yang sering muncul: TCP, UDP, HTTP/2, QUIC, WebS

Setiap tahun, ribuan mahasiswa jurusan Teknologi Informasi, Sistem Informasi, dan Teknik Informatika diwisuda. Namun, tidak sedikit di antara mereka yang kemudian menghadapi kenyataan yang cukup berat

Jika Anda menggunakan Next.js, kemungkinan besar Anda pernah mendengar anggapan bahwa: "Next.js = Vercel" Padahal kenyataannya tidak harus demikian. Di sinilah OpenNext hadir. OpenNext adalah proyek

Saat pertama kali mencoba OpenCode Go, saya hampir langsung berlangganan tanpa membaca detail program yang mereka sediakan. Untungnya saya menemukan bahwa OpenCode memiliki program referral yang membe

Banyak developer pertama kali melihat JWT lalu berpikir:
“Wah aman, datanya sudah terenkripsi.”
Padahal kenyataannya:
JWT umumnya tidak dienkripsi. JWT biasanya hanya encoded dan signed.
Ini kesalahpahaman yang sangat umum, bahkan di kalangan developer berpengalaman. Akibatnya, banyak sistem tanpa sadar menyimpan data sensitif di dalam token karena mengira payload tidak bisa dibaca.
Padahal:
siapa pun bisa membuka isi JWT
tanpa password
tanpa secret key
tanpa akses server
Artikel ini membahas:
mengapa JWT tetap aman walau bisa dibaca,
bagaimana signature bekerja,
kenapa JWT bukan tempat menyimpan data rahasia,
dan bagaimana memahami JWT dengan cara yang benar.
JWT atau JSON Web Token adalah format token berbasis JSON yang biasa digunakan untuk:
autentikasi,
otorisasi,
session modern,
OAuth,
microservice authentication.
Bentuk JWT biasanya seperti ini:
xxxxx.yyyyy.zzzzz
Terdiri dari 3 bagian:
header.payload.signature
Contoh nyata:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJ1c2VySWQiOjEsInJvbGUiOiJhZG1pbiJ9
.
sdfkjh23498sdf9234...
Berisi metadata:
{
"alg": "HS256",
"typ": "JWT"
}
Artinya:
algoritma signing: HS256
tipe token: JWT
Berisi data:
{
"userId": 1,
"role": "admin",
"exp": 1779898977
}
Inilah bagian yang sering disalahpahami.
Payload JWT:
bisa dibaca siapa saja
bukan terenkripsi
hanya Base64 encoded
Inilah inti keamanan JWT.
Signature dibuat menggunakan:
header,
payload,
secret key server.
Contoh sederhana:
HMACSHA256(
header.payload,
SECRET_KEY
)
Hasilnya menjadi signature.
Kesalahan paling umum adalah menganggap Base64 sebagai enkripsi.
Padahal Base64 hanya encoding.
Encoding seperti:
Encryption seperti:
Misalnya token:
eyJ1c2VySWQiOjEsInJvbGUiOiJhZG1pbiJ9
Developer bisa membukanya hanya dengan:
atob(tokenPart)
atau website decoder online.
Tidak perlu:
password,
secret key,
akses backend.
Karena keamanan JWT bukan pada “kerahasiaan payload”.
Tetapi pada:
JWT aman karena client tidak bisa memalsukan signature.
Misalnya server membuat payload:
{
"role": "user"
}
Lalu server membuat signature menggunakan secret key rahasia.
Misal hacker mencoba:
{
"role": "admin"
}
Masalahnya:
Backend akan melakukan verifikasi:
signature_valid ?
Jika tidak cocok:
401 Unauthorized
JWT lebih mirip:
surat resmi bertanda tangan
daripada:
brankas terkunci
Semua orang bisa membaca isi surat.
Tetapi:
Karena mengira JWT terenkripsi, beberapa developer menyimpan:
password,
API key,
nomor kartu,
data sensitif,
informasi internal.
Contoh buruk:
{
"password": "123456"
}
atau:
{
"creditCard": "..."
}
Ini berbahaya.
Karena siapa pun yang memegang token bisa membacanya.
Biasanya hanya:
user id,
role,
session id,
issuer,
audience,
expiry.
Contoh aman:
{
"sub": "123",
"role": "admin",
"exp": 1779898977
}
Alasan JWT populer:
backend tidak perlu session store,
cocok untuk microservice,
scalable,
mudah diverifikasi.
Server cukup:
verify signature
tanpa query database.
Karena stateless:
sulit revoke token,
logout tidak langsung invalid,
token tetap valid sampai expired.
Makanya banyak sistem modern memakai hybrid approach:
JWT + session lookup
misalnya payload hanya:
{
"ref": "session_id"
}
Lalu backend cek Redis/database.
Ini mulai populer di:
enterprise apps,
banking systems,
internal ERP,
modern SaaS.
Karena:
payload terlihat user,
ukuran token bisa besar,
data mudah stale,
sulit revoke.
Sekarang tren modern:
payload minimal,
session server-side,
access token pendek,
refresh token rotation.
JWT sering dipakai berlebihan.
Padahal pada beberapa kasus:
session tradisional lebih aman,
cookie auth lebih sederhana,
stateful auth lebih mudah revoke.
Tidak semua aplikasi harus JWT.
Ada standar bernama:
JSON Web Encryption
Tetapi lebih kompleks:
lebih berat,
implementasi lebih sulit,
jarang dibutuhkan.
Mayoritas sistem modern cukup memakai:
signed JWT,
bukan encrypted JWT.
JWT bukan:
tempat menyimpan rahasia,
enkripsi data,
anti-baca.
JWT adalah:
format token terstandar,
membawa claim,
diverifikasi dengan signature.
Keamanan JWT terletak pada:
secret key server,
validasi signature,
expiry,
refresh flow,
transport security (HTTPS).
Bukan pada “payload tidak bisa dibaca”.
Banyak developer terlalu fokus pada:
payload terlihat atau tidak
padahal inti keamanan JWT adalah:
apakah payload bisa dipalsukan?
Itulah fungsi signature.
Jika memahami ini dengan benar, developer akan:
lebih bijak menyimpan data,
memahami batas JWT,
menghindari kebocoran sensitif,
dan membangun sistem auth yang jauh lebih matang.
JWT bukan “data rahasia terenkripsi”.
JWT adalah:
data yang bisa dibaca, tetapi tidak bisa dimanipulasi tanpa secret key.