Episode ini membahas praktik keamanan web: mencegah XSS, CSRF, dan injection, menerapkan content security policy dan secure headers, men-sanitize HTML dan menangani URL dengan aman, serta praktik terbaik keamanan sisi klien.

Autentikasi hanya salah satu lapisan keamanan. Sisi lain yang tidak kalah penting: bagaimana aplikasi memproses input pengguna, merender konten, dan berbicara dengan server. Di sinilah serangan XSS, CSRF, dan injection sering terjadi.
Episode 13 membahas pencegahan XSS, CSRF, dan injection, content security policy dan secure headers, sanitasi HTML dan URL aman, serta praktik terbaik keamanan sisi klien. Angular sudah memberi banyak perlindungan secara default — tugas kita adalah tidak membongkarnya tanpa alasan.
Cross-Site Scripting (XSS) terjadi ketika kode JavaScript berbahaya masuk ke halaman dan dieksekusi di browser korban. Sumber umum: input pengguna yang ditampilkan tanpa sanitasi, atau atribut HTML yang diisi data tidak tepercaya.
Angular secara default men-sanitize semua nilai yang di-render lewat interpolation dan binding. Coba bayangkan:
@Component({
selector: 'app-komentar',
standalone: true,
template: `<p>{{ komentar }}</p>`,
})
export class KomentarComponent {
komentar = '<script>alert("xss")</script>';
}Meski komentar berisi <script>, Angular akan menampilkannya sebagai teks biasa, bukan menjalankannya. Inilah perlindungan default yang wajib kalian pertahankan: selalu pakai interpolation dan binding, jangan menyuntikkan HTML mentah ke DOM.
CSRF mengecoh browser korban agar mengirim request berbahaya ke situs yang dipercaya. Pencegahannya: gunakan token CSRF, verifikasi header custom seperti X-Requested-With, dan pakai httpOnly cookie dengan atribut SameSite. Injection — SQL injection, command injection — terjadi di sisi server; di frontend, pastikan data dari server selalu dianggap tidak tepercaya sampai divalidasi.
Content Security Policy membatasi sumber daya apa yang boleh dimuat halaman. Kebijakan ketat akan memblokir script inline dan sumber eksternal yang tidak diizinkan:
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'Kebijakan di atas hanya mengizinkan script dari domain sendiri dan style inline. CSP bisa disetel lewat header server atau meta tag. Angular yang dibuild dengan hashing aman untuk kebijakan seperti ini.
Selain CSP, pastikan server mengirim: Strict-Transport-Security untuk memaksa HTTPS, X-Content-Type-Options: nosniff, Referrer-Policy, dan X-Frame-Options untuk mencegah clickjacking. Header ini bisa ditambahkan di web server seperti nginx, atau di platform hosting seperti Vercel dan Netlify.
Kadang aplikasi memang harus menampilkan HTML dari server. Jangan menonaktifkan sanitasi Angular sembarangan. Jika wajib, gunakan DomSanitizer dan tinjau ulang dengan sangat hati-hati:
import { Component, inject } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Component({
selector: 'app-konten',
standalone: true,
template: `<div [innerHTML]="htmlAman"></div>`,
})
export class KontenComponent {
private readonly sanitizer = inject(DomSanitizer);
htmlAman: SafeHtml = '';
}SafeHtml memberi tahu Angular bahwa nilai sudah dinyatakan aman secara eksplisit oleh pengembang. Ini berarti kalian mengambil alih tanggung jawab sanitasi — hanya gunakan jika konten benar-benar dari sumber tepercaya.
URL juga bisa berbahaya, misalnya javascript: sebagai skema. Angular memblokir URL berbahaya di binding href dan src. Untuk membuka tautan dari data pengguna, gunakan bypassSecurityTrustUrl hanya setelah memvalidasi skema:
function urlAman(raw: string): SafeUrl | null {
if (!/^https?:\/\//i.test(raw)) {
return null;
}
return sanitizer.bypassSecurityTrustUrl(raw);
}Regex ^https?:\/\// memastikan hanya URL dengan skema http atau https yang diterima. Semua skema lain ditolak — pola ini mencegah URL javascript: yang berbahaya.
innerHTML langsung.SameSite serta httpOnly.Lakukan audit keamanan secara berkala: jalankan npm audit untuk dependencies, gunakan scanner otomatis untuk header keamanan, dan tinjau kode yang memakai bypassSecurityTrust*. Keamanan bukan sekali jadi — ia dijaga setiap hari.
Inti yang harus dibawa pulang:
DomSanitizer hanya untuk konten tepercaya, dengan peninjauan ketat.javascript: tidak pernah lolos.Di episode 14 selanjutnya kita akan membahas API communication dan caching — memakai HTTP interceptors untuk penanganan error terpusat, strategi caching untuk API responses, state transfer dan server-side rendering cache, serta optimasi performa network requests.