Panduan Teknis Validasi Klaim JWT (JSON Web Token) yang Aman

Mekanisme Validasi Klaim JWT

Validasi klaim JWT (JSON Web Token) adalah proses krusial untuk memastikan bahwa token yang diterima oleh server adalah sah, belum kedaluwarsa, dan berasal dari sumber yang terpercaya. Validasi tidak hanya memeriksa tanda tangan (signature), tetapi juga memverifikasi isi klaim (payload) di dalamnya.

Langkah utama dalam validasi klaim meliputi pemeriksaan exp (expiration time), nbf (not before), iss (issuer), dan aud (audience). Jika salah satu klaim ini tidak sesuai dengan kebijakan keamanan aplikasi, token harus ditolak.

Langkah Teknis Validasi Klaim

  1. Verifikasi Tanda Tangan: Pastikan token belum dimodifikasi dengan memverifikasi signature menggunakan kunci publik (untuk RS256) atau secret key (untuk HS256).
  2. Pemeriksaan Waktu (Exp & Nbf): Bandingkan waktu saat ini dengan klaim exp. Jika current_time > exp, token kedaluwarsa.
  3. Validasi Issuer (iss): Pastikan nilai iss cocok dengan server otorisasi yang diharapkan.
  4. Validasi Audience (aud): Pastikan token ditujukan untuk aplikasi atau layanan Anda.

Tabel Komponen Klaim JWT

KlaimDeskripsiTindakan Validasi
expExpiration TimeWajib: Tolak jika waktu sekarang > exp
nbfNot BeforeWajib: Tolak jika waktu sekarang < nbf
issIssuerOpsional: Cocokkan dengan string identitas server
audAudienceOpsional: Cocokkan dengan ID aplikasi
iatIssued AtOpsional: Cek kewajaran waktu pembuatan

Contoh Implementasi Validasi (Node.js)

const jwt = require('jsonwebtoken');

const token = 'eyJhbGci...';
const secretKey = 'your-secret-key';

try {
  const decoded = jwt.verify(token, secretKey, {
    issuer: 'https://auth.example.com',
    audience: 'my-app-id'
  });
  console.log('Token valid:', decoded);
} catch (err) {
  console.error('Validasi gagal:', err.message);
}

Tips Troubleshooting

  • Clock Skew: Berikan toleransi beberapa detik (misal 30-60 detik) saat membandingkan waktu exp untuk menghindari masalah sinkronisasi server.
  • Algoritma: Selalu tentukan algoritma yang diharapkan (misal { algorithms: ['RS256'] }) untuk mencegah serangan alg: none.
  • Log Kesalahan: Jangan tampilkan detail error JWT yang spesifik kepada pengguna akhir untuk mencegah kebocoran informasi sistem.