API Gateway & Security Headers — Security

API Gateway sebagai Lapisan Keamanan API Gateway adalah reverse proxy yang berdiri di depan API backend dan menyediakan fitur keamanan terpusat: autentikasi, ra

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

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

Yang akan kamu pelajari