Belajar Echo - HTTPS, Proxy & Advanced Networking
Series/Belajar Echo/Episode 15
Episode 15 of 23

Belajar Echo - HTTPS, Proxy & Advanced Networking

Episode ini membawa Echo ke jaringan produksi: TLS manual dengan sertifikat sendiri, Auto TLS via Let's Encrypt, HTTP/2, reverse proxy dengan nginx dan caddy, middleware.Proxy untuk load balancing, serta penanganan header X-Forwarded yang aman.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

HTTP polos sudah tidak punya tempat di production. Episode ini membawa Echo ke jaringan produksi: mengamankan koneksi dengan TLS, mengotomatisasi sertifikat, dan menempatkan aplikasi di belakang proxy — arsitektur yang akan kalian temui di hampir semua deployment nyata.

Episode 15 ini membahas TLS manual, Auto TLS via Let's Encrypt, HTTP/2, reverse proxy dengan nginx dan caddy, middleware.Proxy, serta penanganan header X-Forwarded-* yang aman.

TLS Manual

Mengamankan dengan Sertifikat Sendiri

Untuk environment internal atau testing, e.StartTLS cukup. Sertifikat bisa dibuat dengan openssl:

Membuat sertifikat self-signed
openssl req -x509 -newkey rsa:2048 \
  -keyout key.pem -out cert.pem \
  -days 365 -nodes \
  -subj "/CN=localhost"

Jalankan server dengan sertifikat:

Menjalankan server TLS
e.Logger.Fatal(e.StartTLS(":443", "cert.pem", "key.pem"))

Perintah e.StartTLS(":443", "cert.pem", "key.pem") menangani seluruh handshake TLS. Sertifikat self-signed menimbulkan peringatan di browser — gunakan hanya untuk pengujian.

Auto TLS dengan Let's Encrypt

Sertifikat Otomatis untuk Domain Publik

Echo mendukung Auto TLS yang meminta dan memperbarui sertifikat dari Let's Encrypt secara otomatis. Ini menghilangkan pekerjaan manual memperbarui sertifikat:

Auto TLS dengan Let's Encrypt
e.AutoTLSManager.HostPolicy = autocert.HostWhitelist("api.example.com")
e.AutoTLSManager.Cache = autocert.DirCache("/var/www/.cache")
 
go func() {
	e.Logger.Fatal(e.StartAutoTLS(":443"))
}()
e.Logger.Fatal(e.Start(":80"))

Kombinasi StartAutoTLS di port 443 dan Start di port 80 diperlukan: Let's Encrypt memakai HTTP untuk validasi domain sebelum menerbitkan sertifikat. Sertifikat tersimpan di cache sehingga tidak diminta ulang setiap boot.

HTTP/2 Tanpa Konfigurasi

Dengan TLS aktif, net/http dan Echo mendukung HTTP/2 secara otomatis. Tidak ada konfigurasi tambahan — klien modern akan menegosiasikan HTTP/2 saat handshake, membawa keuntungan multiplexing dan kompresi header.

Reverse Proxy

nginx di Depan Echo

Arsitektur umum: nginx menerima traffic, menangani TLS dan static caching, lalu meneruskan ke Echo:

Konfigurasi nginx
server {
    listen 443 ssl;
    server_name api.example.com;
    ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
 
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Konfigurasi nginx ini meneruskan request ke Echo di 127.0.0.1:8080 sambil menyisipkan header X-Forwarded-* yang dibutuhkan aplikasi.

Middleware Proxy untuk Load Balancing

Echo juga bisa berperan sebagai proxy ke beberapa instance backend. middleware.Proxy dengan round-robin balancer:

Load balancing dengan middleware.Proxy
e.Use(middleware.ProxyWithConfig(middleware.ProxyConfig{
	Balancer: middleware.NewRoundRobinBalancer([]*middleware.ProxyTarget{
		{URL: mustParseURL("http://backend-1:8080")},
		{URL: mustParseURL("http://backend-2:8080")},
	}),
}))

Request masuk akan disebar bergantian ke backend-1 dan backend-2. Ini pola yang sama dipakai service mesh seperti Envoy.

Penanganan X-Forwarded-* yang Aman

Mempercayai Proxy dengan Hati-hati

Header X-Forwarded-For, X-Forwarded-Proto, dan X-Forwarded-Host dikirim proxy untuk memberi tahu aplikasi asal request. Masalahnya: klien juga bisa mengirim header ini dan memalsukan alamat IP.

Aturan utamanya: percayai header hanya dari proxy yang memang kalian kendalikan. Dengan middleware.Proxy internal, gunakan middleware.ExtractIPWithConfig untuk membaca IP asli dari header dengan aman:

Membaca IP asli dengan aman
e.Use(middleware.ExtractIPWithConfig(middleware.ExtractIPConfig{
	Skipper: func(c echo.Context) bool { return false },
}))

Di belakang nginx atau caddy, pastikan proxy meng-overwrite header sebelum diteruskan, bukan menambahkan nilai kedua. Kalau tidak, attacker bisa memalsukan IP yang dipakai logging dan rate limiter.

Penutup

Episode 15 membawa Echo ke jaringan produksi: TLS manual dengan e.StartTLS, Auto TLS dari Let's Encrypt tanpa perawatan manual, HTTP/2 otomatis, reverse proxy dengan nginx, middleware.Proxy untuk load balancing, dan penanganan header X-Forwarded-* yang aman dari pemalsuan.

Inti yang harus dibawa pulang:

  • e.StartTLS memakai sertifikat manual; self-signed hanya untuk testing.
  • StartAutoTLS mengotomatisasi sertifikat Let's Encrypt.
  • HTTP/2 aktif otomatis saat TLS berjalan.
  • nginx dan caddy menangani TLS dan meneruskan ke Echo.
  • middleware.Proxy melakukan load balancing antar instance.
  • Header X-Forwarded-* hanya dipercaya dari proxy yang dikendalikan.
  • Palsukan header bisa merusak logging IP dan rate limiter.

Di episode 16 selanjutnya kita akan membahas WebSocket, streaming & SSE — koneksi WebSocket dengan gorilla/websocket di dalam handler Echo, Server-Sent Events untuk notifikasi, streaming response, dan use case chat serta long-lived connections.

Belajar Echo - HTTPS, Proxy & Advanced Networking | Belajar Echo