Episode ini menutup celah keamanan paling umum: security headers dengan helmet, validasi input dan pencegahan injection, rate limiting untuk mencegah serangan brute force, pengelolaan secrets, serta audit dependensi dengan npm audit.

Keamanan bukan fitur yang ditambahkan di akhir — keamanan adalah keputusan yang dibuat di setiap lapisan: header HTTP, validasi input, pembatasan akses, dan manajemen rahasia. Aplikasi Node.js yang menelantarkan salah satunya menjadi target yang mudah.
Episode 20 membahas security hardening praktis: header keamanan dengan helmet, pencegahan injection dengan validasi dan query terparameterisasi, rate limiting untuk menahan brute force, pengelolaan secrets yang benar, dan audit dependensi. Setelah episode ini, aplikasi kalian jauh lebih sulit ditembus.
Helmet memasang kumpulan header HTTP yang mematikan banyak teknik serangan web: XSS, clickjacking, MIME sniffing, dan lainnya. Pemasangannya hanya satu baris:
npm install helmetnpm install helmet menambahkan paket yang mengatur header keamanan secara otomatis sesuai rekomendasi industri.
import helmet from "helmet";
app.use(helmet());app.use(helmet()) memasang header seperti Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, dan Strict-Transport-Security. Header Content-Security-Policy membatasi sumber script yang boleh dijalankan — perisai kuat melawan XSS. Jika perlu, atur kebijakan tertentu lewat opsi helmet({ contentSecurityPolicy: { directives: {...} } }).
Injection terjadi ketika data yang tidak dipercaya ikut dieksekusi — SQL injection memasukkan perintah ke query, dan XSS menyisipkan script ke halaman. Dua kebiasaan dari episode 15 dan 14 sudah menutup jalan utamanya:
const hasil = skemaPengguna.safeParse(req.body);
if (!hasil.success) {
return res.status(400).json({ error: "Data tidak valid" });
}
const pengguna = await pool.query(
"SELECT * FROM pengguna WHERE email = $1",
[hasil.data.email],
);skemaPengguna.safeParse(req.body) memvalidasi bentuk input, dan placeholder $1 dengan array parameter memastikan nilai tidak pernah diinterpretasikan sebagai perintah SQL. Kombinasi ini — validasi di tepi aplikasi dan query terparameterisasi — menutup mayoritas celah injection di aplikasi Node.js.
Input yang dipakai untuk jalur file adalah celah lain: req.params.nama dari episode 17 bisa berisi ../ untuk menembus direktori. Selalu sanitasi dengan resolusi dan pembatasan direktori sebelum memakai input sebagai nama file.
Brute force, scraper, dan DoS bertumpu pada satu hal: memanggil endpoint tanpa henti. Rate limiting membatasi jumlah request dari satu klien dalam jangka waktu tertentu:
npm install express-rate-limitnpm install express-rate-limit menambahkan middleware yang melacak request per IP.
import rateLimit from "express-rate-limit";
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
limit: 100,
standardHeaders: true,
});
app.use("/api/login", limiter);Konfigurasi di atas membatasi 100 request per 15 menit per IP pada route login. Response berlebih otomatis membalas 429 Too Many Requests. Pasang limiter longgar pada API umum dan limiter ketat pada endpoint sensitif seperti login dan reset password.
Secrets — JWT_SECRET, DATABASE_URL, kunci API — tidak pernah boleh masuk kode atau repository. Kebiasaan dari episode 12 wajib dipegang: simpan di environment variable, jangan commit .env, dan rotasi rahasia yang bocor. Untuk kebutuhan tingkat lanjut, pertimbangkan tool manajemen rahasia seperti Vault atau OpenBao yang menyimpan dan mengeluarkan secrets terenkripsi.
Aplikasi Node.js berisi ratusan paket, dan setiap paket bisa membawa kerentanan. npm audit memindai dependency tree terhadap database kerentanan:
npm audit
npm audit fixnpm audit melaporkan kerentanan dengan level keparahan, sementara npm audit fix memperbarui paket secara otomatis bila aman. Jadikan audit ini bagian dari rutinitas: jalankan berkala dan di CI, karena kerentanan baru ditemukan setiap hari. Paket yang tidak terpakai lebih baik dihapus — memperkecil permukaan serangan.
Tidak ada satu kunci pun yang membuat aplikasi aman. Keamanan bekerja berlapis: header yang benar menangkal serangan browser, validasi dan query aman menutup injection, rate limiting menahan penyalahgunaan, dan secrets yang terjaga membatasi dampak kebocoran. Semakin banyak lapisan, semakin mahal serangan bagi penyerang — dan semakin sulit aplikasi kalian ditembus.
Inti yang harus dibawa pulang:
npm audit dipindai berkala dan di CI untuk kerentanan dependensi.Di episode 21 selanjutnya kita akan membahas containerization, Docker, dan deployment simple — Dockerfile multi-stage untuk aplikasi Node.js, .dockerignore, image yang ramping, menjalankan container dengan docker compose, dan strategi deployment sederhana. Kalian akan mengemas aplikasi agar berjalan sama di mana pun.