Memahami req.protocol di Express.js untuk Deteksi Protokol

Properti req.protocol dalam kerangka kerja Express.js digunakan untuk mengembalikan string protokol permintaan yang masuk, yaitu 'http' atau 'https'. Properti ini sangat penting ketika aplikasi Node.js Anda berada di belakang penyeimbang beban (load balancer) atau reverse proxy seperti Nginx, HAProxy, atau Cloudflare, di mana konfigurasi header HTTP tambahan diperlukan agar deteksi protokol tidak salah membaca koneksi internal.

Secara default, nilai properti ini ditentukan oleh koneksi socket TCP langsung ke server Node.js. Namun, jika aplikasi Anda mengaktifkan pengaturan 'trust proxy', Express akan membaca header X-Forwarded-Proto yang dikirimkan oleh proxy eksternal untuk menentukan apakah klien menggunakan enkripsi SSL/TLS atau koneksi HTTP standar.

Sintaks dan Contoh Penggunaan Dasar

Penggunaan properti ini sangat sederhana dan biasanya dipanggil di dalam fungsi pengendali rute (route handler) untuk keperluan pengalihan URL (redirect), pembuatan tautan absolut, atau pengaturan cookie yang aman.

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

app.get('/', (req, res) => {
  // Mendapatkan protokol yang digunakan klien
  const currentProtocol = req.protocol;
  
  // Mendapatkan nama host dari header Host
  const host = req.get('host');

  res.send(`Aplikasi Anda diakses menggunakan protokol: ${currentProtocol} dengan host ${host}`);
});

app.listen(3000);

Peran Penting Pengaturan 'trust proxy'

Ketika aplikasi Express.js berjalan di lingkungan produksi (production), aplikasi hampir selalu berada di belakang reverse proxy. Jika Anda tidak mengaktifkan app.set('trust proxy', true), req.protocol akan selalu mengembalikan 'http' meskipun pengguna mengakses situs Anda menggunakan https://.

Konfigurasi Express Kondisi Proxy Hasil req.protocol Keterangan Teknis
Tanpa Trust Proxy Di belakang Nginx/Cloudflare http Membaca langsung dari socket TCP lokal antara proxy dan Node.js.
app.set('trust proxy', true) Di belakang Nginx/Cloudflare https Membaca nilai dari header X-Forwarded-Proto yang diteruskan proxy.
Menggunakan IP Tertentu Proxy tepercaya https Hanya mempercayai header dari alamat IP proxy yang ditentukan secara spesifik.

Penerapan Nyata untuk Pengalihan HTTPS Otomatis

Salah satu penggunaan paling umum dari properti ini adalah memaksa pengguna agar beralih dari koneksi HTTP yang tidak aman ke HTTPS secara otomatis di sisi server.

app.use((req, res, next) => {
  // Aktifkan app.set('trust proxy', true) terlebih dahulu
  if (req.protocol !== 'https' && process.env.NODE_ENV === 'production') {
    return res.redirect(`https://${req.headers.host}${req.url}`);
  }
  next();
});

Troubleshooting Masalah req.protocol

Jika nilai yang dihasilkan tidak sesuai harapan, periksa beberapa hal berikut di infrastruktur Anda:

  • Header Hilang: Pastikan reverse proxy (seperti Nginx) dikonfigurasi untuk meneruskan header proxy_set_header X-Forwarded-Proto $scheme; ke aplikasi Node.js.
  • Multi-Proxy: Jika menggunakan beberapa lapis proxy, nilai trust proxy harus disesuaikan dengan jumlah hop atau rentang IP proxy yang valid agar Express tidak membaca alamat IP yang salah.
  • Environment: Pastikan pengujian lokal dan produksi dibedakan karena lingkungan lokal umumnya tidak menggunakan SSL/TLS kecuali dikonfigurasi secara manual dengan sertifikat self-signed.