Order Service — Keamanan & Hardening
Semua item di bawah telah diimplementasikan dan diverifikasi per audit keamanan 2026-05-29–2026-06-05.
Autentikasi & Otorisasi
-
Validasi kepemilikan order di
handleConfirmReceipt: Handler memverifikasi bahwaMerchantIDpada order yang diminta sama dengansubjectdari JWT sebelum melanjutkan proses. Mencegah merchant A mengkonfirmasi penerimaan order milik merchant B. -
Validasi kepemilikan order di
handleShipping: Handler memverifikasiMerchantIDpada parent order terhadapsubjectdari JWT sebelum mengembalikan data atau memproses perubahan. Mencegah akses lintas-merchant pada data pengiriman. -
Validasi kepemilikan order di
handleStartPayment:subjectdari JWT diteruskan ke layer store (store.StartPayment) dan ownership di-enforce di sana. Memastikan validasi tidak bisa di-bypass meski handler dimodifikasi di masa depan. -
JWT wajib memiliki
expclaim:parseJWTSubjectmenggunakanjwt.NewParserdengan opsiWithExpirationRequired(). Token tanpa fieldexpditolak secara eksplisit — token debug, credential yang bocor, atau token buatan tanpa expiry tidak akan pernah diterima. -
JWT wajib memiliki issuer yang sesuai: Parser dikonfigurasi dengan
jwt.WithIssuer(issuer)menggunakan nilai dari env varJWT_ISSUER(default:kesles-merchant-auth). Token HS256 dari sistem lain yang kebetulan berbagi secret yang sama — misalnya environment staging — akan ditolak karena issuer-nya tidak cocok.
Validasi Input & Batas Data
-
Startup gagal jika
INTERNAL_API_KEYkosong di production: Config melakukanlog.Fatalsaat variabel ini tidak diisi di environment production. Mencegah endpoint/internal/*order management menjadi terbuka secara diam-diam tanpa autentikasi. -
Field amount divalidasi non-negatif di
handleCreateOrder:unit_price_amount,shipping_fee_amount, danpromo_amountdivalidasi>= 0(nilai negatif ditolak denganbad request). Mencegah nilai negatif memanipulasi kalkulasi total order. -
Harga diambil dari server saat offer code valid: Ketika
offer_codedikirim oleh klien,handleCreateOrdermengambil quotation aktif dari server dan menggunakan harga dari sana — mengabaikan sepenuhnya nilaiunit_price,shipping_fee, danpromo_amountyang dikirim klien. Price manipulation via request body tidak dimungkinkan. -
photo_urldivalidasi scheme HTTPS dihandleConfirmReceipt: Sebelum diproses, URL foto bukti penerimaan (jika dikirim) di-parse dan ditolak bila scheme bukanhttps. Mencegah penyimpanan URL non-HTTPS pada konfirmasi penerimaan barang. -
Status pengiriman divalidasi terhadap allowlist:
UpdateShippingStatushanya menerima nilai dari set yang telah ditentukan:not_processed,packed,in_transit,delivered,returned. String status arbitrer dari caller ditolak sebelum disimpan ke database.
Reliabilitas & Konsistensi Data
-
Panic recovery middleware aktif: Server membungkus mux dengan
withRecoverymiddleware. Panic di dalam handler tidak lagi menyebabkan goroutine crash tanpa respons — klien tetap menerima HTTP 500 dan service tetap berjalan. -
AcceptTermsdanStartPaymentberjalan dalam satu transaksi database: MethodAcceptTermsAndStartPaymentmembungkus kedua operasi dalamBeginTx/Commitdengandefer tx.Rollback(). JikaStartPaymentgagal setelahAcceptTermsberhasil, fieldterms_accepted_attidak akan tersisa tersimpan di database — tidak ada state korup parsial.