Content Service — Keamanan & Hardening
Port: 8090 | DB: db_kesles_merchant_content | Status: LIVE
Keamanan & Hardening
Semua item di bawah telah diimplementasikan dan diverifikasi per audit keamanan 2026-05-29–2026-06-05.
Auth & Authorization
- Validasi expiry token wajib:
parseJWTSubjectmenggunakanjwt.WithExpirationRequired()sehingga token yang tidak memiliki klaimexpselalu ditolak — tidak ada jalur di mana token tak-berumur bisa diterima sebagai sesi valid. - Validasi issuer token:
parseJWTSubjectmenggunakanjwt.WithIssuer("kesles-merchant-auth")sehingga token HS256 dari sistem lain yang kebetulan berbagi secret yang sama (misal environment staging atau sistem terpisah) otomatis ditolak di production content_service.
Keandalan Lapisan Data
- Existence check fail-safe:
ArticleExistsdistore.gomengembalikanerror(bukantrue) ketika koneksi databasenil— misconfiguration DB tidak bisa mem-bypass logika keberadaan artikel, dan operasi downstream tidak berjalan dalam keadaan data yang tidak terverifikasi.
Response Headers & Middleware
- Security headers lengkap: Service menyertakan
Content-Security-Policy: default-src 'none',Strict-Transport-Security: max-age=63072000; includeSubDomains, danPermissions-Policy: camera=(), microphone=(), geolocation=()pada setiap response HTTP. - Panic recovery middleware: Mux dibungkus
withSecurityHeaders(withObservability(withRecovery(mux)))— handler panic tidak menjatuhkan goroutine tanpa response; server mengembalikan HTTP 500 dan melanjutkan melayani request lain. Content_service menjadi referensi pattern ini untuk service lain di codebase.
Rate Limiting & Resource Management
-
Rate limiting pada public endpoints: Endpoint
/public/umkm-academy/*dilindungipublicLimiter(120 req/menit per IP). MiddlewarewithPublicRateLimitdi-wrap bersamawithPublicCache(300s)di semua 4 public routes — akses tidak terbatas tidak dimungkinkan, scraping berat atau flood attack pada konten publik tidak dapat menguras DB connection pool. -
Goroutine cleanup rate limiter dapat di-stop saat shutdown: Rate limiter cleanup goroutine menggunakan
stop chan struct{}dantime.NewTicker— goroutine mematuhi sinyal shutdown.Server.Shutdown()memanggilmodule.Shutdown()yang menutupstopchannel di semua 3 limiter. Tidak ada goroutine orphan pada graceful shutdown atau saat test suite dijalankan berulang.