💾 JavaScript · 브라우저 저장소

로컬 스토리지
(localStorage) 완전 정복

서버도, 로그인도 없이 사용자 데이터를 브라우저에 저장하는 방법.
다크모드 설정 기억, 메모장 앱, 장바구니까지 — 단 4줄이면 충분해요.

⏱️ 약 12분 📅 2026년 4월 🏷️ JavaScript · 브라우저 API 👶 입문 난이도
① 개념

로컬 스토리지란 무엇인가요?

브라우저에 데이터를 저장하는 가장 간단한 방법 — 새로고침해도 사라지지 않아요

웹 페이지를 새로고침하면 JavaScript 변수는 모두 사라져요. 하지만 사용자가 선택한 다크모드 설정, 작성 중인 메모, 장바구니 아이템은 새로고침 후에도 남아 있어야 하죠. localStorage는 바로 이런 상황을 위해 만들어진 브라우저 내장 저장소예요.

localStorage.setItem('key', 'value') 한 줄로 데이터를 저장하고, localStorage.getItem('key')로 꺼내쓸 수 있어요. 저장된 데이터는 브라우저를 닫았다 열어도, 컴퓨터를 재시작해도 사라지지 않아요.

🔒

도메인별 격리

같은 브라우저라도 사이트별로 별도 저장소를 가져요. 내 사이트 데이터가 다른 사이트에 노출될 걱정 없어요.

♾️

만료 없음

명시적으로 삭제하지 않는 한 영구 저장돼요. 쿠키처럼 만료 기간이 없어요.

📦

5MB 용량

도메인당 약 5MB까지 저장 가능해요. 텍스트 데이터라면 수백만 글자도 거뜬해요.

동기 방식

비동기(async/await) 없이 바로 읽고 씁니다. 코드가 단순해서 입문자에게 이상적이에요.

localStorage vs 쿠키 vs 세션스토리지

구분localStoragesessionStorageCookie
지속성 영구 (수동 삭제 전) 탭 닫으면 삭제 만료일 설정 가능
용량 ~5MB ~5MB 4KB (매우 작음)
서버 전송 없음 없음 HTTP 요청마다 자동 전송
주요 용도 설정 저장, 임시 데이터 페이지 간 임시 전달 로그인 세션, 추적
② 핵심 메서드

꼭 알아야 할 4가지 메서드

이 4개만 알면 localStorage는 마스터

setItem(key, value)

데이터를 저장해요. 키-값 쌍으로 저장되고, 같은 키로 다시 저장하면 덮어써요.

localStorage.setItem('theme', 'dark');
getItem(key)

저장된 데이터를 꺼내요. 없는 키를 요청하면 null을 반환해요.

const theme = localStorage.getItem('theme');
removeItem(key)

특정 키의 데이터를 삭제해요. 삭제 후 getItem하면 null이 반환돼요.

localStorage.removeItem('theme');
clear()

해당 도메인의 모든 localStorage 데이터를 삭제해요. 초기화 버튼 구현에 사용해요.

localStorage.clear();
⚠️

localStorage는 문자열만 저장돼요. 숫자나 배열, 객체를 저장하려면 JSON.stringify()로 문자열로 변환해서 저장하고, 꺼낼 때는 JSON.parse()로 복원해야 해요.

localStorage.setItem('cart', JSON.stringify([{id:1, name:'상품A'}]));
const cart = JSON.parse(localStorage.getItem('cart') || '[]');

③ 코드

실전 패턴 3가지

바로 복붙해서 쓸 수 있는 실용 코드

① 다크모드 설정 저장

JavaScript
// 저장: 사용자가 다크모드 선택 시
function setTheme(theme) {
  localStorage.setItem('theme', theme);
  document.body.setAttribute('data-theme', theme);
}

// 불러오기: 페이지 로드 시
const savedTheme = localStorage.getItem('theme') || 'light';
setTheme(savedTheme);

② 객체 배열 저장 (장바구니)

JavaScript
// 장바구니 불러오기 (없으면 빈 배열)
function getCart() {
  return JSON.parse(localStorage.getItem('cart') || '[]');
}

// 장바구니에 아이템 추가
function addToCart(item) {
  const cart = getCart();
  cart.push(item);
  localStorage.setItem('cart', JSON.stringify(cart));
}

// 사용 예시
addToCart({ id: 1, name: '바이브툴킷 굿즈', price: 15000 });

③ 마지막 방문 시각 저장

JavaScript
const lastVisit = localStorage.getItem('lastVisit');
if (lastVisit) {
  const date = new Date(lastVisit);
  console.log(`마지막 방문: ${date.toLocaleString('ko-KR')}`);
}
// 현재 방문 시각 저장 (다음 방문에 표시)
localStorage.setItem('lastVisit', new Date().toISOString());
🤖 AI 프롬프트 TIP

"사용자가 입력한 닉네임을 localStorage에 저장하고, 다음에 사이트에 오면 '안녕하세요, [닉네임]님!' 이라고 인사하는 코드를 만들어줘."

④ 메모장 앱

실제로 동작하는 메모장 앱

글을 쓰고 새로고침해도 내용이 남아있어요 — localStorage의 힘

📝 나의 메모장

불러오는 중...
⑤ FAQ

자주 묻는 질문

시크릿(비공개) 모드에서는 localStorage가 저장되나요?
시크릿 모드에서도 localStorage를 쓸 수 있어요. 하지만 시크릿 창을 닫으면 모든 데이터가 삭제돼요. 시크릿 모드의 localStorage는 sessionStorage처럼 동작한다고 생각하면 돼요.

또한 Safari의 "개인 정보 보호 브라우저 기능"이나 일부 보안 설정에서는 localStorage 접근이 차단될 수 있어요. 이럴 때는 try/catch로 오류를 잡아서 처리하는 게 안전해요.

try { localStorage.setItem('key', 'value'); } catch(e) { console.warn('localStorage 사용 불가'); }
다른 탭에서도 같은 데이터를 쓸 수 있나요?
네, 같은 도메인의 다른 탭은 같은 localStorage를 공유해요. 탭 A에서 저장한 데이터를 탭 B에서 바로 읽을 수 있어요.

다른 탭의 localStorage 변경을 실시간으로 감지하고 싶다면 storage 이벤트를 사용해요:
window.addEventListener('storage', (e) => { console.log(e.key, e.newValue); });

이 이벤트는 다른 탭에서 변경이 일어날 때만 발생해요. 같은 탭에서 변경해도 이벤트가 발생하지 않아요.
localStorage에 만료 기간을 설정할 수 있나요?
localStorage 자체에는 만료 기간 기능이 없어요. 직접 타임스탬프를 함께 저장하는 방식으로 구현해야 해요.

// 저장 시 만료 시각도 함께 저장 function setWithExpiry(key, value, hours) { const expiry = Date.now() + hours * 3600 * 1000; localStorage.setItem(key, JSON.stringify({ value, expiry })); } // 꺼낼 때 만료 확인 function getWithExpiry(key) { const raw = localStorage.getItem(key); if (!raw) return null; const { value, expiry } = JSON.parse(raw); if (Date.now() > expiry) { localStorage.removeItem(key); return null; } return value; }
보안상 문제가 있나요?
localStorage는 XSS(크로스 사이트 스크립팅) 공격에 취약해요. 악성 스크립트가 주입되면 localStorage의 모든 데이터를 읽을 수 있어요.

따라서 절대 저장하면 안 되는 것들:
• 비밀번호, 신용카드 번호
• JWT 토큰(인증 토큰) — httpOnly 쿠키가 더 안전
• 민감한 개인정보

저장해도 괜찮은 것들:
• UI 설정 (다크모드, 폰트 크기)
• 임시 메모, 작성 중인 내용
• 비민감 사용자 선호도
• 쿠키 동의 여부
현재 얼마나 사용했는지 확인할 수 있나요?
JavaScript로 현재 사용량을 계산할 수 있어요. 아래 코드를 브라우저 개발자도구 콘솔에서 실행해보세요.

let total = 0; for (let key in localStorage) { total += (localStorage[key].length + key.length) * 2; } console.log((total / 1024).toFixed(2) + ' KB');

더 직관적으로는 개발자도구(F12) → Application(또는 Storage) 탭 → Local Storage 에서 저장된 모든 키-값을 확인할 수 있어요.
⑥ 다음 단계

이런 것도 배워봐요