Prinsip Keamanan LocalStorage
LocalStorage secara inheren tidak aman karena data disimpan dalam teks polos (plain text) dan dapat diakses oleh skrip pihak ketiga melalui serangan Cross-Site Scripting (XSS). Untuk mengamankan data, Anda wajib menerapkan enkripsi sisi klien (client-side encryption) sebelum data disimpan ke dalam storage.
Implementasi Enkripsi AES-256
Metode paling standar adalah menggunakan pustaka CryptoJS untuk melakukan enkripsi AES (Advanced Encryption Standard) dengan kunci rahasia yang dikelola dengan benar.
// Instalasi: npm install crypto-js
import CryptoJS from 'crypto-js';
const SECRET_KEY = 'kunci-rahasia-anda-disini';
// Fungsi Enkripsi
const encryptData = (data) => {
return CryptoJS.AES.encrypt(JSON.stringify(data), SECRET_KEY).toString();
};
// Fungsi Dekripsi
const decryptData = (ciphertext) => {
const bytes = CryptoJS.AES.decrypt(ciphertext, SECRET_KEY);
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
};
// Penggunaan
localStorage.setItem('user_data', encryptData({ id: 1, role: 'admin' }));
const data = decryptData(localStorage.getItem('user_data'));Matriks Keamanan Penyimpanan Data
| Metode | Tingkat Keamanan | Kelebihan | Kekurangan |
|---|---|---|---|
| LocalStorage (Plain) | Sangat Rendah | Mudah diimplementasi | Rentan XSS, data terbaca |
| LocalStorage + AES | Menengah | Data terenkripsi | Kunci rahasia di JS rentan |
| HttpOnly Cookies | Tinggi | Tidak bisa diakses JS | Rentan CSRF |
| IndexedDB + Enkripsi | Tinggi | Kapasitas besar | Kompleksitas tinggi |
Strategi Mitigasi Risiko
Enkripsi hanyalah satu lapisan. Untuk mencapai keamanan maksimal, terapkan langkah-langkah berikut:
- Content Security Policy (CSP): Batasi eksekusi skrip dari domain yang tidak dikenal untuk mencegah injeksi skrip berbahaya.
- Sanitasi Input: Selalu bersihkan input pengguna sebelum diproses untuk mencegah XSS.
- Hindari Data Sensitif: Jangan pernah menyimpan token autentikasi (JWT) atau data kartu kredit di LocalStorage. Gunakan HttpOnly Cookies untuk token sesi.
- Key Rotation: Jika memungkinkan, ambil kunci enkripsi dari server saat sesi dimulai, jangan menyimpan kunci statis di dalam kode sumber (source code).
Jika aplikasi Anda menangani data yang sangat sensitif, pertimbangkan untuk memindahkan penyimpanan ke SessionStorage yang akan terhapus otomatis saat tab ditutup, atau gunakan IndexedDB dengan enkripsi yang lebih ketat.