Handling Proxy IP X-Forwarded-For Secara Tepat & Aman

Handling header X-Forwarded-For (XFF) secara tepat sangat krusial ketika aplikasi web Anda berada di belakang reverse proxy, load balancer, atau CDN seperti Nginx, HAProxy, atau Cloudflare. Tanpa konfigurasi yang benar, aplikasi Anda hanya akan membaca IP lokal dari proxy (seperti 127.0.0.1 atau IP internal gateway) alih-alih alamat IP publik asli pengguna yang mengakses layanan.

Header XFF memiliki format berantai berupa daftar alamat IP yang dipisahkan oleh koma: client_ip, proxy1_ip, proxy2_ip. IP pertama di dalam daftar tersebut adalah IP asli klien. Namun, tantangan terbesarnya adalah potensi pemalsuan (spoofing) oleh pengguna jahat jika aplikasi Anda langsung mempercayai isi header tanpa memvalidasi apakah request tersebut benar-benar berasal dari proxy tepercaya.

Matriks Penanganan Header Proxy Berdasarkan Web Server & Framework

Lingkungan / Server Direktif / Konfigurasi Utama Risiko Keamanan & Catatan
Nginx (Reverse Proxy) proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; Secara otomatis menambahkan IP klien ke dalam rantai XFF yang sudah ada.
Node.js / Express app.set('trust proxy', 'loopback'); Wajib diaktifkan agar req.ip membaca header XFF dengan benar. Jangan set true jika tidak menggunakan proxy terpercaya.
PHP / Apache Modul mod_remoteip Mengubah variabel $_SERVER['REMOTE_ADDR'] menjadi IP asli dari header XFF.
Go (Golang) r.Header.Get("X-Forwarded-For") Harus divalidasi manual atau menggunakan middleware terpercaya seperti Echo/Gin yang mendukung IPHeader.

Langkah Teknis Implementasi di Nginx dan Express.js

Untuk memastikan aplikasi Anda menerima IP yang valid dan tidak mudah dieksploitasi, terapkan konfigurasi pada sisi reverse proxy dan backend aplikasi secara bersamaan.

1. Konfigurasi Nginx sebagai Reverse Proxy

Pastikan Nginx meneruskan IP klien dengan benar ke upstream server menggunakan blok kode berikut di dalam file konfigurasi virtual host:

server {
    listen 80;
    server_name contoh.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

2. Konfigurasi di Express.js (Node.js)

Jika backend menggunakan Express, aktifkan pengaturan trust proxy agar framework tidak salah membaca alamat IP loopback:

const express = require('express');
const app = express();

// Hanya percaya pada proxy lokal atau IP spesifik dari load balancer Anda
app.set('trust proxy', '127.0.0.1'); 

app.get('/', (req, res) => {
    // req.ip akan otomatis mengambil IP asli dari X-Forwarded-For
    console.log('IP Asli Klien:', req.ip);
    res.send(`IP Anda adalah: ${req.ip}`);
});

app.listen(3000, () => console.log('Server berjalan di port 3000'));

Troubleshooting & Mitigasi Spoofing X-Forwarded-For

Masalah paling sering terjadi di lapangan adalah aplikasi mendeteksi IP berulang atau salah membaca IP proxy terakhir karena struktur header yang dimanipulasi oleh penyerang.

  • Validasi IP Proxy Terpercaya: Jangan pernah mempercayai header XFF mentah dari publik. Pastikan hanya menerima header ini jika request melewati reverse proxy internal Anda yang sudah dikonfigurasi untuk menimpa atau menambahkan IP secara aman.
  • Gunakan X-Real-IP: Beberapa arsitektur memilih menggunakan header X-Real-IP yang diatur oleh proxy terdepan untuk langsung menyimpan satu alamat IP tunggal klien, menghindari kompleksitas parsing string koma pada XFF.
  • Periksa Log Load Balancer: Jika data IP masih meleset, cek apakah ada multiple proxy (misalnya Cloudflare + Nginx lokal). Pada kasus multi-proxy, pastikan setiap proxy menambahkan IP ke dalam rantai XFF alih-alih menimpanya secara sembarangan.