Implementasi JWT Scope Validation di Node.js: Panduan Teknis

Konsep Dasar Validasi Scope JWT

Validasi scope dalam JSON Web Token (JWT) adalah mekanisme otorisasi berbasis klaim (claims-based authorization). Berbeda dengan autentikasi yang memverifikasi identitas, validasi scope memastikan bahwa token yang valid memiliki izin (permissions) spesifik untuk mengakses resource tertentu. Dalam ekosistem Node.js, implementasi ini dilakukan melalui middleware yang memeriksa array scope di dalam payload JWT sebelum memproses request ke controller.

Implementasi Middleware Validasi

Berikut adalah implementasi middleware menggunakan pustaka jsonwebtoken untuk memverifikasi apakah token mengandung scope yang dibutuhkan.

const jwt = require('jsonwebtoken');

const checkScope = (requiredScope) => {
  return (req, res, next) => {
    const authHeader = req.headers.authorization;
    if (!authHeader) return res.status(401).json({ message: 'Token tidak ditemukan' });

    const token = authHeader.split(' ')[1];
    try {
      const decoded = jwt.verify(token, process.env.JWT_SECRET);
      const scopes = decoded.scope || [];

      if (scopes.includes(requiredScope)) {
        req.user = decoded;
        next();
      } else {
        res.status(403).json({ message: 'Akses ditolak: Scope tidak mencukupi' });
      }
    } catch (err) {
      res.status(401).json({ message: 'Token tidak valid' });
    }
  };
};

// Penggunaan di Route
app.get('/admin/data', checkScope('admin:read'), (req, res) => {
  res.send('Data rahasia admin');
});

Tabel Perbandingan Metode Otorisasi

MetodeKelebihanKekurangan
JWT ScopeStateless, skalabel, performa tinggiToken tidak bisa dicabut sebelum expired
Database CheckReal-time, mudah dicabutBeban query database tinggi
RBAC (Role)Manajemen simpelKurang fleksibel untuk akses granular

Langkah Teknis Implementasi

  1. Definisikan Scope: Tentukan daftar scope (misal: read:users, write:posts) di sisi server.
  2. Generate Token: Saat login, sertakan array scope dalam payload JWT.
  3. Middleware Validation: Gunakan fungsi middleware di atas pada route yang membutuhkan proteksi.
  4. Error Handling: Pastikan response 403 (Forbidden) dikembalikan jika scope tidak cocok, dan 401 (Unauthorized) jika token kedaluwarsa atau rusak.

Troubleshooting Lapangan

  • Token Terlalu Besar: Jika scope terlalu banyak, ukuran header HTTP bisa membengkak. Gunakan singkatan (misal: r:u untuk read:users).
  • Scope Dinamis: Jika scope berubah sering, pertimbangkan untuk menyimpan scope di Redis dan melakukan validasi tambahan di middleware.
  • Secret Key: Pastikan process.env.JWT_SECRET tersimpan aman di environment variable, bukan hardcoded di dalam source code.