Episode ini membahas keamanan API di Vue: integrasi API dengan environment variables, perlindungan XSS lewat rendering yang aman, CSRF protection, penanganan data sensitif di client, serta best practices komunikasi API yang aman.

Aplikasi frontend berkomunikasi dengan server setiap hari, dan setiap komunikasi adalah permukaan serangan: data bisa bocor, token bisa dicuri, atau halaman bisa diretas lewat injeksi. Memahami keamanan API bukan opsi, melainkan keharusan untuk aplikasi production.
Episode 13 membahas pengamanan komunikasi client-server di Vue: integrasi API yang aman dengan environment variables, pencegahan XSS lewat rendering yang aman, CSRF protection, cara menangani data sensitif di aplikasi client, dan best practices komunikasi API yang bisa kalian pakai langsung.
Jangan pernah menulis URL API atau key langsung di kode. Simpan di file .env dengan prefix VITE_:
VITE_API_BASE_URL=https://api.example.com
VITE_APP_VERSION=1.0.0import.meta.env.VITE_API_BASE_URLimport.meta.env.VITE_API_BASE_URL membaca nilai dari .env. Hanya variabel berprefix VITE_ yang terekspos ke client; rahasia server tidak boleh masuk bundle.
Bungkus semua pemanggilan API dalam satu modul agar kebijakan keamanan konsisten:
const BASE = import.meta.env.VITE_API_BASE_URL;
export async function api(path, options = {}) {
const res = await fetch(`${BASE}${path}`, {
...options,
credentials: "include",
headers: {
"Content-Type": "application/json",
...options.headers,
},
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}credentials: "include" mengirim cookie sesi ke domain API, dan Content-Type dipasang seragam. Satu tempat untuk menambah header auth, timeout, atau logging.
Vue meng-escape semua interpolasi secara default, jadi teks dari user aman dirender:
<script setup>
const komentar = "<script>alert('xss')</script>";
</script>
<template>
<p>{{ komentar }}</p>
</template>{{ komentar }} menampilkan string apa adanya sebagai teks, bukan mengeksekusinya. Jangan pernah memakai v-html untuk data user tanpa sanitasi, karena itu memasukkan HTML mentah.
Jika benar-benar butuh HTML, sanitasi dulu dengan library:
npm install dompurifyimport DOMPurify from "dompurify";
const bersih = DOMPurify.sanitize(kontenDariServer);DOMPurify.sanitize(...) menghapus tag dan atribut berbahaya sebelum dirender lewat v-html. Aturan emas: perlakukan semua data dari luar sebagai tidak tepercaya.
CSRF terjadi ketika browser mengirim cookie sesi ke request yang dipicu situs jahat. Mitigasi utama di Vue: pakai cookie yang di-set SameSite oleh server, dan kirim header X-CSRF-Token yang diambil dari cookie:
function getCsrfToken() {
const match = document.cookie.match(/csrftoken=([^;]+)/);
return match ? match[1] : "";
}
api.defaults.headers.common["X-CSRF-Token"] = getCsrfToken();document.cookie.match(...) membaca token CSRF dari cookie, lalu dikirim sebagai header di setiap request. Kombinasi SameSite plus token membuat serangan lintas situs jauh lebih sulit.
Aturan utama: apa pun yang masuk ke bundle JavaScript bisa dibaca pengguna. Jangan pernah menaruh secret, API key, atau password di file frontend. Gunakan backend proxy untuk menyembunyikan rahasia, dan hanya ekspos data yang memang harus tampil. Menaruh secret di VITE_ tidak membuatnya aman, hanya memindahkannya ke publik.
Warning
Keamanan client adalah lapisan, bukan tembok. Desain API kalian dengan asumsi bahwa semua kode frontend bisa dibaca dan semua request bisa direkayasa ulang.
Episode 13 membuat komunikasi API kalian lebih aman: environment variables untuk konfigurasi, interpolasi yang di-escape secara default, sanitasi dengan DOMPurify sebelum v-html, CSRF token, serta aturan jelas untuk data sensitif dan best practices komunikasi API.
Inti yang harus dibawa pulang:
VITE_ untuk variabel yang boleh ekspos ke client.v-html berbahaya untuk data user tanpa sanitasi.Di episode 14 selanjutnya kita membahas caching dan performance — client-side caching dengan Vue Query dan local storage, memoization dengan computed dan watchEffect, lazy loading komponen, serta cara mengoptimalkan render dan reaktivitas.