OWASP Top 10 Bukan Daftar Ceklist: Cara Membacanya sebagai Engineer — Afry Articles
SECURITY

OWASP Top 10 Bukan Daftar Ceklist: Cara Membacanya sebagai Engineer

Apa yang sebenarnya diukur, mengapa posisi berubah dari tahun ke tahun, dan bagaimana menerjemahkannya ke keputusan arsitektur yang konkret.

Afry Rachmat · Aug 5, 2026 · 8 min read

OWASP Top 10 Bukan Daftar Ceklist: Cara Membacanya sebagai Engineer

Setiap tahun ada ribuan aplikasi gagal audit keamanan karena tim mengejar skor compliance alih-alih memahami akar masalahnya. Pola yang sama berulang: tim mengisi formulir self-assessment, mencentang "sudah pakai parameterized query", lalu aplikasi tetap bobol lewat celah yang tidak ada di checklist.

OWASP Top 10 bukanlah standar compliance. Ia adalah dokumen konsensus tentang risiko aplikasi yang paling sering dieksploitasi, disusun dari data nyata — bukan dari teori. Membacanya sebagai daftar periksa justru berbahaya, karena yang kamu dapat hanyalah ilusi keamanan.

Artikel ini membahas cara membaca OWASP Top 10 dengan benar: apa yang sebenarnya diukur, mengapa beberapa posisi berubah dari tahun ke tahun, dan bagaimana menerjemahkannya ke keputusan arsitektur yang konkret.

Yang Sebenarnya Diukur OWASP

OWASP Top 10 disusun berdasarkan data dari vendor keamanan, bug bounty, dan hasil pentest. Setiap kategori dihitung dari kombinasi tiga faktor: frekuensi kelemahan (berapa banyak aplikasi yang punya celah ini), likelihood eksploitasi (seberapa mudah dieksploitasi), dan dampak teknis (seberapa besar kerusakan yang bisa ditimbulkan).

Ini penting dipahami karena konsekuensinya langsung terasa di dunia nyata. Misalnya, kategori yang naik peringkat bukan berarti "celah baru ditemukan" — bisa jadi karena alat deteksi makin baik, atau karena pergeseran arsitektur (misalnya makin banyak aplikasi monolith yang dipisah menjadi API yang saling terpanggil).

Mengapa Daftar 2021 Berbeda dari 2017

Perbandingan dua versi terakhir menunjukkan arah industri:

A01 — Broken Access Control naik dari posisi 5 ke posisi 1. Ini bukan karena tiba-tiba muncul kerentanan baru, tapi karena data menunjukkan masalah ini paling sering ditemukan dan paling sulit diperbaiki secara otomatis. Sementara injection (SQLi) turun dari posisi 1 ke 3, sebagian karena framework modern sudah menyediakan parameterized query secara default.

Dua kategori baru muncul di 2021: Insecure Design dan Software and Data Integrity Failures. Kehadiran keduanya menandakan pergeseran dari sekadar "bug di kode" menuju "keputusan desain yang salah" — misalnya tidak ada rate limiting sejak awal, atau tidak ada verifikasi integritas pada update mekanisme yang diunduh.

Kategori Security Misconfiguration tetap konsisten di posisi 5-6. Ini kategori yang paling membosankan tapi paling sering jadi pintu masuk: default credentials, CORS yang terlalu longgar, header keamanan yang tidak dipasang.

Lima Kategori yang Paling Sering Disalahpahami

1. Broken Access Control Bukan Sekadar Role Checking

Banyak developer menganggap access control cukup dengan memisahkan role admin dan user biasa. Padahal celah yang paling sering dieksploitasi justru di level objek: user A bisa membaca atau mengubah data milik user B (IDOR).

// Rentan — siapa pun yang tahu ID bisa baca invoice orang lain
app.get('/api/invoice/:id', (req, res) => {
  const invoice = db.getInvoice(req.params.id);
  res.json(invoice);
});

// Lebih baik — selalu validasi kepemilikan di server
app.get('/api/invoice/:id', (req, res) => {
  const invoice = db.getInvoice(req.params.id);
  if (invoice.userId !== req.user.id) {
    return res.status(403).json({ error: 'Forbidden' });
  }
  res.json(invoice);
});

Pola IDOR ini adalah alasan utama access control menempati posisi 1. Solusinya bukan cuma validasi di satu tempat, tapi kebijakan deny-by-default: setiap akses objek harus melewati satu fungsi otorisasi terpusat, bukan dicek manual di setiap route.

2. Cryptographic Failures Bukan Soal Algoritma Keren

Kategori ini dulunya bernama "Sensitive Data Exposure". Perubahannya menekankan bahwa masalahnya bukan sekadar data ter-expose, tapi kegagalan kriptografi yang menyebabkannya. Contoh paling umum: menyimpan password tanpa hash yang tepat, memakai algoritma enkripsi usang seperti DES, atau memindahkan data sensitif lewat koneksi tanpa TLS.

Kesalahan yang paling sering terlihat di produksi: menggunakan MD5 atau SHA1 untuk password (padahal harus bcrypt/argon2), mengenkripsi data di aplikasi tapi menyimpan kunci di file yang sama dengan kode, atau TLS yang hanya dipasang di load balancer tapi koneksi internal masih plaintext.

3. Insecure Design Bukan Bug, Ini Keputusan

Kategori 2021 ini paling sering disalahpahami sebagai "bug di kode". Padahal Insecure Design berarti celah yang ada sejak tahap desain: tidak ada threat modeling, tidak ada batasan berapa kali user bisa mencoba login, tidak ada mekanisme lockout, atau fitur "lupa password" yang bisa dipakai untuk enumerasi akun.

Contoh klasik: API yang tidak punya rate limiting sama sekali. Bukan karena lupa, tapi karena tidak pernah dianggap sebagai persyaratan. Ini kategori yang tidak bisa diperbaiki dengan patch — harus diubah di tahap desain.

4. Software and Data Integrity Failures

Kategori ini mencakup masalah trust boundary: aplikasi menerima kode atau data dari sumber yang tidak terverifikasi. Contoh paling aktual adalah supply chain attack — dependensi npm atau pip yang sudah disusupi, atau update otomatis yang tidak memverifikasi tanda tangan.

Praktik yang harus dibangun sejak awal: verifikasi checksum untuk dependensi, tanda tangan digital untuk update, dan CI/CD yang menolak artifact tanpa provenance.

5. Security Misconfiguration, Musuh yang Membosankan

Ini kategori yang tidak glamor tapi paling sering jadi titik masuk attacker. Default credentials di database internal, header X-Frame-Options yang tidak terpasang, CORS * untuk API yang menangani data sensitif, atau directory listing yang aktif di server web.

Yang mengejutkan: perbaikannya sering cuma beberapa menit, tapi dampaknya besar. Sebuah server dengan default password dan debugging mode aktif bisa langsung dieksploitasi tanpa perlu celah lain.

Logging, Monitoring, dan Dua Kategori yang Sering Dilupakan

Security Logging and Monitoring Failures (A09) dan SSRF (A10) sering dianggap "opsional" karena tidak langsung terlihat di UI. Padahal tanpa logging yang baik, kamu tidak akan pernah tahu aplikasi sudah dibobol. SSRF (Server-Side Request Forgery) juga makin relevan seiring arsitektur cloud: aplikasi yang menerima URL dari user lalu mem-fetch-nya dari server internal bisa dipakai untuk mengakses metadata service cloud.

Contoh nyata SSRF di dunia cloud:

# Rentan — attacker bisa arahkan ke metadata AWS
url = request.form['url']
response = requests.get(url)  # bisa jadi http://169.254.169.254/latest/meta-data/

# Lebih baik — validasi allowlist host, blokir IP internal
if not is_allowed_host(url):
    return error("URL tidak diizinkan")

Cara Membangun Keamanan dari Desain, Bukan dari Audit

Pelajaran terbesar dari membaca OWASP sebagai dokumen risiko: keamanan harus dibangun dari keputusan desain, bukan ditempel di akhir. Beberapa prinsip yang bisa langsung diterapkan:

  1. Deny-by-default untuk semua akses data — tidak ada route yang bisa diakses tanpa otorisasi eksplisit.
  2. Threat modeling sebelum menulis kode — untuk fitur yang menangani data sensitif, luangkan 30 menit memetakan siapa yang bisa akses apa.
  3. Library dan framework yang sudah aman by default — parameterized query, escaping otomatis, header keamanan bawaan.
  4. Logging yang bisa di-trace — setiap akses ke data sensitif tercatat dengan user, waktu, dan sumber.
  5. Security misconfiguration check otomatis di CI — bukan manual checklist tahunan.

FAQ

Apakah OWASP Top 10 wajib untuk semua aplikasi? Tidak semua kategori relevan untuk semua aplikasi. Aplikasi internal tanpa data sensitif mungkin tidak butuh penanganan yang sama dengan aplikasi publik yang menangani payment. Yang penting adalah memahami posisi mana yang relevan untuk konteksmu.

Apakah lulus dari checklist OWASP berarti aplikasi aman? Tidak. Checklist hanya menangkap pola yang sudah diketahui. Aplikasi bisa lulus semua item tapi tetap punya celah desain yang tidak ada di checklist.

Seberapa sering OWASP Top 10 diperbarui? Kurang lebih setiap 3-4 tahun. Antara versi, pantau perubahan di repositori resmi dan data dari vendor keamanan untuk melihat tren.

Apakah framework modern otomatis aman? Sebagian besar. Framework seperti Rails, Laravel, dan Next.js sudah menangani injection dan XSS secara default. Tapi access control, otorisasi, dan desain tetap tanggung jawab developer.

Kesimpulan Praktis

OWASP Top 10 adalah peta risiko, bukan daftar centang. Nilainya terletak pada bagaimana kamu menggunakannya untuk memprioritaskan perbaikan: kategori yang paling sering dieksploitasi di dunia nyata harus mendapat perhatian paling besar di aplikasimu.

Mulai dari yang paling berdampak: access control yang deny-by-default, hashing password dengan algoritma modern, rate limiting di API, dan logging yang memadai. Empat hal ini mencakup mayoritas serangan yang terjadi di produksi — dan semuanya bisa dilakukan tanpa mengubah arsitektur besar-besaran.

Keamanan yang baik adalah hasil dari keputusan desain yang konsisten, bukan dari mengejar sertifikasi.

Afry Articles · Practical engineering writing. Found an error? This article is a living document — revisit as OWASP releases new editions.