Mengamankan aplikasi web dari serangan paling umum: XSS, CSRF, CORS, CSP, dan HTTPS. Memahami bagaimana tiap serangan bekerja, cara mencegahnya di kode frontend, dan praktik hardening TokoKita

Semakin kompleks TokoKita — data pengguna, pembayaran, cookie — semakin tinggi taruhannya. Episode 18 membahas web security dari sisi frontend: ancaman yang menyerang aplikasi di sisi klien dan lapisan HTTP. Keamanan bukan tugas "tim security" — setiap baris kode yang menampilkan input pengguna adalah garis depan.
Filosofi episode ini: pahami cara serangan bekerja, bukan sekadar menghafal daftar mitigasi. Engineer yang paham mekanisme XSS akan menulis kode yang aman secara alami — bukan karena checklist.
XSS (Cross-Site Scripting) — penyerang menyuntikkan script yang dijalankan di halaman kalian. Akibatnya bisa dari mencuri cookie sampai menguasai akun.
// ❌ BERBAHAYA — input pengguna ditampilkan sebagai HTML
reviewSection.innerHTML = `<p>${userReview}</p>`;
// ✅ Aman — ditampilkan sebagai teks
reviewSection.textContent = userReview;Pola XSS klasik: kotak ulasan produk TokoKita. Jika kalian memasang innerHTML pada input, penyerang menulis <img src=x onerror=alert(document.cookie)> dan script berjalan di browser korban.
textContent (atau React yang sudah escape otomatis).{userReview} di JSX tidak mengeksekusi HTML. Jangan "bantu-bantu" dengan dangerouslySetInnerHTML kecuali benar-benar perlu (lalu sanitasi).Important
XSS adalah ancaman nomor satu aplikasi web. Aturan singkatnya: treat all input as untrusted, and never concatenate it into HTML. Semua framework modern (React, Vue, Svelte) sudah escape otomatis — jangan matikan pengaman itu.
CSRF (Cross-Site Request Forgery) — penyerang membuat pengguna terautentikasi menjalankan aksi tanpa sadar. Saat pengguna login TokoKita, browser menyimpan cookie. Jika ia mengunjungi situs jahat, halaman itu bisa mengirim request "jual item" atas nama cookie-nya.
<img src="https://toko.kita/api/delete-account?id=1" />Browser mengirim cookie saat request ke toko.kita — tanpa persetujuan pengguna.
SameSite=Lax/Strict agar cookie tidak dikirim pada request lintas-situs.GET — mutasi hanya lewat POST/PUT/DELETE dengan token.CORS (Cross-Origin Resource Sharing) mengatur kapan browser mengizinkan JavaScript lintas origin. Ini proteksi browser, bukan pengganti otentikasi server.
access-control-allow-origin: https://toko.kita
access-control-allow-methods: GET, POST, PUT, DELETEMasalah umum di development: fetch ke API di origin lain memblokir. Solusi yang benar: server mengatur header CORS (bukan disable CORS di browser). Wildcard * hanya aman untuk data publik tanpa cookie.
CSP (Content Security Policy) adalah "daftar putih" yang memberi tahu browser dari mana script boleh dimuat:
content-security-policy: default-src 'self'; script-src 'self'; style-src 'self'Efeknya: walau XSS lolos, browser menolak menjalankan script dari sumber yang tidak ada di daftar. Ini lapisan kedua setelah kode yang benar.
HTTPS wajib untuk semua hal: browser membatasi cookie (Secure), service worker, dan banyak API modern hanya di konteks aman. Redirect http → https secara permanen.
Checklist hardening yang realistis:
innerHTML/dangerouslySetInnerHTML; ganti dengan teks atau sanitasi.HttpOnly (JS tidak bisa baca), Secure, SameSite=Lax.bun audit (atau npm audit).bun auditStrict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin| Kesalahan | Dampak | Perbaikan |
|---|---|---|
innerHTML dengan input pengguna | XSS | textContent / sanitize |
| Mutasi via GET | CSRF | POST + token + SameSite |
CORS * untuk data ber-cookie | Kebocoran data | Origin spesifik |
| Tanpa CSP | Satu XSS = full pwn | CSP daftar putih |
| Tanpa HTTPS | Semua di atas makin parah | Redirect permanen + HSTS |
Inti yang harus dibawa pulang:
SameSite + jangan mutasi lewat GET.Di episode 19 selanjutnya kita mengamankan identitas: authentication & authorization — JWT/session, OAuth, SSO, dan secure storage, untuk membangun alur login TokoKita yang aman. Sampai jumpa di episode 19!