💻 request-transformer
plugins:
- name: request-transformer
route: rute-pesanan
config:
add:
headers:
- "X-Sumber:gateway"
- "X-Diteruskan-Oleh:kong"
querystring:
- "versi:v2"
remove:
headers:
- "X-Header-Internal"
- "Authorization" # jangan teruskan token mentah ke upstream
rename:
headers:
- "X-Lama:X-Baru"
replace:
headers:
- "Host:layanan-internal"
💻 response-transformer
plugins:
- name: response-transformer
service: layanan-pesanan
config:
remove:
headers:
- "Server" # sembunyikan detail teknologi
- "X-Powered-By"
json:
- "debug_info" # buang field internal
- "internal_id"
add:
headers:
- "X-Waktu-Respons:$(date)"
json:
- "api_version:v2"
Header seperti Server dan X-Powered-By memberi tahu penyerang persis teknologi dan versi yang Anda pakai, sehingga mereka bisa langsung mencari eksploit yang cocok. Menghapusnya di gateway berlaku untuk semua layanan sekaligus, tanpa perlu mengubah satu pun aplikasi.
🔀 Kegunaan Nyata: Menjaga Kompatibilitas
Masalah: layanan mengganti nama field "nama" menjadi "nama_lengkap",
tetapi ada klien mobile lama yang belum bisa diperbarui.
Solusi sementara di gateway:
plugins:
- name: response-transformer
route: rute-v1-pengguna
config:
add:
json:
- "nama:$(headers.x-nama-lengkap)"
Transformasi kompatibilitas di gateway memang menyelamatkan Anda saat mendesak. Tetapi ia menciptakan perilaku yang tidak terlihat di kode layanan mana pun. Pengembang baru yang membaca kode akan bingung kenapa responsnya berbeda dari yang tertulis.
Tetapkan tanggal kedaluwarsa saat memasangnya, catat di dokumentasi, dan hapus begitu klien lama sudah bermigrasi.
🚫 Batas yang Wajar
Godaan yang sering muncul: karena transformasi begitu mudah, orang mulai memindahkan makin banyak logika ke gateway — menggabungkan beberapa respons, menghitung nilai, menerapkan aturan bisnis lewat pre-function Lua. Akhirnya gateway menjadi aplikasi tersembunyi yang tidak punya uji, tidak punya kontrol versi yang layak, dan hanya dipahami satu-dua orang.
Batas yang sehat: gateway boleh mengurus hal yang seragam untuk semua layanan — autentikasi, kuota, log, header keamanan, penyembunyian detail teknologi. Apa pun yang khas untuk satu layanan sebaiknya berada di dalam kode layanan itu, tempat ia bisa diuji.
🧪 Menguji Transformasi
# Lihat persis apa yang diterima upstream dengan layanan echo
services:
- name: echo
url: http://httpbin.org/anything
routes:
- name: rute-echo
paths: ["/echo"]
# lalu:
curl -s http://localhost:8000/echo | jq '.headers, .args'
# Keluarannya memperlihatkan header dan query setelah transformasi.