API Gateway sebagai Lapisan Keamanan
API Gateway adalah reverse proxy yang berdiri di depan API backend dan menyediakan fitur keamanan terpusat: autentikasi, rate limiting, logging, dan transformasi request.
Fungsi Keamanan API Gateway
- Authentication — Validasi token sebelum request sampai ke backend
- Rate limiting — Throttle request per client/IP
- Request validation — Validasi schema dan ukuran request
- IP whitelisting/blacklisting — Blokir IP yang mencurigakan
- Logging & monitoring — Catat semua traffic API
- TLS termination — Handle HTTPS di gateway
Contoh Konfigurasi Nginx sebagai API Gateway
server {
listen 443 ssl;
server_name api.example.com;
# Security headers
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header X-XSS-Protection "0" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Rate limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /api/ {
limit_req zone=api burst=20 nodelay;
# Batasi ukuran request
client_max_body_size 10m;
# Proxy ke backend
proxy_pass http://backend:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Security Headers untuk API
// Middleware Express.js untuk security headers
const helmet = require("helmet");
app.use(helmet());
// Atau set manual
app.use((req, res, next) => {
// Mencegah MIME type sniffing
res.setHeader("X-Content-Type-Options", "nosniff");
// Mencegah iframe embedding (DENY = blokir semua, SAMEORIGIN = izinkan dari domain sendiri)
res.setHeader("X-Frame-Options", "DENY"); // atau "SAMEORIGIN"
// Kontrol informasi referer
res.setHeader("Referrer-Policy", "strict-origin-when-cross-origin");
// Permissions Policy — batasi fitur browser
res.setHeader("Permissions-Policy",
"camera=(), microphone=(), geolocation=()");
next();
});
API-Specific Security
// Batasi content type yang diterima
app.use((req, res, next) => {
if (req.method !== "GET" && !req.is("application/json")) {
return res.status(415).json({
error: "Content-Type harus application/json"
});
}
next();
});
// Nonaktifkan fitur yang tidak diperlukan
app.disable("x-powered-by"); // Jangan expose framework yang digunakan
Best Practices
- Gunakan API Gateway untuk sentralisasi keamanan
- Selalu set security headers yang relevan
- Batasi Content-Type yang diterima
- Sembunyikan informasi server/framework
- Log semua request untuk audit dan monitoring
- Gunakan API versioning untuk backward compatibility