API Route Next.js akan lebih tahan terhadap penyalahgunaan ketika kita menerapkan beberapa lapis perlindungan: memvalidasi token atau sesi, merotasi secret secara berkala, membatasi laju permintaan adaptif, dan menguji semua skenario kritis. Artikel ini menyajikan langkah konkret untuk mengamankan route API, lengkap dengan middleware, pola penyimpanan rahasia, pengujian otomatis, serta indikator monitoring yang relevan.
Validasi Token yang Konsisten di API Route Next.js
Setiap API Route harus memeriksa token atau sesi sebelum memproses logika bisnis. Tanpa pemeriksaan eksplisit, permintaan yang tidak sah bisa mengakses data privat. Gunakan middleware khusus untuk memastikan header Authorization berisi Bearer token yang valid dan belum expire.
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
const EXPECTED_AUDIENCE = process.env.TOKEN_AUDIENCE;
export async function middleware(req: NextRequest) {
const authHeader = req.headers.get('authorization');
if (!authHeader?.startsWith('Bearer ')) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const token = authHeader.split(' ')[1];
try {
const claims = verifyToken(token, EXPECTED_AUDIENCE);
req.nextUrl.searchParams.set('userId', claims.sub);
return NextResponse.next();
} catch (err) {
return NextResponse.json({ error: 'Invalid token' }, { status: 401 });
}
}
function verifyToken(token: string, audience: string) {
const payload = jwt.verify(token, getActiveSecret(), { audience });
if (payload.exp && Date.now() / 1000 > payload.exp) {
throw new Error('Token expired');
}
return payload;
}
Middleware di atas mengcentralisasi verifikasi token sehingga setiap route hanya menerima request setelah lulus filter. Pastikan verifyToken memakai secret aktif dari rotasi (lihat bagian berikut) dan memeriksa aud/sub untuk mencegah token penggunaan ulang di konteks lain.
Rotasi Secret dan Pola Penyimpanan Rahasia
Secret JWT atau HMAC harus disimpan di sistem yang mendukung rotasi: secret manager cloud, HashiCorp Vault, atau AWS Secrets Manager. Strategi rotasi minimal setiap beberapa minggu dan bisa dipicu manual saat ditemukan indikasi bocor. Implementasi tipikal menyimpan daftar secret valid, dengan satu secret aktif yang digunakan untuk menandatangani token baru.
Contohnya:
- Secret manager menyimpan versi
secret_v2dansecret_v1. - Server menggunakan
secret_v2untuk menandatangani token baru. - Verifikasi menerima keduanya agar token lama tetap valid sampai masa kadaluarsa pendek.
- Setelah semua token lama kedaluwarsa, hapus
secret_v1.
Dalam codebase, panggil secret manager sekali saat startup dan refresh secara periodik atau berdasarkan webhook notifikasi dari secret manager. Jangan hardcode secret di repository. Gunakan library seperti node-cache untuk mempertahankan secret aktif serta fallback ke secret sebelumnya selama window rotasi.
Rate Limit Adaptif dan Mitigasi Abuse
Rate limit dasar bisa berbasis IP, tapi rate limit adaptif yang mempertimbangkan user ID, endpoint sensitif, dan pola permintaan lebih efektif. Gunakan penyimpanan cepat seperti Redis untuk sliding window per token atau user.
Contoh strategi:
- Quota Perceived: per-user per-endpoint dengan durasi pendek (misalnya 30 permintaan / menit). Jika tercapai, balas 429 dan catat metadata untuk tooling.
- Escalation: jika ada lonjakan tiba-tiba (misalnya 5x rata-rata), turunkan batas dan log event untuk analisis lebih lanjut.
- Adaptive Liveness: jika backend mulai menolak request karena overload, automatically adjust limit agar API tetap responsif.
Gunakan kombinasi header respons seperti Retry-After dan metrik internal agar konsumer mengatur ulang pola panggilan. Kelemahan pendekatan adaptif adalah kompleksitas tambahan dan potensi false positive; pantau rate limit hit untuk menyempurnakan threshold.
Pengujian Otomatis dan Monitoring Indikator
Pengujian otomatis memastikan validasi token, rotasi secret, dan rate limit berfungsi secara konsisten. Gunakan integration test dengan alat seperti Supertest atau Playwright API. Contoh:
import request from 'supertest';
import { createServer } from '../../app';
test('mengembalikan 401 untuk token expired', async () => {
const server = await createServer();
const expiredToken = generateToken({ exp: Math.floor(Date.now() / 1000) - 60 });
const response = await request(server).get('/api/data').set('Authorization', `Bearer ${expiredToken}`);
expect(response.status).toBe(401);
});
Simulasikan rotasi secret dengan mengubah nilai secret aktif dan memastikan token lama masih diterima sampai masa kedaluwarsa selesai. Untuk rate limit, buat test yang mengirim permintaan beruntun dan verifikasi header 429.
Monitoring operasional harus mencakup indikator seperti:
- Persentase token invalid per waktu.
- Frekuensi 429 per route (menunjukkan potensi scraping).
- Latensi middleware validasi token.
- Alert saat secret rotasi gagal.
Gabungkan log dari API gateway dan middleware untuk korelasi kejadian. Jika rate limit adaptif terlalu agresif, gunakan dashboard untuk menyesuaikan parameter dan analisis false positive.
Penutup
Memperkuat API Route Next.js tidak cukup hanya dengan validasi dasar. Kombinasikan middleware token yang ketat, rotasi secret yang terjadwal, rate limit adaptif yang memperhatikan konteks pemanggil, serta pengujian otomatis plus monitoring yang berkelanjutan. Dengan pendekatan berlapis, API Anda tetap responsif sekaligus tahan terhadap penyalahgunaan.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!