skip to content
Personal Blog

Cara mengamankan API di Node.js

/ 3 min read

Updated:
Daftar Isi

cara-mengamankan-api-di-nodejs

di era digital sekarang, API itu jadi jantungnya banyak aplikasi. tapi sayangnya, banyak juga yang masih meremehkan aspek keamanannya. buat saya, mengamankan API itu bukan cuma soal nambahin middleware atau tools, tapi lebih ke mindset dan pendekatan yang menyeluruh dari awal development sampai production.

ada beberapa prinsip utama yang saya pegang untuk mengamankan API di Node.js:

  1. validasi dan sanitasi input itu wajib, jangan pernah percaya sama data dari client.
  2. autentikasi dan otorisasi harus jelas, jangan campur aduk.
  3. batasi request biar API tidak gampang dibombardir.
  4. lindungi data sensitif di transit dan di log.
  5. monitoring, alert, dan audit log harus jalan terus.
  6. dependency dan konfigurasi harus rutin diaudit.

Disclaimer: tulisan ini fokus ke praktik defense dan hardening API, bukan buat nyalahgunakan celah keamanan.

validasi-dan-sanitasi-input-jangan-pernah-percaya-client

ini fondasi paling dasar. jangan pernah anggap data dari client itu aman, walaupun datang dari frontend buatan kita sendiri.

contoh validasi request body pakai zod di Express:

import { z } from "zod";
export const createUserSchema = z.object({
name: z.string().min(2).max(100),
email: z.string().email(),
age: z.number().int().min(13).max(100),
});
export function validateCreateUser(req, res, next) {
const result = createUserSchema.safeParse(req.body);
if (!result.success) {
return res.status(400).json({
message: "payload tidak valid",
errors: result.error.flatten(),
});
}
req.body = result.data;
next();
}

kalau endpoint menerima query string, params, atau header, validasi itu juga. bukan cuma body doang.

autentikasi-vs-otorisasi-jangan-ketuker

autentikasi itu ngecek siapa usernya. otorisasi itu ngecek dia boleh ngapain. banyak API bocor gara-gara udah login tapi role/permission tidak dicek.

contoh middleware otorisasi role sederhana:

export function authorize(...allowedRoles) {
return (req, res, next) => {
const user = req.user;
if (!user) return res.status(401).json({ message: "unauthorized" });
if (!allowedRoles.includes(user.role)) {
return res.status(403).json({ message: "forbidden" });
}
next();
};
}

untuk token, pakai expiry pendek untuk access token, rotate refresh token, dan simpan secret di environment variable, bukan di source code.

rate-limit-dan-proteksi-abuse

api tanpa rate limit itu gampang banget jadi target brute force, spam, atau scraping berlebihan.

contoh pakai express-rate-limit:

import rateLimit from "express-rate-limit";
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 20,
standardHeaders: true,
legacyHeaders: false,
});
app.use("/api/auth", authLimiter);

buat endpoint sensitif kayak login, forgot-password, OTP, dan register, limit-nya wajib lebih ketat.

banyak developer fokus ke business logic tapi lupa hardening layer HTTP.

minimal yang perlu dipasang:

  • helmet untuk security headers.
  • CORS whitelist, jangan pakai wildcard sembarangan untuk credential.
  • cookie dengan HttpOnly, Secure, dan SameSite.
  • nonaktifkan stack trace detail di production.

contoh setup dasar:

import helmet from "helmet";
import cors from "cors";
app.use(helmet());
app.use(
cors({
origin: ["https://app.domainkamu.com"],
credentials: true,
}),
);

enkripsi-dan-manajemen-rahasia

selalu pakai HTTPS/TLS di production. kalau masih HTTP biasa, token dan cookie bisa gampang disadap di jaringan tertentu.

untuk secret management:

  • pisahkan secret per environment (dev, staging, production).
  • jangan commit .env ke repository.
  • rotate API key dan JWT secret secara berkala.
  • pakai secret manager kalau infrastruktur kamu sudah mendukung.

logging-monitoring-dan-audit

keamanan bukan cuma pencegahan, tapi juga deteksi cepat. kalau tidak ada log yang jelas, lu bakal bingung pas ada insiden.

yang perlu dicatat minimal:

  • percobaan login gagal berulang.
  • request ke endpoint sensitif.
  • perubahan role atau hak akses user.
  • error 4xx/5xx yang anomali meningkat.

pastikan log tidak bocorin password, token, OTP, atau data pribadi sensitif.

dependency-scanning-dan-update-rutin

ekosistem Node.js cepat banget berubah. package lama bisa jadi sumber celah.

workflow minimal yang saya sarankan:

  1. cek audit dependency rutin.
  2. update patch/minor terjadwal.
  3. review changelog sebelum major update.
  4. lock version via lockfile supaya build konsisten.

contoh command dasar:

Terminal window
npm audit
npm audit fix

kalau pakai pnpm atau yarn, sesuaikan command-nya.

checklist-production-api-nodejs

biar gampang evaluasi sebelum go-live, ini checklist cepatnya:

  1. semua endpoint sudah validasi input.
  2. endpoint sensitif sudah ada auth + authorization.
  3. rate limit aktif di route penting.
  4. CORS, security headers, dan cookie policy sudah aman.
  5. HTTPS aktif penuh dan redirect dari HTTP.
  6. log, monitoring, backup, dan alert sudah dites.
  7. dependency audit terakhir dalam status aman.

kesimpulannya

mengamankan API di Node.js itu proses berkelanjutan, bukan tugas sekali jadi. mulai dari validasi input, kontrol akses, proteksi abuse, sampai monitoring harus jalan bareng.

kalau dari awal bangun mindset security-first, API lu bukan cuma jalan, tapi juga lebih tahan pas ketemu trafik liar, bot, atau percobaan serangan beneran.