Arsitektur Web Application
Memahami cara kerja web app dari ujung ke ujung membuatmu lebih efektif menemukan di mana celah bisa terjadi.
Frontend vs Backend
| Layer | Teknologi | Bug yang Sering Ditemukan |
| Frontend | HTML, CSS, JavaScript | XSS, DOM injection, client-side bypass |
| Backend | PHP, Node.js, Python, Java | SQLi, SSRF, RCE, auth bypass |
| Database | MySQL, PostgreSQL, MongoDB | SQLi, NoSQLi, data exposure |
| Server | Nginx, Apache | Misconfig, path traversal |
REST API
Modern web app hampir semua menggunakan API untuk komunikasi frontend-backend. API adalah target utama bug hunter karena sering kurang diproteksi.
# Contoh REST API endpoints
GET /api/users # List semua user
GET /api/users/123 # Detail user 123 → IDOR?
POST /api/users # Buat user baru
PUT /api/users/123 # Update user 123 → IDOR?
DELETE /api/users/123 # Hapus user 123 → IDOR?
Authentication Flow
Alur autentikasi yang umum:
- User kirim username + password via POST
- Server validasi credential ke database
- Server buat session/JWT dan kirim ke client
- Client simpan token di cookie/localStorage
- Setiap request berikutnya kirim token di header/cookie
JWT (JSON Web Token)
# Struktur JWT: header.payload.signature
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQ.abc123
# Decode di jwt.io — payload berisi:
{"user": "rizky", "role": "user", "exp": 1234567890}
JWT Attack: Coba ubah algoritma dari HS256 ke "none" — beberapa implementasi menerima token tanpa signature! Atau ganti role dari "user" ke "admin" jika secret key lemah.
Database & Query
Backend berkomunikasi dengan database menggunakan query. Inilah kenapa SQL Injection bisa terjadi:
// Input user langsung ke query = BERBAHAYA
$q = "SELECT * FROM users WHERE id = " . $_GET['id'];
// Gunakan prepared statement = AMAN
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
Cookies vs localStorage vs sessionStorage
| Storage | Akses JS | Dikirim ke Server | Aman untuk Token? |
| Cookie (HttpOnly) | Tidak | Otomatis | Ya ✓ |
| Cookie (biasa) | Ya | Otomatis | Rentan XSS |
| localStorage | Ya | Tidak | Rentan XSS |
| sessionStorage | Ya | Tidak | Rentan XSS |
// CEK PEMAHAMAN
Mengapa menyimpan JWT di localStorage lebih berisiko dibanding cookie HttpOnly?
AlocalStorage lebih kecil kapasitasnya
BlocalStorage lebih lambat
ClocalStorage bisa diakses JavaScript, rentan dicuri via XSS
DlocalStorage dikirim otomatis ke semua domain