
웹 브라우저는 클라이언트에 데이터를 저장할 수 있는 여러 가지 방식을 제공한다.
각 저장소는 저장 용량, 만료 정책, 사용 방식(API의 복잡도) 면에서 뚜렷한 차이가 있다.
주요 용도: 서버와 클라이언트 간 상태 유지를 위한 수단. 주로 로그인 인증, 사용자 행동 추적 등에 사용된다.
특징:
Expires 또는 Max-Age 속성으로 만료 시점을 지정할 수 있음.주요 용도: 네트워크와 무관한 클라이언트 측 상태 저장. 사용자 설정, UI 상태 등에 활용됨.
특징:
setItem, getItem, removeItem 등 직관적인 API 제공.구분:
주요 용도: 대용량의 구조화된 데이터를 클라이언트에 저장. 오프라인 사용, 캐싱 등에 적합함.
특징:
| 저장소 | 수명 | 보안 | 용량 | 주요 용도 |
|---|---|---|---|---|
| 쿠키 | 설정된 만료일까지 | ✅ HttpOnly 가능 | ❌ 4KB | 인증, SSR용 상태 유지 |
| LocalStorage | 영구 (삭제 전까지) | ❌ XSS 취약 | ⭕ 5~10MB | 사용자 설정, 캐시 |
| SessionStorage | 탭/창 종료 시 | ❌ XSS 취약 | ⭕ 5~10MB | 임시 상태 저장 |
| IndexedDB | 영구 | ⭕ (직접 암호화 가능) | ⭕ 수백MB~GB | 대용량, 구조화 데이터 |
// --- 🍪 쿠키 ---
const date = new Date();
date.setTime(date.getTime() + 24 * 60 * 60 * 1000); // 1일 뒤 만료
document.cookie = `username=JohnDoe; expires=${date.toUTCString()}; path=/`;
// 쿠키 읽기 함수
const getCookie = (name) => {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
};
console.log('Cookie username:', getCookie('username'));
// --- 📦 웹 스토리지 ---
localStorage.setItem('theme', 'dark');
console.log('LocalStorage theme:', localStorage.getItem('theme'));
sessionStorage.setItem('tempId', 'abc-123');
console.log('SessionStorage tempId:', sessionStorage.getItem('tempId'));
// --- 🗄️ IndexedDB ---
const request = indexedDB.open('myAppDB', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
db.createObjectStore('users', { keyPath: 'id' });
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx = db.transaction(['users'], 'readwrite');
const store = tx.objectStore('users');
store.add({ id: 'user1', name: 'Alice', email: 'alice@example.com' });
const getReq = store.get('user1');
getReq.onsuccess = () => {
console.log('IndexedDB user:', getReq.result);
};
tx.oncomplete = () => {
console.log('IndexedDB 트랜잭션 완료');
db.close();
};
};
request.onerror = (event) => {
console.error('IndexedDB error:', event.target.errorCode);
};