Secara teknis, JWT adalah standar terbuka (didefinisikan dalam RFC 7519) untuk mengirim informasi antar pihak dalam bentuk objek JSON yang ditandatangani secara digital. Tanda tangan itulah yang membuat server bisa memastikan isi token tidak diubah di tengah jalan.
Bayangkan JWT seperti tiket konser dengan hologram. Pemegang tiket bisa langsung masuk tanpa petugas mencari namanya di daftar, karena hologram sudah membuktikan tiket itu asli.
Struktur JWT: Header, Payload, dan Signature
Sebuah JWT terdiri dari tiga bagian yang dipisahkan titik:
xxxxx.yyyyy.zzzzz
Masing-masing bagian berarti:
- Header berisi jenis token dan algoritma tanda tangan, misalnya
HS256. - Payload berisi data yang disebut claims, seperti ID pengguna (
sub), waktu dibuat (iat), dan waktu kedaluwarsa (exp). - Signature adalah hasil tanda tangan dari header dan payload memakai secret key milik server.
Contoh payload sederhana:
json
{
"sub": "user-1",
"role": "member",
"iat": 1760000000,
"exp": 1760000900
}
Satu hal penting yang sering disalahpahami: JWT adalah token yang di-encode, bukan dienkripsi. Siapa pun yang memegang token bisa membaca isi payload-nya lewat alat seperti jwt.io. Artinya, jangan pernah menaruh password atau data sensitif di dalamnya.
Cara Kerja JWT dalam Proses Login
Alurnya cukup sederhana:
- Pengguna mengirim email dan password ke endpoint login.
- Server memeriksa kredensial. Jika benar, server membuat JWT dan menandatanganinya dengan secret key.
- Token dikirim ke klien, lalu disimpan di sisi klien.
- Pada setiap permintaan berikutnya, klien menyertakan token di header
Authorization: Bearer <token>. - Server memverifikasi tanda tangan dan masa berlaku token. Jika valid, permintaan diproses.
Server tidak perlu menyimpan data sesi di memori atau database. Semua informasi yang dibutuhkan sudah ada di dalam token.
JWT vs Session: Mana yang Lebih Cocok?
| Aspek | JWT | Session |
|---|---|---|
| Penyimpanan | Di sisi klien | Di sisi server |
| Skalabilitas | Mudah, karena stateless | Perlu penyimpanan sesi bersama |
| Mencabut akses | Sulit sebelum token kedaluwarsa | Mudah, tinggal hapus sesi |
| Cocok untuk | REST API, aplikasi mobile, microservice | Aplikasi web tradisional |
Keunggulan utama JWT adalah sifatnya yang stateless, sehingga satu token bisa dipakai di banyak layanan tanpa berbagi database sesi. Kelemahannya, token yang sudah terbit sulit dibatalkan sebelum waktunya habis. Karena itu masa berlaku token sebaiknya dibuat singkat.
Untuk API yang dipakai web dan mobile sekaligus, JWT adalah pilihan yang pas. Kalau kamu masih menimbang gaya API-nya, baca juga perbandingan REST API vs GraphQL.
Contoh Implementasi JWT di Node.js dan Express
Sekarang kita praktikkan. Pertama, pasang paket yang dibutuhkan:
bash
npm install express jsonwebtoken dotenv
Simpan secret key di file .env, jangan ditulis langsung di kode. Cara lengkapnya ada di artikel kami tentang environment variable dan .env di Node.js.
JWT_SECRET=ganti-dengan-string-acak-yang-panjang
Lalu buat file server.js:
js
require('dotenv').config();
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
const SECRET = process.env.JWT_SECRET;
// 1. Endpoint login: membuat token
app.post('/login', (req, res) => {
const { email, password } = req.body;
// Contoh sederhana. Di aplikasi nyata, cek ke database
// dan bandingkan password yang sudah di-hash.
if (email !== 'user@example.com' || password !== 'rahasia123') {
return res.status(401).json({ message: 'Email atau password salah' });
}
const token = jwt.sign(
{ sub: 'user-1', role: 'member' },
SECRET,
{ expiresIn: '15m' }
);
res.json({ token });
});
// 2. Middleware: memverifikasi token
function authMiddleware(req, res, next) {
const header = req.headers.authorization || '';
const [type, token] = header.split(' ');
if (type !== 'Bearer' || !token) {
return res.status(401).json({ message: 'Token tidak ditemukan' });
}
try {
req.user = jwt.verify(token, SECRET, { algorithms: ['HS256'] });
next();
} catch (err) {
return res.status(401).json({ message: 'Token tidak valid atau kedaluwarsa' });
}
}
// 3. Route yang dilindungi
app.get('/profile', authMiddleware, (req, res) => {
res.json({ message: 'Selamat datang!', user: req.user });
});
app.listen(3000, () => console.log('Server berjalan di port 3000'));
Untuk mencobanya, kirim POST /login, salin token dari respons, lalu panggil GET /profile dengan header Authorization: Bearer <token>.
Kalau frontend kamu berjalan di domain berbeda dan permintaan ditolak browser, itu biasanya masalah CORS. Solusinya ada di artikel CORS error dan 5 cara mengatasinya di Express.
Praktik Terbaik Menggunakan JWT
Agar implementasimu aman, terapkan hal-hal berikut:
- Gunakan masa berlaku singkat (misalnya 15 menit), lalu perpanjang dengan refresh token.
- Selalu pakai HTTPS supaya token tidak bisa disadap di jaringan.
- Jangan simpan data sensitif di payload. Ingat, JWT adalah alat autentikasi, bukan tempat menyimpan rahasia.
- Tentukan algoritma saat verifikasi, seperti pada kode di atas, untuk mencegah serangan manipulasi algoritma.
- Gunakan secret yang panjang dan acak, dan simpan di environment variable.
- Pertimbangkan cookie
HttpOnlyuntuk menyimpan token di browser. Menyimpannya dilocalStoragelebih rentan jika situs terkena serangan XSS.
Pertanyaan yang Sering Diajukan
Apa itu JWT?
JWT adalah singkatan dari JSON Web Token, yaitu token bertanda tangan digital yang dipakai untuk autentikasi dan pertukaran informasi antar layanan.
Apakah JWT adalah pengganti session?
Tidak selalu. JWT cocok untuk API dan arsitektur terdistribusi, sedangkan session masih nyaman untuk aplikasi web tradisional yang butuh kontrol penuh atas sesi pengguna.
Apakah JWT adalah enkripsi?
Bukan. JWT hanya ditandatangani, sehingga isinya tidak bisa diubah tanpa ketahuan, tetapi tetap bisa dibaca siapa saja. Jangan simpan data rahasia di dalamnya.
Apa yang terjadi kalau JWT kedaluwarsa?
Server akan menolak token tersebut dengan status 401. Klien lalu perlu login ulang atau meminta token baru lewat refresh token.
Kesimpulan
JWT adalah cara praktis untuk mengautentikasi pengguna tanpa menyimpan sesi di server. Tokennya terdiri dari header, payload, dan signature, lalu dikirim lewat header Authorization di setiap permintaan.
Sekarang kamu sudah tahu bahwa JWT adalah fondasi autentikasi di banyak API modern. Langkah berikutnya, coba terapkan di proyek kecilmu, tambahkan refresh token, dan pastikan semua praktik keamanan di atas sudah terpasang.