Keamanan payment_service
Port: 8085 | DB: db_kesles_merchant_payment | Status: LIVE
Dokumen ini mencatat keunggulan keamanan yang telah diimplementasikan dan diverifikasi pada payment_service.
Keamanan & Hardening
Semua item di bawah telah diimplementasikan dan diverifikasi per audit keamanan 2026-05-29–2026-06-05.
Authentication & Otorisasi
-
JWT dengan validasi ekspirasi dan issuer wajib: Parser JWT menggunakan
jwt.NewParserdengan opsiWithExpirationRequired()danWithIssuer(issuer)secara bersamaan. Token yang tidak memiliki klaimexpditolak sepenuhnya — tidak ada token yang valid selamanya. Klaimissuerdicocokkan dengan nilai konfigurasiJWTIssuer(default"kesles-merchant-auth"), sehingga token dari service atau environment lain tidak dapat digunakan ulang untuk melewati autentikasi (cross-service token replaydicegah). -
Konfigurasi
INTERNAL_API_KEYtahan whitespace-only:LoadConfigmelakukanstrings.TrimSpacepada nilaiInternalAPIKeysebelum pengecekan kosong. Key yang hanya berisi spasi atau karakter whitespace diperlakukan sebagai tidak valid dan menyebabkan service gagal saat startup (fail-fast). Ini mencegah skenariofail-opendi mana key terlihat terisi padahal kosong secara fungsional.
Keamanan PSP & IP Allowlist
-
X-Forwarded-For hanya dipercaya dari trusted proxy: Fungsi
extractRemoteIPhanya membaca headerX-Forwarded-ForapabilaremoteIPhasil parse darir.RemoteAddradalah loopback address (yaitu, request datang dari nginx di host yang sama). Request yang datang langsung dari luar tidak dapat memanipulasi headerX-Forwarded-Foruntuk memalsukan IP dan melewati IP allowlist PSP — bypass injection dari luar jaringan dicegah sepenuhnya. -
Validasi refund berlapis untuk mencegah over-refund dan IDOR: Handler refund (internal maupun merchant-facing) melakukan pre-validasi jumlah sebelum
InsertRefunddieksekusi. Validasi mencakup: (1) pengecekanamount <= gross_amount - sum(approved_refunds)untuk memastikan akumulasi refund tidak melebihi transaksi asal, dan (2) verifikasi kepemilikan melaluiGetTransactionBasicInfoyang mengonfirmasi bahwaoriginal_transaction_idbenar-benar milikmerchantIDpemohon. Ini mencegah over-refund dan serangan IDOR di mana merchant A mereferensikan transaksi merchant B.
Integritas Data & Keandalan
-
Reconcile settlement dalam transaksi atomik: Fungsi
reconcileMarkCompletedmenggunakanSELECT ... FOR UPDATEdi dalam satu database transaction untuk mengunci baris sebelum memperbarui status. PSP webhook yang dikirim terlambat (retry) tidak dapat mereset status transaksi daricompletedkembali kependingkarena status sudah terkunci dan divalidasi sebelum update diizinkan. -
Respons HTTP 500 untuk infrastructure failure pada PSP webhook: Handler
handlePSPEventsmengembalikan HTTP 500 saatprocessingStatusbernilaifailedakibat kegagalan infrastruktur (database error, timeout, dsb.). Ini memaksa PSP melakukan retry secara otomatis sesuai kontrak protokol. HTTP 200 hanya dikembalikan untuk skenario sukses ataubusiness-logic erroryang memang tidak perlu di-retry (misalnya transaksi duplikat yang sudah diproses). -
Pembatasan ukuran body request di seluruh handler: Middleware
withBodyLimitmembatasi ukuran request body maksimum 4 MB dan dibungkus di level tertinggi vialoggingMiddleware(withBodyLimit(mux)). Seluruh handler POST dan PATCH terlindungi secara otomatis — tidak ada handler yang dapat menerima payload berukuran tak terbatas, sehingga risiko memory exhaustion akibat request body besar dieliminasi.
Referensi Audit
Seluruh temuan di atas berasal dari siklus audit keamanan internal Kesles Merchant yang berlangsung pada periode 2026-05-29 hingga 2026-06-05 dan telah diverifikasi fixed sebelum soak phase dimulai. Detail teknis per temuan dapat dilihat di dokumen audit internal KESLES_AUDIT_CLOSE.md.