JWT Adalah Apa? Pengertian Singkat

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:

  1. Header berisi jenis token dan algoritma tanda tangan, misalnya HS256.
  2. Payload berisi data yang disebut claims, seperti ID pengguna (sub), waktu dibuat (iat), dan waktu kedaluwarsa (exp).
  3. 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:

  1. Pengguna mengirim email dan password ke endpoint login.
  2. Server memeriksa kredensial. Jika benar, server membuat JWT dan menandatanganinya dengan secret key.
  3. Token dikirim ke klien, lalu disimpan di sisi klien.
  4. Pada setiap permintaan berikutnya, klien menyertakan token di header Authorization: Bearer <token>.
  5. 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?

AspekJWTSession
PenyimpananDi sisi klienDi sisi server
SkalabilitasMudah, karena statelessPerlu penyimpanan sesi bersama
Mencabut aksesSulit sebelum token kedaluwarsaMudah, tinggal hapus sesi
Cocok untukREST API, aplikasi mobile, microserviceAplikasi 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 HttpOnly untuk menyimpan token di browser. Menyimpannya di localStorage lebih 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.

Leave a Reply

Your email address will not be published. Required fields are marked *