Belajar Echo - Security Middleware & Input Hardening
Series/Belajar Echo/Episode 14
Episode 14 of 23

Belajar Echo - Security Middleware & Input Hardening

Episode ini memperkuat pertahanan API: CORS ketat, security headers seperti CSP dan HSTS, CSRF, BodyLimit, rate limiting, validasi input ketat, sanitasi, pencegahan injection dan SSRF, serta proteksi sensitive headers dari kebocoran informasi.

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

Pendahuluan

Keamanan bukan fitur yang ditambahkan di akhir — dia adalah keputusan desain. Episode ini menyusun lapisan pertahanan: middleware keamanan bawaan Echo untuk memangkas permukaan serangan, dan hardening input untuk menolak data jahat sebelum menyentuh logika bisnis.

Episode 14 ini membahas CORS ketat, security headers, CSRF, BodyLimit, rate limiting, validasi input, sanitasi, pencegahan injection dan SSRF, serta proteksi sensitive headers.

CORS dan Security Headers

CORS dengan Whitelist Ketat

CORS di episode 6 sudah mulai; kini versi ketatnya. Jangan pernah memakai AllowOrigins: ["*"] saat API membawa kredensial:

CORS dengan whitelist origin
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
	AllowOrigins:     []string{"https://app.example.com"},
	AllowCredentials: true,
	MaxAge:           3600,
	ExposeHeaders:    []string{echo.HeaderXRequestID},
}))

AllowCredentials bersama daftar origin eksplisit memastikan hanya domain yang dikenal bisa mengirim kredensial.

Security Headers CSP dan HSTS

Header keamanan menegakkan aturan di sisi browser. Pasang secara manual di middleware sendiri:

Middleware security headers
func securityHeaders() echo.MiddlewareFunc {
	return func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			h := c.Response().Header()
			h.Set(echo.HeaderContentSecurityPolicy,
				"default-src 'self'; frame-ancestors 'none'")
			h.Set("Strict-Transport-Security", "max-age=31536000; includeSubDomains")
			h.Set("X-Content-Type-Options", "nosniff")
			h.Set("X-Frame-Options", "DENY")
			return next(c)
		}
	}
}

CSP membatasi sumber konten yang bisa dimuat browser, HSTS memaksa HTTPS, nosniff mencegah misinterpretasi tipe file, dan X-Frame-Options: DENY memblokir clickjacking.

CSRF, BodyLimit, dan Rate Limit

CSRF untuk Mutasi State

Serangan CSRF memaksa browser korban mengirim request berbahaya. Middleware CSRF Echo membutuhkan token khusus untuk request mutasi:

Middleware CSRF
e.Use(middleware.CSRFWithConfig(middleware.CSRFConfig{
	TokenLookup: "form:csrf",
	CookieName:  "_csrf",
	CookieHTTPOnly: true,
}))

Klien harus mengirim token CSRF (dari cookie) di body atau header setiap request POST, PUT, dan DELETE.

BodyLimit dan Rate Limiter

Kedua middleware ini sudah dibahas — sekarang pahami mengapa keduanya wajib berdampingan. BodyLimit membatasi ukuran payload yang bisa diserang; rate limiter menghentikan upaya brute force sebelum menghabiskan resource:

BodyLimit dan rate limiter ketat
e.Use(middleware.BodyLimit("512K"))
e.Use(middleware.RateLimiterWithConfig(middleware.RateLimiterConfig{
	Store: middleware.NewRateLimiterMemoryStore(10),
}))

Untuk endpoint login dan reset password, pertimbangkan rate limit yang lebih ketat atau lockout per akun.

Hardening Input

Validasi Ketat dan Sanitasi

Input tidak dipercaya sampai terbukti. Kombinasikan validator (episode 5) dengan pembatasan nilai:

Validasi ketat pada input
type CreateUserRequest struct {
	Email string `json:"email" validate:"required,email,max=254"`
	Age   int    `json:"age" validate:"required,gte=17,lte=100"`
	Role  string `json:"role" validate:"oneof=admin member"`
}

Aturan oneof membatasi nilai enum, max dan lte membatasi panjang dan rentang. Validasi di sisi server selalu wajib meskipun frontend sudah memvalidasi.

Mencegah Injection dan SSRF

Dua kelas serangan yang sering menembus API:

  • Injection: selalu gunakan query berparameter (episode 9) untuk SQL, dan hindari mengeksekusi input sebagai kode atau shell command.
  • SSRF: jika aplikasi mengambil URL dari user, batasi protokol dan target untuk mencegah permintaan ke internal network.
Menolak URL SSRF berbahaya
func validateTargetURL(raw string) (string, error) {
	u, err := url.Parse(raw)
	if err != nil {
		return "", err
	}
	if u.Scheme != "https" {
		return "", echo.NewHTTPError(http.StatusBadRequest, "hanya https diizinkan")
	}
	ip := net.ParseIP(u.Hostname())
	if ip != nil && ip.IsPrivate() {
		return "", echo.NewHTTPError(http.StatusBadRequest, "target internal ditolak")
	}
	return u.String(), nil
}

Proteksi Sensitive Headers

Menyembunyikan Detail Server

Jangan bocorkan detail implementasi. Echo menampilkan banner versi secara default — matikan, dan pastikan header server tidak mengungkap versi:

Menyembunyikan banner dan header
e.HideBanner = true
e.HidePort = true

Proteksi lain: jangan pernah mengembalikan stack trace ke klien (episode 11), dan pastikan error internal tidak memuat kredensial atau koneksi database. Gunakan request_id untuk menghubungkan error klien dengan log internal.

Memeriksa header respons
curl -I http://localhost:8080/

Penutup

Episode 14 menyusun pertahanan berlapis: CORS whitelist ketat, security headers CSP dan HSTS, CSRF untuk mutasi state, BodyLimit dan rate limiting, validasi ketat dengan aturan oneof dan rentang, pencegahan injection dan SSRF, serta proteksi sensitive headers dari kebocoran informasi.

Inti yang harus dibawa pulang:

  • CORS production memakai whitelist origin, bukan wildcard.
  • CSP, HSTS, nosniff, dan X-Frame-Options menegakkan aturan browser.
  • CSRF melindungi request mutasi dari serangan lintas situs.
  • BodyLimit dan rate limiter melindungi dari penyalahgunaan.
  • Validasi server selalu wajib, apa pun yang dilakukan frontend.
  • Query berparameter dan pembatasan URL mencegah injection dan SSRF.
  • Matikan banner Echo dan jangan bocorkan detail internal.

Di episode 15 selanjutnya kita akan membahas HTTPS, proxy & advanced networking — TLS manual dengan e.StartTLS, Auto TLS via Let's Encrypt dengan middleware.AutoTLS, HTTP/2, reverse proxy nginx dan caddy, middleware.Proxy, serta penanganan header X-Forwarded-* yang aman.

Belajar Echo - Security Middleware & Input Hardening | Belajar Echo