Keamanan Aplikasi: OWASP Top 10:2025
Masuk untuk menyimpan progres Anda di semua perangkat. Sampai saat itu, progres disimpan di browser ini.
Mengapa ini penting
Keamanan adalah titik di mana kode buatan AI paling sering gagal, dan kegagalannya paling mahal. Data Veracode tahun 2026 menunjukkan tingkat lolos uji keamanan kode AI hanya sekitar 56%. Modul ini berlangsung dua minggu dan merupakan gerbang tersulit dalam program.
Capaian pembelajaran
- Menerapkan OWASP Top 10:2025 pada aplikasi Anda sendiri.
- Mengimplementasikan autentikasi dan otorisasi dengan benar (OAuth/OIDC, session, rotasi JWT, IAM, RLS).
- Mengelola secret sehingga tidak ada satu pun yang sampai ke kode, bundle frontend, atau log.
- Mencegah injection (SQL, XSS, SSRF) dan serangan browser (CSRF, salah konfigurasi CORS).
- Mempertahankan perimeter dengan rate limiting, WAF, dan perlindungan DDoS.
- Menjalankan SAST, DAST, pemindaian secret, dan pemindaian dependensi di CI.
OWASP Top 10:2025
| ID | Risiko | Kegagalan khas kode AI |
|---|---|---|
| A01 | Broken Access Control | Endpoint mengecek login tapi tidak mengecek kepemilikan; RLS mati; IDOR lewat ID berurutan |
| A02 | Security Misconfiguration | Mode debug menyala, kredensial default, CORS * yang terlalu longgar, pesan error terlalu detail, bucket storage terbuka |
| A03 | Software Supply Chain Failures | Paket halusinasi atau tidak di-pin, dependensi yang disusupi, build tanpa tanda tangan |
| A04 | Cryptographic Failures | Kriptografi buatan sendiri, password dengan MD5/SHA1, secret dalam plain text |
| A05 | Injection | SQL hasil penggabungan string, dangerouslySetInnerHTML, perintah shell berisi input pengguna |
| A06 | Insecure Design | Tidak ada threat model; penyalahgunaan logika bisnis (kuantitas negatif, kupon ditumpuk) |
| A07 | Authentication Failures | Tidak ada rate limit pada login, alur reset lemah, token berumur panjang, tanpa MFA |
| A08 | Software or Data Integrity Failures | Webhook tanpa verifikasi, update tanpa tanda tangan, deserialisasi tidak aman |
| A09 | Security Logging and Alerting Failures | Tidak ada audit log; tidak ada alert saat brute force; secret tercatat di log |
| A10 | Mishandling of Exceptional Conditions | Fail-open saat error, exception ditelan, stack trace tampil ke pengguna |
Baru di 2025: Supply Chain menjadi kategori tersendiri di A03, dan Mishandling of Exceptional Conditions masuk di A10. Keduanya tepat di area di mana tool AI paling lemah.
Materi
5.1 Access control (A01, 68)
- Autentikasi = siapa Anda. Otorisasi = apa yang boleh Anda lakukan. Kode AI biasanya mengerjakan yang pertama dan lupa yang kedua.
- Cek otorisasi di setiap request, di sisi server, untuk setiap objek (
WHERE id = $1 AND org_id = $currentOrg). - Tolak secara default. Role dan permission di satu tempat (modul policy atau RLS), bukan pernyataan
ifyang tersebar di mana-mana. - IAM untuk infrastruktur: setiap service punya identitas sendiri dengan least privilege; tidak ada admin key bersama; akun dev/staging/prod terpisah.
- Jangan pernah mengekspos key service-role / admin ke klien. Di Supabase, anon key memang publik sejak awal, jadi RLS adalah satu-satunya tembok Anda.
5.2 Autentikasi, OAuth, dan token (69, 70)
- Jangan membangun auth dari nol. Gunakan penyedia yang sudah terbukti (Supabase Auth, Clerk, Auth0, WorkOS untuk SSO enterprise).
- OAuth 2.0 / OIDC: Authorization Code flow dengan PKCE untuk browser dan mobile. Validasi
state,nonce, issuer, audience. - Session: cookie
HttpOnly,Secure,SameSite=LaxatauStrict. Jangan simpan token di localStorage. - Rotasi JWT: access token berumur pendek (5 sampai 15 menit), refresh token yang dirotasi dengan deteksi penggunaan ulang, signing key dirotasi lewat JWKS dengan key ID (
kid), jangan pernahalg: none, selalu verifikasi tanda tangan, masa berlaku, dan audience. - Pembeli enterprise mengharapkan: MFA, SSO (SAML/OIDC), provisioning SCIM, pencabutan session.
5.3 Manajemen secret (67)
- Secret disimpan di secrets manager atau env var platform, tidak pernah di git, tidak pernah di variabel
NEXT_PUBLIC_*/VITE_*(variabel itu ikut terkirim ke browser). - Pre-commit hook + pemindaian di CI (gitleaks, GitHub secret scanning dengan push protection).
- Secret yang bocor harus dirotasi, bukan sekadar dihapus: riwayat git dan fork menyimpannya selamanya.
- Key terpisah per environment; API key dengan cakupan minimal (restricted key Stripe, token dengan scope terbatas).
- Batas pengeluaran (spend cap) di setiap API key berbayar (LLM, SMS, peta). Tanpa itu, key yang bocor sama dengan cek kosong.
5.4 Kriptografi dan enkripsi (72, A04)
- Password: argon2id atau bcrypt lewat penyedia auth Anda. Jangan pernah melakukan hash sendiri dengan SHA.
- Enkripsi at rest: enkripsi DB/storage terkelola diaktifkan, backup terenkripsi. Enkripsi tingkat field untuk data sangat sensitif (nomor identitas nasional, detail rekening bank), dengan key di KMS.
- Gunakan library (libsodium, KMS platform); jangan pernah menciptakan kriptografi sendiri.
5.5 Injection (78, 79, 80)
- SQL injection: query berparameter atau query builder/ORM. Jangan pernah menyisipkan string ke dalam SQL, termasuk lewat jalan pintas "raw".
- XSS: framework melakukan escape secara default; zona berbahaya adalah
dangerouslySetInnerHTML,v-html, serta merender markdown atau output LLM sebagai HTML. Sanitasi dengan DOMPurify; pasang Content-Security-Policy. - SSRF: fitur apa pun yang mengambil URL dari pengguna (link preview, webhook, "impor dari URL", agen AI yang menjelajah web) bisa diarahkan ke
169.254.169.254(metadata cloud) atau service internal. Gunakan allowlist domain, resolve dan blokir rentang IP privat, matikan redirect atau cek ulang setelah setiap redirect, jalankan fetcher di jaringan terisolasi.
5.6 Keamanan browser (76, 77)
- CORS bukan batas keamanan untuk server Anda; CORS hanya mengatur origin mana yang boleh dibaca respons-nya oleh browser. Jangan pernah memantulkan
Originsembarangan bersamaAccess-Control-Allow-Credentials: true. Allowlist origin yang persis. - CSRF: cookie
SameSiteditambah token CSRF atau pengecekan origin untuk request yang mengubah state saat memakai auth berbasis cookie. - Security header: CSP, HSTS,
X-Content-Type-Options: nosniff,Referrer-Policy,frame-ancestors.
5.7 Perimeter: rate limiting, WAF, DDoS (1, 74, 75)
- Rate limit berdasarkan IP, pengguna, dan API key, dengan batas lebih ketat pada login, pendaftaran, reset password, OTP, dan setiap endpoint yang memakan biaya (LLM, SMS, email).
- Algoritma: token bucket atau sliding window, disimpan di Redis atau di edge. Kembalikan
429denganRetry-After. - WAF (Cloudflare, AWS WAF) dengan managed rule OWASP; perlindungan bot di halaman pendaftaran.
- Perlindungan DDoS sebagian besar datang dari CDN Anda; pastikan origin tidak bisa diakses langsung sehingga CDN bisa dilewati.
5.8 Kondisi luar biasa (A10)
- Fail closed: jika pengecekan auth melempar error, tolak. Jika pengecekan fraud timeout, tahan transaksinya, jangan disetujui.
- Jangan pernah menampilkan stack trace ke pengguna; catat di log bersama request ID.
- Tangkap error yang spesifik; jangan menelan semua exception.
5.9 Threat modelling (A06)
STRIDE dalam 30 menit per fitur: Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege. Gambar batas kepercayaan (trust boundary); daftar kasus penyalahgunaan ("bagaimana kalau kuantitasnya -1?").
5.10 Keamanan di pipeline
| Jenis tool | Contoh | Yang ditangkap |
|---|---|---|
| Secret scan | gitleaks, GitHub push protection | Key di dalam kode |
| SAST | Semgrep, CodeQL | Injection, pola tidak aman |
| SCA | Dependabot, Snyk, OSV-Scanner | Dependensi yang rentan |
| DAST | OWASP ZAP | Salah konfigurasi runtime, header, XSS |
| Container/IaC | Trivy, Checkov | Image dan konfigurasi infra yang buruk |
Lab 5 (dua minggu): Serang aplikasi Anda sendiri
Minggu A, Bongkar: gunakan akun kedua dan proxy browser (ZAP atau Burp Community).
- Coba baca/ubah record milik pengguna lain dengan mengganti ID (IDOR).
- Panggil database langsung dengan anon key publik.
- Sisipkan
<script>ke setiap field teks dan output markdown/LLM. - Arahkan setiap fitur pengambil URL ke
http://169.254.169.254/danhttp://localhost. - Lakukan brute force pada login dan reset password; gempur endpoint yang paling mahal.
- Cari secret di bundle JS production.
Minggu B, Perbaiki dan buktikan: perbaiki setiap temuan, tambahkan regression test per temuan, pasang scanner ke CI.
Definition of Done
Paket prompt AI
- "Bertindaklah sebagai penetration tester. Untuk setiap route di aplikasi ini, jabarkan bagaimana pengguna yang sudah login bisa mengakses data pengguna lain. Lalu tulis test untuk masing-masing."
- "Temukan setiap tempat secret atau env var dibaca. Tandai yang bisa sampai ke bundle klien."
- "Temukan setiap tempat kita mengambil URL yang berasal dari input pengguna. Tambahkan perlindungan SSRF yang memblokir rentang privat, loopback, dan link-local setelah resolusi DNS."
- "Temukan setiap blok catch. Tandai yang fail open atau menelan error."