Episode ini menjelaskan HTTP Basic Authentication dengan htpasswd, otentikasi subrequest memakai auth_request untuk delegasi ke auth API, serta pendekatan validasi token JWT di NGINX.

Rate limiting di episode 11 melindungi dari serangan volume, tapi belum menjawab pertanyaan dasar: siapa yang boleh masuk? Episode 12 ini membahas authentication dan authorization di NGINX, dari yang paling sederhana sampai pola enterprise.
Kalian akan mengamankan area internal dengan HTTP Basic Authentication, mendelegasikan otentikasi ke backend auth API memakai auth_request, dan memahami pendekatan validasi JWT. Setelah episode ini, kalian bisa memutuskan lapisan otentikasi mana yang cocok untuk setiap bagian aplikasi.
Cara paling cepat mengamankan sebuah lokasi: minta username dan password lewat dialog browser. Pertama, buat file password memakai utilitas htpasswd dari paket apache2-utils:
sudo apt install apache2-utils -y
sudo htpasswd -c /etc/nginx/.htpasswd armanPerintah htpasswd -c /etc/nginx/.htpasswd arman membuat file baru dan menambah user arman, lalu meminta password dua kali. Untuk menambah user lain, hapus opsi -c.
Aktifkan otentikasi di lokasi yang ingin dilindungi:
location /admin {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}Saat mengakses /admin, browser meminta kredensial. NGINX memverifikasi terhadap file auth_basic_user_file dan menolak dengan status 401 jika salah. Sederhana dan efektif untuk dashboard internal.
Basic auth tidak fleksibel untuk aplikasi modern yang butuh akun, session, dan role. Pola yang dipakai di industri: auth_request. NGINX mengirim subrequest ke endpoint auth sebelum meneruskan request asli ke backend.
location /api/secure {
auth_request /auth-check;
auth_request_set $auth_user $upstream_http_x_auth_user;
proxy_pass http://backend_app;
proxy_set_header X-Auth-User $auth_user;
}
location = /auth-check {
internal;
proxy_pass http://auth_service:8080/validate;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}Alurnya: request ke /api/secure memicu subrequest ke /auth-check yang internal, memanggil auth_service untuk validasi. Jika respons 2xx, request diteruskan; jika 401, NGINX menolak request. Header dari auth service bisa dipetik dengan auth_request_set.
auth_request adalah cara standar berintegrasi dengan OAuth2 Proxy, Keycloak, atau custom auth service tanpa mengubah kode aplikasi satu baris pun.
Validasi JWT memerlukan kode: verifikasi signature, cek ekspired, dan membaca claims. NGINX open source tidak punya modul JWT bawaan, tapi mendukung ekstensi. Dua pendekatan populer:
location lewat directive js_content atau auth_request.lua-resty-jwt untuk memvalidasi token dan meneruskan claims sebagai header.Contoh konsep dengan auth_request untuk validasi token:
location /api/secure {
auth_request /jwt-check;
proxy_pass http://backend_app;
proxy_set_header Authorization $http_authorization;
}
location = /jwt-check {
internal;
js_content jwt_validator.check;
}Auth service melakukan dekripsi dan validasi signature, sedangkan NGINX tetap bertanggung jawab atas routing dan kontrol akses. Dengan pola ini, logika otentikasi tersentralisasi dan bisa dipakai banyak service sekaligus.
auth_request ke auth service (OAuth2, Keycloak, custom).Tidak ada satu jawaban benar. Mulailah dari kebutuhan paling sederhana, lalu tingkatkan kompleksitas seiring pertumbuhan sistem.
Episode 12 membuka pintu kontrol akses: kalian bisa mengunci area dengan Basic Authentication, mendelegasikan otentikasi ke service eksternal lewat auth_request, dan memahami pola validasi JWT dengan njs atau Lua.
Inti yang harus dibawa pulang:
htpasswd membuat file user dan password untuk Basic Authentication.auth_basic dan auth_basic_user_file mengaktifkannya di location.auth_request mendelegasikan otentikasi ke backend auth API lewat subrequest.internal agar tidak diakses langsung.Di episode 13 selanjutnya kita akan membahas WebSocket, Server-Sent Events (SSE), dan gRPC proxying — upgrade header untuk WebSocket, mematikan buffering untuk SSE realtime, serta proxying service gRPC berperforma tinggi.