Beranda / Kursus / Security for Beginners / III — Best Practices
III — Best Practices
Artikel 8 dari 8

Best Practices & Next Steps

Checklist keamanan API yang praktis, kesalahan umum yang sering dilakukan, dan roadmap lanjutan setelah menguasai autentikasi, otorisasi, anti-injection, dan secrets management.

10 Juli 2026

Selamat, kamu sudah membangun task-tracker-api dengan lapisan keamanan yang lengkap: autentikasi dengan password hashing dan JWT, otorisasi per-resource, rate limiting, perlindungan dari injection, secrets management yang benar, security headers, dan dependency yang ter-scan. Di artikel penutup ini, kita rangkum semuanya jadi checklist praktis, kesalahan umum, dan roadmap lanjutan.

Checklist Keamanan API

Pakai daftar ini sebagai tinjauan cepat sebelum fitur baru dianggap "selesai":

  • [ ] Password di-hash dengan bcrypt (atau argon2), tidak pernah disimpan plaintext (Bagian 3)
  • [ ] Token/session punya masa kedaluwarsa yang wajar (Bagian 3)
  • [ ] Pesan error login generik, tidak membocorkan username mana yang valid (Bagian 3)
  • [ ] SETIAP endpoint yang mengakses resource spesifik memverifikasi kepemilikan/izin, bukan cuma autentikasi (Bagian 4)
  • [ ] Endpoint sensitif (login, register) punya rate limiting (Bagian 4)
  • [ ] Semua akses database lewat ORM/parameterized query, tidak ada string SQL manual dari input user (Bagian 5)
  • [ ] Response model eksplisit di setiap endpoint, tidak pernah expose objek database mentah (Bagian 3, 5)
  • [ ] Semua input punya batasan validasi (panjang, tipe, format) (Bagian 5)
  • [ ] Tidak ada secret hardcode di kode atau ter-commit ke git (Bagian 6)
  • [ ] CORS mengizinkan origin spesifik, bukan wildcard * (Bagian 6)
  • [ ] Security headers dasar terpasang (X-Content-Type-Options, X-Frame-Options, dst.) (Bagian 6)
  • [ ] Dependency di-scan rutin (pip-audit atau setara) (Bagian 7)
  • [ ] Container tidak berjalan sebagai root (Bagian 7)
  • Kesalahan Umum

  • Menganggap autentikasi = otorisasi. Ini kesalahan paling sering dan paling berbahaya (BOLA, Bagian 2 & 4) — tahu SIAPA user tidak sama dengan tahu APA yang boleh dia akses. Setiap endpoint yang menyentuh resource spesifik butuh pengecekan kepemilikan sendiri.
  • Validasi cuma di frontend. Frontend bisa dilewati sepenuhnya — siapa pun bisa memanggil API langsung lewat curl atau Postman, tanpa pernah menyentuh frontend sama sekali. Validasi di sisi server (Bagian 5) WAJIB, validasi frontend cuma untuk pengalaman pengguna yang lebih baik.
  • Percaya "toh cuma internal tool/prototipe". Banyak prototipe "sementara" akhirnya dipakai production tanpa pernah direview ulang keamanannya. Kebiasaan keamanan sejak awal jauh lebih murah daripada retrofit belakangan.
  • Menyimpan JWT di localStorage tanpa pertimbangan. JWT yang disimpan di localStorage browser rentan dicuri lewat XSS (kalau ada celah XSS di aplikasi). Untuk aplikasi yang butuh keamanan lebih tinggi, pertimbangkan httpOnly cookie yang tidak bisa diakses JavaScript sama sekali.
  • Rate limit yang gampang dilewati. Rate limit berbasis IP saja (seperti yang kita bangun di Bagian 4) bisa dilewati dengan berganti-ganti IP (lewat proxy/VPN). Untuk proteksi lebih kuat, kombinasikan dengan rate limit berbasis akun/username, dan pertimbangkan CAPTCHA untuk kasus yang mencurigakan.
  • Tidak pernah menguji skenario "apa yang terjadi kalau diserang". Sama seperti kita membuktikan SQL injection gagal di Bagian 5 dan BOLA tercegah di Bagian 4 — kebiasaan mencoba "menyerang" fitur sendiri sebelum menganggapnya selesai jauh lebih efektif daripada asumsi.
  • Roadmap Lanjutan

    Seri ini fokus ke fondasi yang paling sering jadi celah nyata. Kalau mau melangkah lebih jauh:

  • Refresh token & token revocation — access token JWT kita berlaku sampai kedaluwarsa dan tidak bisa "dibatalkan" sebelum waktunya (misalnya saat user logout atau device dicuri). Pola refresh token (access token pendek + refresh token panjang yang bisa dicabut) menyelesaikan ini.
  • Multi-Factor Authentication (MFA/2FA) — lapisan verifikasi kedua (kode dari aplikasi authenticator, SMS, atau email) di atas password, membuat akun jauh lebih sulit dibobol walau password bocor.
  • OAuth2 / Single Sign-On (SSO) — mengizinkan login lewat Google/GitHub/dst., memindahkan tanggung jawab menyimpan credential ke provider yang sudah teruji, bukan kita simpan sendiri.
  • Automated security scanning di CI/CD — menambahkan pip-audit, image scanning (Trivy, Docker Scout), dan static analysis security testing (Bandit untuk Python) sebagai step otomatis di pipeline, mengikuti pola yang sudah dibahas di CI/CD for Beginners.
  • Web Application Firewall (WAF) — lapisan proteksi di depan aplikasi yang menyaring pola serangan umum (SQL injection, XSS payload, bot traffic) sebelum sampai ke server.
  • Audit logging — mencatat SIAPA melakukan APA dan KAPAN untuk aksi sensitif (login, perubahan data penting), terpisah dari log operasional biasa — krusial untuk investigasi kalau terjadi insiden.
  • Penetration testing & security audit berkala — mengundang pihak (internal atau eksternal) untuk secara aktif mencoba membobol sistem secara terkontrol, menemukan celah sebelum penyerang sungguhan menemukannya.
  • Secrets rotation — mengganti secret key, credential database, dan API key secara berkala (dan segera setelah ada indikasi kebocoran), bukan dipakai selamanya sejak pertama kali dibuat.
  • Kaitan dengan Seri Lain

    Seri ini melanjutkan task-tracker-api dari FastAPI for Beginners dan Scalability for Beginners. Begitu API-mu aman DAN scalable, CI/CD for Beginners menutup lingkarannya — mengotomasi test (termasuk test keamanan yang baru kita tulis) dan deployment, supaya setiap perubahan tervalidasi konsisten sebelum sampai ke production.

    Penutup

    Kita sudah menempuh perjalanan dari "kenapa keamanan penting", memahami ancaman umum lewat kerangka OWASP, sampai membangun pertahanan konkret lapis demi lapis — autentikasi, otorisasi, anti-injection, secrets management, dan dependency scanning. Yang paling penting, setiap klaim keamanan di seri ini dibuktikan dengan percobaan nyata: kita benar-benar mencoba SQL injection dan gagal, benar-benar menguji dua user saling mengintip data dan tercegah, benar-benar memicu rate limit dan terblokir. Keamanan bukan checklist yang ditandai lalu dilupakan — ini kebiasaan bertanya "bagaimana ini bisa disalahgunakan?" di setiap fitur baru yang kamu bangun.

    Terima kasih sudah mengikuti seri Security for Beginners ini. Selamat mengamankan sistem kamu sendiri!

    Topik

    SecurityBest Practices
    III — Best Practices · Article 8 of 8