Panduan Praktis Mengamankan API dengan OAuth 2.0 dan JWT untuk Developer
FA
Faris Aksa

Dipublikasikan 4 Juni 2026

Panduan Praktis Mengamankan API dengan OAuth 2.0 dan JWT untuk Developer

Keamanan API adalah fondasi yang tidak bisa ditawar-tawar dalam pengembangan aplikasi modern. Setiap hari, ribuan endpoint API terpapar di internet tanpa perlindungan yang memadai, menjadi target serangan yang mengakibatkan kebocoran data sensitif. Bagi developer Indonesia yang sedang membangun platform skala startup hingga enterprise, memahami OAuth 2.0 dan JWT (JSON Web Token) bukan lagi opsional, tapi keharusan.

Artikel ini akan membawa kamu dari konsep dasar hingga implementasi praktis mengamankan REST API menggunakan OAuth 2.0 dan JWT. Kita akan menggunakan contoh kode dalam Python dan Node.js agar mudah diikuti regardless of stack yang kamu gunakan.

Mengapa API Perlu Dilindungi?

Tanpa mekanisme autentikasi dan otorisasi yang kuat, API kamu rentan terhadap berbagai ancaman:

  • Unauthorized access: attacker bisa mengakses endpoint admin atau user lain

  • Data exfiltration: pengambilan data secara massal tanpa izin

  • Rate limit bypass: abuse resource yang mengakibatkan downtime

  • Session hijacking: pencurian credential yang aktif

Solusi tradisional seperti session cookie-based authentication masih valid untuk monolithic app, tapi untuk arsitektur microservices dan mobile-backend, token-based authentication jauh lebih scalable.

Memahami OAuth 2.0

OAuth 2.0 adalah framework otorisasi yang memungkinkan aplikasi pihak ketiga mendapatkan akses terbatas ke resource user tanpa meminta password mereka. Dalam konteks API, OAuth 2.0 sering digunakan untuk delegated access, misalnya aplikasi mobile yang mengakses Google Calendar user.

Empat grant type utama dalam OAuth 2.0:

  1. Authorization Code: paling aman untuk server-side application

  2. Implicit: untuk single-page application (SPA), sekarang sudah deprecated

  3. Password Credentials: hanya untuk trusted first-party app

  4. Client Credentials: untuk machine-to-machine communication

Untuk API internal dan mobile app, Authorization Code dengan PKCE (Proof Key for Code Exchange) adalah rekomendasi terbaru dari RFC 7636.

Mengenal JSON Web Token (JWT)

JWT adalah standar terbuka (RFC 7519) untuk mengirimkan informasi antar pihak sebagai objek JSON yang sudah di-sign secara kriptografis. Struktur JWT terdiri dari tiga bagian yang dipisahkan titik:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFubmEiLCJpYXQiOjE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMe...

Header: algoritma dan tipe token
Payload: klaim atau data user
Signature: verifikasi integritas

JWT umumnya digunakan sebagai access token dalam arsitektur OAuth 2.0. Setelah user login dan mendapatkan authorization code, server akan mengirimkan access token (JWT) yang kemudian disimpan client dan dikirim di header setiap request.

Langkah 1: Membuat Auth Server Sederhana dengan Node.js

Kita mulai dengan membuat server autentikasi menggunakan Express dan library jsonwebtoken. Pastikan kamu sudah menginisialisasi project:

npm init -y
npm install express jsonwebtoken bcryptjs dotenv

Buat file server.js dengan struktur dasar:

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
require('dotenv').config();

const app = express();
app.use(express.json());

const users = []; // simpan di database production
const SECRET = process.env.JWT_SECRET;

// Register endpoint
app.post('/register', async (req, res) => {
  const hashed = await bcrypt.hash(req.body.password, 10);
  users.push({ email: req.body.email, password: hashed });
  res.json({ message: 'User registered' });
});

// Login endpoint
app.post('/login', async (req, res) => {
  const user = users.find(u => u.email === req.body.email);
  if (!user || !await bcrypt.compare(req.body.password, user.password)) {
    return res.status(401).json({ error: 'Invalid credentials' });
  }
  const token = jwt.sign({ sub: user.email }, SECRET, { expiresIn: '1h' });
  res.json({ access_token: token });
});

app.listen(3000, () => console.log('Auth server running'));

Pastikan environment variable JWT_SECRET diatur ke string random yang panjang dan disimpan dengan aman di production.

Langkah 2: Middleware Verifikasi Token

Setelah client mendapatkan access token, setiap request ke API yang dilindungi harus menyertakan token di header Authorization. Buat middleware untuk memverifikasi token:

function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  if (!token) return res.sendStatus(401);

  jwt.verify(token, SECRET, (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
}

app.get('/profile', authenticateToken, (req, res) => {
  res.json({ message: 'Protected data', user: req.user });
});

Perhatikan penggunaan authHeader && authHeader.split(' ')[1] untuk mengekstrak token setelah kata Bearer. Tanpa pemeriksaan ini, server bisa crash jika header tidak ada.

Langkah 3: Implementasi Refresh Token

Access token dengan masa berlaku singkat (15 menit hingga 1 jam) lebih aman, tapi user akan terganggu jika harus login ulang terus-menerus. Solusinya adalah refresh token dengan masa berlaku lebih panjang yang disimpan secara aman.

Alur refresh token:

  1. User login, server kirim access token (15 menit) dan refresh token (7 hari)

  2. Client simpan refresh token di httpOnly cookie atau secure storage

  3. Saat access token expired, client kirim refresh token ke endpoint /refresh

  4. Server validasi refresh token dan kirim access token baru

Refresh token harus disimpan di database dengan hashing dan bisa di-revoke jika user logout atau terdeteksi aktivitas mencurigakan.

Langkah 4: Keamanan Tambahan yang Wajib Diterapkan

Implementasi OAuth 2.0 dan JWT saja belum cukup. Berikut praktik keamanan wajib yang sering terlupakan:

  • Gunakan HTTPS di semua endpoint autentikasi untuk mencegah man-in-the-middle attack

  • Atur CORS policy secara ketat, jangan gunakan wildcard * di production

  • Implementasi rate limiting pada endpoint login untuk mencegah brute force

  • Simpan JWT secret di environment variable, jangan hardcode di repository

  • Gunakan algoritma RS256 untuk production karena memisahkan public dan private key

Common Vulnerabilities dalam Implementasi JWT

Bahkan developer berpengalaman terkadang melakukan kesalahan fatal:

  1. None algorithm attack: attacker mengubah alg ke none dan menghapus signature. Selalu verifikasi algoritma di server.

  2. Weak secret: secret pendek atau predictable bisa di-crack dengan brute force. Gunakan minimal 256 bit random string.

  3. Missing expiration: token tanpa exp bisa dipakai selamanya. Selalu set expiresIn.

Referensi: OWASP Cheat Sheet untuk JWT menyediakan checklist komprehensif untuk audit keamanan token implementation.


Kesimpulan

Mengamankan API dengan OAuth 2.0 dan JWT adalah kombinasi yang powerful jika diimplementasikan dengan benar. Fokus pada pemilihan grant type yang tepat, masa berlaku token yang sesuai, dan hardening server dengan HTTPS serta rate limiting. Keamanan bukan fitur yang ditambahkan di akhir, tapi mindset yang harus ada sejak desain arsitektur pertama.

Untuk studi lebih lanjut, kunjungi OAuth.net dan JWT Introduction. Dokumentasi resmi RFC 6749 dan RFC 7519 juga sangat direkomendasikan untuk pemahaman mendalam.