tutorial

46 Menambahkan Middleware Autentikasi JWT

46 Menambahkan Middleware Autentikasi JWT

Autentikasi adalah salah satu aspek paling krusial dalam pengembangan aplikasi web modern. Salah satu solusi yang populer dan efisien untuk menangani otentikasi di aplikasi stateless adalah JSON Web Token (JWT). Pada artikel ke-46 dalam serial ini, saya akan membahas bagaimana menambahkan middleware autentikasi JWT pada backend Node.js (menggunakan Express) dengan studi kasus sederhana, contoh kode, simulasi request, hingga diagram alur agar semakin mudah dipahami. Artikel ini disusun untuk membantu kamu, baik pemula maupun yang sudah berpengalaman, memahami proses mengamankan route menggunakan JWT middleware.


Mengenal JWT (JSON Web Token) secara Singkat

JWT adalah standar terbuka (RFC 7519) untuk pertukaran informasi yang aman sebagai objek JSON. Kenapa JWT populer? Karena ia simple, lightweight dan mudah diterapkan serta bisa digunakan pada arsitektur aplikasi modern seperti RESTful API.

JWT terdiri dari tiga bagian:

  1. Header (informasi tipe token & algoritma signing)
  2. Payload (data yang ingin dibagikan)
  3. Signature (hasil hash dari header+payload dengan secret key)

Contoh JWT token (disingkat):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NSIsImlhdCI6MTY3NjM5MDAwMH0.JstShdk8laNsFnw4rVSdaLRKOa8Aq9s8KfT

Problem: Tanpa Middleware Autentikasi

Sebelum ada middleware autentikasi, route pada aplikasi dapat diakses bebas. Contoh Express route tanpa autentikasi:

app.get('/profile', (req, res) => {
  res.send('Data profil user yang seharusnya hanya bisa diakses user terautentikasi');
});

Risikonya: Siapapun bisa mengakses /profile.


Solusi: Middleware Autentikasi JWT

Konsep Middleware

  • Middleware di Express adalah fungsi yang memiliki akses ke req, res, dan next.
  • Ia bisa digunakan untuk memvalidasi request, memproses data, mencegat akses, dll.
  • Middleware autentikasi JWT bertugas membaca dan memverifikasi JWT pada setiap request sebelum melanjutkan ke route handler.

Diagram Alur Otentikasi dengan Middleware JWT

flowchart TD
    A[Client mengirim request ke /profile] --> B{Request membawa JWT?}
    B -- Tidak --> C[Respon 401 Unauthorized]
    B -- Ya --> D[Verifikasi Signature JWT]
    D -- Gagal --> C
    D -- Berhasil --> E[Ambil Payload JWT]
    E --> F[Req diteruskan ke route]
    F --> G[Respon Data Profil]

Diagram di atas memperlihatkan bagaimana request yang tidak valid dicegat sebelum mencapai handler.


Implementasi: Langkah demi Langkah

Mari langsung praktik membuat middleware autentikasi JWT di Express.

1. Instalasi package yang dibutuhkan

npm install express jsonwebtoken dotenv

2. Struktur Project (optional)

/project-root
├── .env
├── app.js
└── middleware/
    └── jwtMiddleware.js

3. Konfigurasi Secret Key (.env)

JWT_SECRET=myverystrongsecret

4. Implementasi Middleware (middleware/jwtMiddleware.js)

// File: middleware/jwtMiddleware.js
const jwt = require('jsonwebtoken');

function authenticateJWT(req, res, next) {
    const authHeader = req.headers.authorization;

    if (!authHeader) {
        return res.status(401).json({ message: 'Token tidak ditemukan' });
    }

    const token = authHeader.split(' ')[1];
    // Format: "Bearer <token>"

    jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
        if (err) {
            return res.status(401).json({ message: 'Token tidak valid' });
        }

        req.user = user; // Menyimpan payload ke request
        next();
    });
}

module.exports = authenticateJWT;

5. Penggunaan Middleware pada Route (app.js)

require('dotenv').config();
const express = require('express');
const authenticateJWT = require('./middleware/jwtMiddleware');

const app = express();

app.get('/profile', authenticateJWT, (req, res) => {
    // req.user adalah payload yang sudah diverifikasi
    res.json({
        message: 'Hello, ' + req.user.username,
        data: req.user
    });
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

6. Simulasi Login: Generate JWT

Untuk menguji, kita membutuhkan endpoint login sederhana.

const jwt = require('jsonwebtoken');
app.use(express.json());

app.post('/login', (req, res) => {
    // Simulasi user & validasi (hard-coded)
    const { username, password } = req.body;
    if (username === 'budi' && password === 'rahasia') {
        // Payload bebas, minimal biasanya userId / username
        const payload = { username: username, id: 1 };
        const token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h' });
        res.json({ accessToken: token });
    } else {
        res.status(401).json({ message: 'Username atau password salah' });
    }
});

Simulasi Request & Response

1. Login dan Dapatkan Token

  • Request
POST /login
Content-Type: application/json

{
  "username": "budi",
  "password": "rahasia"
}
  • Response
{
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR... (token panjang)"
}

2. Akses Route Terproteksi

  • Request
GET /profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR...(token dari login)
  • Response
{
  "message": "Hello, budi",
  "data": {
      "username": "budi",
      "id": 1,
      "iat": 1683960600,
      "exp": 1683964200
  }
}

3. Akses tanpa Token

  • Request
GET /profile
  • Response
{ "message": "Token tidak ditemukan" }

Keunggulan dan Kelemahan JWT Middleware

KeunggulanKelemahan/Perlu Diwaspadai
Stateless, scalableToken bisa disalahgunakan jika bocor
Multi-platform friendlyTidak mudah dicabut/dibatalkan
Mudah diimplementasikanUkuran payload bisa besar
Cepat (tanpa DB lookup)Perlu expired & rotation management

Best Practice & Catatan

  • Selalu simpan secret key di environment variable.
  • Jangan masukkan informasi sensitif pada payload JWT.
  • Implementasikan expiry (exp) pada JWT untuk keamanan ekstra.
  • Untuk aplikasi kompleks, pertimbangkan mekanisme blacklist/whitelist token, terutama saat user logout.

Penutup

Menambahkan middleware autentikasi JWT merupakan langkah penting dalam mengamankan API modern. Dengan sedikit tambahan kode, kita dapat memfilter request tanpa autentikasi dan hanya memberikan akses pada user valid sesuai payload JWT mereka. Pendekatan ini juga sangat fleksibel untuk diterapkan di sistem microservices dan aplikasi mobile.

Semoga artikel ini membantu memahami role middleware JWT secara terstruktur. Silakan remix contoh kode di atas sesuai kebutuhan proyekmu. Jika ada pertanyaan atau ingin berbagi pengalaman implementasi JWT di stack teknologi lain, drop komentar di bawah ya! 🚀


Referensi:

  1. RFC 7519 - JSON Web Token (JWT)
  2. Express.js Middleware
  3. jsonwebtoken NPM Package
comments powered by Disqus

Topik Terhangat

programming
271
tutorial
138
tips-and-trick
43
jaringan
28
hardware
11
linux
4
kubernetes
1