Kembali ke Beranda
Web Development

Web Security: Membangun Aplikasi Web yang Aman dengan Standar OWASP

Keamanan aplikasi web bukan pekerjaan tambahan setelah software selesai dibuat, tetapi bagian dari arsitektur dan Software Development Lifecycle. OWASP dapat digunakan sebagai referensi untuk memahami risiko melalui OWASP Top 10, menetapkan security requirement menggunakan ASVS, serta melakukan pengujian menggunakan WSTG. Dengan menerapkan secure coding, least privilege, defense in depth, SAST, DAST, dependency scanning, secret scanning, monitoring, dan vulnerability management, organisasi dapat membangun aplikasi yang lebih aman sejak tahap desain hingga production.

Membangun aplikasi web hari ini tidak cukup hanya memastikan aplikasi berjalan dengan baik. Aplikasi juga harus dirancang agar mampu menghadapi kesalahan konfigurasi, kebocoran data, pencurian akun, eksploitasi API, hingga serangan terhadap dependency yang digunakan.

Semakin banyak layanan yang berpindah ke web dan API, semakin besar pula attack surface yang harus dilindungi.

Karena itu, keamanan sebaiknya tidak ditempatkan sebagai pekerjaan tambahan setelah aplikasi selesai dibuat.

Security is not a feature. Security is part of the architecture.

Salah satu referensi yang paling banyak digunakan untuk membantu developer membangun aplikasi yang lebih aman adalah OWASP (Open Worldwide Application Security Project).

Artikel ini membahas konsep dasar web security, proteksi yang sebaiknya diterapkan, serta bagaimana OWASP dapat digunakan sebagai standar praktis dalam proses pengembangan software.


Apa Itu Web Security?

Web security adalah serangkaian metode, teknologi, proses, dan kebijakan untuk melindungi aplikasi web, API, server, database, dan data pengguna dari akses maupun aktivitas yang tidak sah.

Sebuah aplikasi web biasanya memiliki banyak komponen:

User
  │
  ▼
Browser / Mobile App
  │
  ▼
Internet
  │
  ▼
CDN / WAF / Reverse Proxy
  │
  ▼
Web Server
  │
  ▼
Application / API
  │
  ├────────► Cache
  │
  ├────────► External API
  │
  └────────► Database

Setiap komponen tersebut dapat menjadi titik serangan.

Contohnya, aplikasi memiliki validasi input yang baik, tetapi database dapat diakses langsung dari internet. Atau server sudah diamankan, tetapi API tidak melakukan pemeriksaan otorisasi dengan benar.

Keamanan aplikasi harus dilihat sebagai satu kesatuan sistem, bukan hanya keamanan source code.


Mengenal OWASP

OWASP atau Open Worldwide Application Security Project adalah organisasi nonprofit yang menyediakan berbagai referensi terbuka mengenai keamanan aplikasi.

Salah satu proyek OWASP yang paling dikenal adalah:

OWASP Top 10

OWASP Top 10 berisi kategori risiko keamanan aplikasi web yang perlu menjadi perhatian developer dan organisasi.

Namun OWASP sebenarnya jauh lebih luas daripada Top 10.

Beberapa referensi penting lainnya antara lain:

  • OWASP Application Security Verification Standard (ASVS)
  • OWASP Web Security Testing Guide (WSTG)
  • OWASP Cheat Sheet Series
  • OWASP API Security Top 10
  • OWASP Software Assurance Maturity Model (SAMM)

Jika OWASP Top 10 memberikan gambaran mengenai risiko, ASVS dapat digunakan sebagai referensi requirement dan verification, sedangkan WSTG membantu dalam proses security testing.


OWASP Top 10

OWASP Top 10 membantu developer memahami kategori kelemahan keamanan yang umum dan berdampak besar.

Beberapa konsep yang perlu diperhatikan dalam pengembangan aplikasi modern antara lain:

1. Broken Access Control

Masalah terjadi ketika pengguna dapat mengakses resource atau menjalankan fungsi yang seharusnya tidak menjadi haknya.

Misalnya tersedia endpoint:

GET /api/invoice/1001

User mengganti ID menjadi:

GET /api/invoice/1002

Jika aplikasi hanya mengecek apakah user sudah login tanpa memastikan bahwa invoice 1002 memang miliknya, maka terjadi masalah access control.

Validasi tidak boleh hanya:

Apakah user login?

Tetapi juga:

Apakah user memiliki hak terhadap resource ini?

Prinsip yang dapat digunakan adalah:

Deny by default.

Akses diberikan hanya ketika terdapat aturan yang secara eksplisit mengizinkannya.


2. Security Misconfiguration

Aplikasi yang source code-nya relatif aman tetap dapat diretas karena konfigurasi yang buruk.

Contohnya:

Database Port
5432
    │
    ▼
PUBLIC INTERNET

Padahal seharusnya:

Internet
   │
   ▼
Firewall / WAF
   │
   ▼
Application Server
   │
   ▼
Private Network
   │
   ▼
Database

Beberapa contoh security misconfiguration:

  • database terbuka ke internet,
  • default username/password tidak diganti,
  • debug mode aktif di production,
  • directory listing aktif,
  • error menampilkan stack trace,
  • permission terlalu luas,
  • service yang tidak diperlukan tetap aktif.

Konfigurasi server merupakan bagian dari keamanan aplikasi.


3. Software Supply Chain Failures

Aplikasi modern sangat bergantung pada library dan dependency.

Contohnya aplikasi Java:

Spring Boot Application
        │
        ├── Spring Framework
        ├── Hibernate
        ├── Jackson
        ├── Apache Commons
        └── Library lainnya

Kita mungkin hanya menulis sebagian source code aplikasi, tetapi aplikasi sebenarnya menjalankan banyak kode yang berasal dari dependency.

Karena itu dependency harus diperlakukan sebagai bagian dari attack surface.

Developer perlu:

  • melakukan dependency scanning,
  • memonitor CVE,
  • melakukan upgrade dependency,
  • menghapus library yang tidak digunakan,
  • menggunakan repository terpercaya,
  • menjaga dependency lock/version,
  • menghasilkan SBOM jika diperlukan.

4. Cryptographic Failures

Data sensitif harus dilindungi baik ketika disimpan maupun ketika dikirimkan.

Contoh sederhana:

Browser
   │
   │ HTTPS / TLS
   ▼
Application
   │
   ▼
Database

Password tidak boleh disimpan seperti:

username | password
-------------------
sena     | password123

Password harus diproses menggunakan algoritma password hashing yang sesuai seperti:

Argon2
bcrypt
PBKDF2

Password hashing berbeda dengan encryption.

Password umumnya tidak perlu dapat dikembalikan menjadi plaintext.


5. Injection

Injection terjadi ketika input pengguna diperlakukan sebagai bagian dari perintah.

Salah satu contoh klasik adalah SQL Injection.

Kode yang berbahaya:

String sql =
    "SELECT * FROM users WHERE username = '" +
    username + "'";

Input attacker dapat mengubah struktur query.

Pendekatan yang lebih aman adalah menggunakan parameterized query:

PreparedStatement ps =
    connection.prepareStatement(
        "SELECT * FROM users WHERE username = ?"
    );

ps.setString(1, username);

Framework ORM seperti Hibernate/JPA dapat membantu, tetapi developer tetap harus berhati-hati terhadap query dinamis atau native query yang dibangun melalui string concatenation.

Injection juga tidak terbatas pada SQL.

Ada pula:

Command Injection
LDAP Injection
NoSQL Injection
Template Injection
XPath Injection

6. Insecure Design

Tidak semua masalah keamanan berasal dari kesalahan coding.

Kadang desain sistemnya sendiri sudah memiliki kelemahan.

Contohnya sistem reset password:

User
 │
 ▼
Forgot Password
 │
 ▼
Masukkan Email
 │
 ▼
Reset Password

Tetapi sistem tidak memiliki:

Rate Limiting
Token Expiration
One-Time Token
Audit Log
Notification
Anti Enumeration

Walaupun source code tidak memiliki SQL Injection atau XSS, proses tersebut tetap dapat memiliki risiko keamanan.

Karena itu security harus dimulai sejak fase desain.


7. Identification and Authentication Failures

Authentication menjawab:

Siapa Anda?

Authorization menjawab:

Apa yang boleh Anda lakukan?

Keduanya berbeda.

Contoh alur:

Username + Password
        │
        ▼
Authentication
        │
        ▼
MFA
        │
        ▼
Session / Token
        │
        ▼
Authorization

Beberapa proteksi authentication:

  • password policy,
  • MFA,
  • rate limiting,
  • session timeout,
  • secure cookie,
  • token expiration,
  • account lockout yang dirancang dengan baik,
  • monitoring login abnormal.

8. Software or Data Integrity Failures

Aplikasi harus memastikan software, update, konfigurasi, maupun data yang digunakan berasal dari sumber yang dapat dipercaya dan tidak dimodifikasi secara tidak sah.

Contohnya pipeline:

Developer
    │
    ▼
Git Repository
    │
    ▼
CI/CD
    │
    ▼
Build Artifact
    │
    ▼
Production

Jika pipeline tersebut dapat dimanipulasi, attacker tidak harus menyerang aplikasi secara langsung.

Attacker cukup memasukkan kode berbahaya ke proses deployment.

Proteksi dapat mencakup:

  • branch protection,
  • code review,
  • signed artifact,
  • protected CI/CD secrets,
  • restricted deployment permission,
  • integrity verification.

9. Security Logging and Monitoring Failures

Bayangkan attacker mencoba login:

10 kali
100 kali
10.000 kali

Tetapi aplikasi tidak mencatat aktivitas tersebut.

Secara teknis aplikasi mungkin tetap berjalan normal, tetapi organisasi kehilangan kemampuan mendeteksi serangan.

Minimal log keamanan sebaiknya mencatat:

Login Success
Login Failed
Password Change
Password Reset
Permission Change
Admin Activity
Sensitive Data Access
API Authentication Failure
Suspicious Request

Log kemudian dapat dikirim ke sistem monitoring:

Application
     │
     ▼
Centralized Logging
     │
     ▼
SIEM / Monitoring
     │
     ▼
Alert
     │
     ▼
Security / Operations Team

Tujuannya bukan sekadar menyimpan log, tetapi mendeteksi kejadian abnormal.


10. Mishandling of Exceptional Conditions

Error merupakan bagian normal dari sebuah aplikasi.

Yang menjadi masalah adalah bagaimana aplikasi menangani kondisi tersebut.

Contohnya response seperti:

NullPointerException
at com.company.payment.PaymentService.java:143

Database:
10.10.20.15:5432

Table:
payment_transaction

Informasi seperti ini dapat membantu attacker memahami struktur internal aplikasi.

Response kepada pengguna sebaiknya sederhana:

{
  "error": "Unable to process request"
}

Sedangkan detail teknis tetap dicatat secara internal:

Application Log
Security Log
APM
SIEM

Dengan demikian developer tetap mendapatkan informasi untuk debugging tanpa membuka detail sistem kepada pengguna.


Proteksi Dasar Aplikasi Web

Selain memahami risiko, developer perlu menerapkan security controls pada beberapa lapisan.

HTTPS

Seluruh komunikasi sebaiknya menggunakan:

HTTPS
TLS

Bukan:

HTTP

HTTPS membantu mencegah data dibaca atau dimodifikasi ketika dikirim melalui jaringan.


Security Headers

Beberapa HTTP security header dapat membantu browser melindungi pengguna.

Contohnya:

Content-Security-Policy
Strict-Transport-Security
X-Content-Type-Options
Referrer-Policy
Permissions-Policy

Contoh:

X-Content-Type-Options: nosniff

Untuk aplikasi modern, Content-Security-Policy menjadi salah satu kontrol penting untuk membatasi resource yang dapat dijalankan oleh browser.


Session cookie sebaiknya menggunakan atribut seperti:

Secure
HttpOnly
SameSite

Contoh:

Set-Cookie: SESSION=xxx;
Secure;
HttpOnly;
SameSite=Lax

HttpOnly membantu mencegah JavaScript membaca cookie tertentu, sementara Secure memastikan cookie hanya dikirim melalui koneksi HTTPS.


Input Validation

Jangan pernah berasumsi bahwa input dari client dapat dipercaya.

Browser
Mobile App
API Client
JavaScript

Semua dapat dimodifikasi oleh pengguna.

Karena itu validasi utama harus dilakukan kembali di server.

Prinsip sederhananya:

Never trust client-side input.


Proteksi API

Banyak aplikasi modern sebenarnya lebih banyak berkomunikasi melalui API dibandingkan halaman web tradisional.

Contohnya:

Web Application ───┐
                   │
Mobile App ────────┼──► API ───► Services
                   │
Partner System ────┘

Karena itu API membutuhkan proteksi tersendiri.

Beberapa kontrol penting:

Authentication
Authorization
Rate Limiting
Input Validation
Schema Validation
Token Expiration
API Gateway
Logging
Monitoring
Request Size Limit

Jangan menganggap endpoint aman hanya karena tidak ditampilkan di halaman web.

Attacker dapat memanggil API secara langsung.


Rate Limiting

Endpoint sensitif seperti:

/login
/forgot-password
/otp
/api/search
/api/payment

sebaiknya memiliki mekanisme pembatasan request.

Contohnya:

IP/User
   │
   ▼
Rate Limiter
   │
   ├── Allowed ───► Application
   │
   └── Blocked ───► HTTP 429

Rate limiting membantu mengurangi risiko brute force dan abuse terhadap API.


Web Application Firewall

WAF dapat ditempatkan di depan aplikasi.

Internet
   │
   ▼
CDN
   │
   ▼
WAF
   │
   ▼
Reverse Proxy
   │
   ▼
Application

WAF dapat membantu mendeteksi atau memblokir pola serangan tertentu.

Tetapi perlu diingat:

WAF bukan pengganti secure coding.

Jika authorization aplikasi salah, memasang WAF tidak otomatis memperbaiki kesalahan tersebut.


Security Testing dalam Development Lifecycle

Security sebaiknya menjadi bagian dari SDLC.

Pendekatan lama:

Development
     │
     ▼
Testing
     │
     ▼
Production
     │
     ▼
Security Test

Pendekatan yang lebih baik:

Requirement
     │
     ▼
Threat Modeling
     │
     ▼
Development
     │
     ├── SAST
     ├── Secret Scanning
     └── Dependency Scanning
     │
     ▼
Testing
     │
     ├── DAST
     └── API Security Testing
     │
     ▼
Deployment
     │
     ▼
Monitoring
     │
     ▼
Continuous Improvement

Konsep ini sering disebut:

Shift Left Security

Artinya keamanan diperiksa sedini mungkin dalam proses development.


SAST dan DAST

Dua pendekatan yang umum digunakan adalah SAST dan DAST.

SAST

Static Application Security Testing menganalisis source code atau artifact tanpa harus menyerang aplikasi yang sedang berjalan.

Contohnya mendeteksi:

Hardcoded Password
SQL Injection Pattern
Unsafe Function
Weak Cryptography
Potential XSS

Flow:

Source Code
    │
    ▼
SAST Scanner
    │
    ▼
Security Findings

DAST

Dynamic Application Security Testing melakukan pengujian terhadap aplikasi yang sedang berjalan.

Running Application
        │
        ▼
DAST Scanner
        │
        ▼
HTTP Requests
        │
        ▼
Security Findings

SAST melihat aplikasi dari perspektif source code.

DAST melihat aplikasi dari perspektif aplikasi yang sudah berjalan.

Keduanya saling melengkapi.


Dependency Scanning

Dependency scanner memeriksa library yang digunakan aplikasi.

Contohnya:

pom.xml
package.json
requirements.txt
Docker Image

Scanner kemudian membandingkannya dengan database vulnerability.

Hasilnya dapat berupa:

Library
Version
CVE
Severity
Fixed Version

Developer kemudian dapat menentukan apakah dependency harus segera diperbarui.


Secret Scanning

Kesalahan yang cukup berbahaya adalah menyimpan credential di source code.

Contoh:

String password = "SuperSecretPassword";

Atau:

AWS_ACCESS_KEY
DATABASE_PASSWORD
PRIVATE_KEY
API_TOKEN

Credential sebaiknya dikelola melalui mekanisme seperti:

Environment Variable
Secret Manager
Vault
CI/CD Secret

Repository juga sebaiknya memiliki secret scanning untuk mendeteksi credential yang tidak sengaja di-commit.


Container Security

Jika aplikasi menggunakan Docker, container juga menjadi bagian dari attack surface.

Contohnya:

Application
    │
    ▼
Docker Image
    │
    ├── OS Packages
    ├── Runtime
    ├── Libraries
    └── Application

Vulnerability dapat berasal dari salah satu layer tersebut.

Beberapa praktik yang dapat diterapkan:

  • gunakan base image minimal,
  • hindari menjalankan container sebagai root,
  • scan container image,
  • update base image,
  • jangan menyimpan secret di image,
  • gunakan image dari sumber terpercaya.

Prinsip Least Privilege

Setiap komponen sebaiknya hanya memiliki permission yang benar-benar diperlukan.

Contohnya aplikasi hanya membutuhkan:

SELECT
INSERT
UPDATE

Tetapi database user diberikan:

SUPERUSER

Ini meningkatkan dampak jika aplikasi berhasil dieksploitasi.

Konsepnya:

Give only the minimum access required to perform the job.

Prinsip ini berlaku untuk:

Database User
Linux User
Cloud IAM
API Token
Service Account
Kubernetes
CI/CD

Defense in Depth

Tidak ada satu teknologi yang dapat memberikan keamanan 100%.

Karena itu gunakan beberapa lapisan perlindungan.

                INTERNET
                    │
                    ▼
              CDN / Anti-DDoS
                    │
                    ▼
                   WAF
                    │
                    ▼
              Reverse Proxy
                    │
                    ▼
               Application
               Security
                    │
                    ▼
               API Security
                    │
                    ▼
              Private Network
                    │
                    ▼
                Database
                    │
                    ▼
            Logging / Monitoring

Jika satu layer gagal, masih ada layer berikutnya yang memberikan perlindungan.

Inilah konsep:

Defense in Depth.


Bagaimana Menggunakan OWASP sebagai Standar Development?

OWASP sebaiknya tidak hanya digunakan ketika melakukan penetration testing.

OWASP dapat dimasukkan sejak awal proses development.

Contohnya:

Requirement
     │
     ▼
OWASP ASVS
     │
     ▼
Architecture
     │
     ▼
Threat Modeling
     │
     ▼
Development
     │
     ├── Secure Coding
     ├── SAST
     ├── Dependency Scan
     └── Secret Scan
     │
     ▼
Testing
     │
     ├── OWASP WSTG
     ├── DAST
     └── API Security Testing
     │
     ▼
Production
     │
     ├── WAF
     ├── Monitoring
     └── Vulnerability Management

Dengan pendekatan tersebut, keamanan menjadi bagian dari Software Development Lifecycle, bukan sekadar checklist sebelum aplikasi go live.


Security Checklist Sederhana

Sebelum aplikasi masuk production, minimal periksa:

Authentication

  • Password disimpan menggunakan password hashing yang sesuai
  • MFA tersedia untuk akun sensitif
  • Login memiliki rate limiting
  • Session memiliki expiration
  • Cookie menggunakan Secure dan HttpOnly

Authorization

  • Setiap endpoint memiliki authorization
  • Ownership resource diperiksa
  • Admin endpoint dilindungi
  • Prinsip least privilege diterapkan

Application

  • Input validation diterapkan
  • Parameterized query digunakan
  • Error tidak membocorkan stack trace
  • Security headers dikonfigurasi
  • Upload file divalidasi

Infrastructure

  • Database tidak terbuka langsung ke internet
  • Firewall dikonfigurasi
  • HTTPS digunakan
  • Service yang tidak diperlukan dimatikan
  • Server dan container mendapatkan security update

Development

  • SAST dijalankan
  • Dependency scanning dijalankan
  • Secret scanning dijalankan
  • Container scanning dilakukan
  • Code review dilakukan

Monitoring

  • Authentication failure dicatat
  • Aktivitas administrator dicatat
  • Security event dimonitor
  • Alert tersedia untuk aktivitas mencurigakan
  • Log disimpan secara terpusat

Apakah Aplikasi yang Lulus Penetration Test Sudah Aman?

Belum tentu.

Penetration testing menggambarkan kondisi aplikasi pada waktu tertentu.

Setelah itu bisa terjadi:

New Feature
New Dependency
New Developer
New Configuration
New Infrastructure
New Vulnerability

Karena itu keamanan bukan:

Pentest
   │
   ▼
SELESAI

Tetapi sebuah siklus:

Design
  │
  ▼
Develop
  │
  ▼
Test
  │
  ▼
Deploy
  │
  ▼
Monitor
  │
  ▼
Improve
  │
  └──────────► Design

Security Bukan Hanya Tanggung Jawab Security Team

Salah satu kesalahan organisasi adalah menganggap keamanan hanya pekerjaan tim security.

Padahal keamanan melibatkan:

Developer
QA
DevOps
Infrastructure
Security
Architect
Product Owner
Management

Developer harus memahami secure coding.

DevOps harus memahami infrastructure security.

QA perlu memasukkan negative dan security testing.

Architect perlu mempertimbangkan threat model.

Management perlu memastikan proses dan governance berjalan.

Security akhirnya menjadi shared responsibility.


Penutup

Web security bukan sekadar memasang firewall, menggunakan HTTPS, atau melakukan penetration testing setahun sekali.

Keamanan harus menjadi bagian dari bagaimana aplikasi dirancang, ditulis, diuji, di-deploy, dan dimonitor.

OWASP memberikan kerangka yang sangat berguna untuk memulai proses tersebut. OWASP Top 10 membantu memahami risiko, ASVS membantu menentukan requirement keamanan, dan WSTG membantu proses pengujian.

Tujuan akhirnya bukan membuat aplikasi yang diklaim 100% tidak bisa diretas—karena klaim tersebut tidak realistis.

Tujuannya adalah membangun sistem yang memiliki risiko terukur, memiliki beberapa lapisan proteksi, mampu mendeteksi aktivitas mencurigakan, dan dapat merespons vulnerability dengan cepat.

Build security into the software, not around the software.

web securityowaspowasp top 10cybersecurityapplication securitysecure codingweb application securityapi securityowasp asvsowasp wstgpenetration testingvulnerability assessment
Nirantara Logo

Published by Nirantara

Nirantara is an Indonesian Enterprise AI company specializing in Enterprise AI, RAG, Intelligent Search, and AI Automation. Article written by jsturana.

Learn more about Nirantara