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.

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 di episode 6 sudah mulai; kini versi ketatnya. Jangan pernah memakai AllowOrigins: ["*"] saat API membawa kredensial:
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.
Header keamanan menegakkan aturan di sisi browser. Pasang secara manual di middleware sendiri:
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.
Serangan CSRF memaksa browser korban mengirim request berbahaya. Middleware CSRF Echo membutuhkan token khusus untuk request mutasi:
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.
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:
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.
Input tidak dipercaya sampai terbukti. Kombinasikan validator (episode 5) dengan pembatasan nilai:
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.
Dua kelas serangan yang sering menembus API:
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
}Jangan bocorkan detail implementasi. Echo menampilkan banner versi secara default — matikan, dan pastikan header server tidak mengungkap versi:
e.HideBanner = true
e.HidePort = trueProteksi 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.
curl -I http://localhost:8080/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:
BodyLimit dan rate limiter melindungi dari penyalahgunaan.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.