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:
- Header (informasi tipe token & algoritma signing)
- Payload (data yang ingin dibagikan)
- 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
, dannext
. - 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
Keunggulan | Kelemahan/Perlu Diwaspadai |
---|---|
Stateless, scalable | Token bisa disalahgunakan jika bocor |
Multi-platform friendly | Tidak mudah dicabut/dibatalkan |
Mudah diimplementasikan | Ukuran 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:
68. Kompresi Data (gzip) di gRPC
Artikel Terhangat
47 Membuat Mutation Login dan Signup
08 Aug 2025
69. Studi Kasus: Retry dan Backoff Strategy
08 Aug 2025
46 Menambahkan Middleware Autentikasi JWT
08 Aug 2025
68. Kompresi Data (gzip) di gRPC
08 Aug 2025
67. Retry Mechanism di Client gRPC
08 Aug 2025
44 Mocking Database untuk Test Resolver
08 Aug 2025
66. Deadline dan Timeout pada gRPC
08 Aug 2025

47 Membuat Mutation Login dan Signup

69. Studi Kasus: Retry dan Backoff Strategy

46 Menambahkan Middleware Autentikasi JWT

68. Kompresi Data (gzip) di gRPC

67. Retry Mechanism di Client gRPC

44 Mocking Database untuk Test Resolver
