🖥️개발/🐥JavaScript

[JavaScript] 로컬 스토리지와 세션 스토리지 (localStorage & sessionStorage)

주_Y 2025. 4. 7. 14:55

🖥️ 로컬 스토리지와 세션 스토리지

안녕하세요!! 웹 개발을 하다 보면 데이터를 클라이언트 측에 저장해야 할 때가 많죠!

이 전 글에서 쿠키에 대해 알아봤는데요, 오늘은 웹 스토리지의 다른 두 가지 방식인 로컬 스토리지와 세션 스토리지에 대해 깔끔하게 정리해 보겠습니다! 

 

 

 

[JavaScript] 쿠키 Cookie란?

🍪 쿠키 (Cookie)안녕하세요!! 웹 개발을 하다 보면 쿠키라는 용어를 자주 접하게 되죠!요즘에는 개발 뿐 만 아니라 새로운 사이트를 접속했을 때 쿠키를 허용해달라는 문구도 많이 보게 되구요!

colorful-jucong-life.tistory.com

(쿠키에 관한 글이 궁금하신 분들은 위 글을 참고해주세요!)

 

 

✅ 웹 스토리지(Web Storage)란?

웹 스토리지(Web Storage)는 HTML5에서 도입된 클라이언트 측 데이터 저장 방식입니다.

쿠키의 여러 한계점을 보완하기 위해 등장하게 되었습니다. 웹 스토리지는 크게 로컬 스토리지(localStorage)와 세션 스토리지(sessionStorage) 두 가지로 나뉩니다.

 

 

 

✅ 로컬 스토리지(localStorage)란?

로컬 스토리지는 브라우저에 데이터를 영구적으로 저장할 수 있는 방식입니다. 사용자가 브라우저를 닫거나 컴퓨터를 재부팅해도 데이터가 유지됩니다. 쉽게 말해 "반영구적인 브라우저 메모장"이라고 생각하면 됩니다!

 

📌특징

 

  • 영구 저장: 브라우저를 닫거나 컴퓨터를 재부팅해도 데이터가 계속 유지됩니다.
  • 용량 제한: 일반적으로 5MB까지 저장 가능합니다(브라우저마다 차이 있음).
  • 공유 범위: 같은 오리진의 모든 탭과 창에서 데이터를 공유합니다.
  • 오리진 기반: 같은 오리진(프로토콜+도메인+포트)에서만 데이터에 접근할 수 있습니다.

출처 : https://etloveguitar.tistory.com/83?pidx=0

  • 동기식 작동: 데이터 저장 및 조회가 동기적으로 처리됩니다. 즉 로컬스토리지에 데이터를 요청하거나 저장하는 명령을 실행하면 JS 엔진은 일단 모든 작업을 중지하고, 로컬 스토리지의 작업을 완료 한 후 다음 JS 코드를 실행하게 됩니다. 

코드로 동기식 작동을 확인해보자면 아래와 같습니다.

console.log("작업 시작");

// 로컬 스토리지에 데이터 저장 - 이 작업이 완료될 때까지 다음 줄로 넘어가지 않음
localStorage.setItem("user", "김철수");

// 위 작업이 완전히 끝난 후에야 실행됨
console.log("데이터 저장 완료");

// 로컬 스토리지에서 데이터 가져오기 - 이 작업도 완료될 때까지 대기
const user = localStorage.getItem("user");

// 위 작업이 완전히 끝난 후에야 실행됨
console.log("가져온 사용자:", user);
console.log("모든 작업 완료");

위 코드는 순차적으로 하나씩 실행이 되게 됩니다. setItem이나 getItem 작업 중에는 다른 자바스크립트 코드가 실행되지 않는 것 이죠.

 

📌사용 예시

  • 사용자 환경 설정(다크 모드/라이트 모드 등)
  • 장바구니 정보
  • 사용자가 입력한 양식 데이터 임시 저장
  • 자주 변경되지 않는 참조 데이터
  • 오프라인 작업을 위한 데이터 캐싱

 

 

 

 

✅ 세션 스토리지(sessionStorage)란?

세션 스토리지는 브라우저 세션이 유지되는 동안에만 데이터를 저장합니다. 즉, 사용자가 탭이나 브라우저를 닫으면 데이터가 삭제됩니다. 동일한 사이트의 여러 탭에서도 각각 독립적인 세션 스토리지를 가지게 됩니다.

 

📌특징

 

  • 임시 저장: 브라우저 탭이나 창을 닫으면 데이터가 삭제됩니다.
  • 용량 제한: 로컬 스토리지와 동일하게 약 5MB입니다.
  • 오리진 기반: 같은 오리진에서만 데이터에 접근할 수 있습니다.
  • 동기식 작동: 데이터 저장 및 조회가 동기적으로 처리됩니다.
  • 격리된 범위: 각 탭이나 창마다 독립적인 스토리지를 가집니다(같은 페이지라도 다른 탭에서는 데이터 공유 안 됨).

 

📌사용 예시

 

  • 한 번의 방문 동안만 필요한 임시 데이터
  • 양식 작성 중 임시 저장
  • 페이지 새로고침 시에도 유지해야 하는 상태 정보
  • 브라우저 탭별로 독립적인 데이터가 필요한 경우
  • 보안상 민감한 임시 데이터(세션 종료 시 자동으로 삭제되기 때문에)

 

 

 

✅ 쿠키가 아닌 로컬 스토리지와 세션 스토리지를 사용하는 이유

앞서 쿠키만으로는 부족한 점이 많았기 때문에 HTML5에서는 웹 스토리지가 등장했다고 했었죠?

그럼 쿠키와 이 두가지가 다른 점은 무엇이 있을까요?

 

1. 서버 통신

  • 쿠키: 모든 HTTP 요청에 자동으로 포함됨
  • 웹 스토리지: 서버로 자동 전송되지 않음 (네트워크 트래픽 감소 효과)

2. 저장 가능 용량

  • 쿠키: 약 4KB
  • 웹 스토리지: 약 5MB (훨씬 더 큼)

3. 수명

  • 쿠키: 설정된 만료일까지
  • 로컬 스토리지: 영구적 (수동으로 삭제하기 전까지)
  • 세션 스토리지: 탭/창을 닫을 때까지만 살아있음

4. 보안

  • 쿠키: httpOnly, secure 플래그로 보안 강화 가능
  • 웹 스토리지: JavaScript로만 접근 가능 => XSS에 취약할 수 있음

5. 사용 편의성

  • 쿠키: 문자열 파싱 필요, 복잡한 구문
  • 웹 스토리지: 간단한 키-값 API (setItem, getItem)

 

 

✅ 로컬 스토리지 기본 사용법

그럼 실제로 로컬 스토리지를 어떻게 사용하는지 코드로 알아볼까요?

🔹 데이터 저장하기

// 문자열 저장
localStorage.setItem('username', 'Ju');

// 숫자 저장 (문자열로 변환됨)
localStorage.setItem('age', 25);

// 객체 저장 (JSON 문자열로 변환해야 함)
const user = { name: 'Ju', age: 25, isAdmin: false };
localStorage.setItem('user', JSON.stringify(user));

🔹 데이터 읽기

// 문자열 읽기
const username = localStorage.getItem('username');
console.log(username); // "Ju"

// 숫자 읽기 (문자열로 반환됨, 필요시 변환 필요)
const age = Number(localStorage.getItem('age'));
console.log(age); // 25

// 객체 읽기 (JSON 파싱 필요)
const user = JSON.parse(localStorage.getItem('user'));
console.log(user.name); // "Ju"

🔹 데이터 삭제하기

// 특정 키 삭제
localStorage.removeItem('username');

// 모든 데이터 삭제
localStorage.clear();

 

 

✅ 세션 스토리지 기본 사용법

세션 스토리지도 로컬 스토리지와 사용법이 거의 동일합니다!

🔹 데이터 저장하기

// 문자열 저장
sessionStorage.setItem('tempUsername', 'Ju');

// 장바구니 아이템 저장
const cart = ['item1', 'item2', 'item3'];
sessionStorage.setItem('cart', JSON.stringify(cart));

🔹 데이터 읽기

// 문자열 읽기
const tempUsername = sessionStorage.getItem('tempUsername');
console.log(tempUsername); // "Ju"

// 배열 읽기
const cart = JSON.parse(sessionStorage.getItem('cart'));
console.log(cart[0]); // "item1"

🔹 데이터 삭제하기

// 특정 키 삭제
sessionStorage.removeItem('tempUsername');

// 모든 데이터 삭제
sessionStorage.clear();

 

 

✅ 로컬 스토리지와 세션 스토리지 비교

특성 로컬 스토리지 세션 스토리지
데이터 수명 영구적 (수동으로 삭제하거나 브라우저 캐시 삭제 전까지) 세션 종료 시까지 (탭/브라우저 닫을 때)
접근 범위 동일 출처(도메인)의 모든 창/탭 동일 출처의 같은 탭에서만 접근 가능
용량 약 5MB 약 5MB
적합한 사용 사례 사용자 설정, 테마, 장기 캐싱 데이터 임시 폼 데이터, 페이지 간 데이터 전달

 

 

 

✅ 웹 스토리지 사용 시 주의사항

 

민감한 데이터 저장 금지

웹 스토리지는 암호화되지 않은 일반 텍스트로 저장되므로, 비밀번호나 개인정보 같은 민감한 데이터를 저장하면 안 됩니다.

 

저장 용량 제한

브라우저마다 다르지만 대략 5MB 정도의 저장 한도가 있습니다. 대용량 데이터는 저장되지 않아요~

// 저장 실패 처리
try {
  localStorage.setItem('bigData', veryLargeString);
} catch (e) {
  if (e.name === 'QuotaExceededError') {
    alert('저장 공간이 부족합니다. 일부 데이터를 삭제해주세요.');
  
  }
}

이런식으로 에러 바운더리를 통해 저장이 잘 되었는지 안 되었는지 확인하는 코드를 작성해두는 것도 좋겠죠!

 

동기 API의 성능 영향

웹 스토리지 API는 위에서 설명한 것 과 같이 동기적으로 작동하기 때문에 대량의 데이터를 처리할 때 메인 스레드를 차단할 수 있습니다. 이는 웹의 속도를 저하시키기 때문에 UX에도 안 좋은 영향을 끼치겠죠!

// ❌ 피해야 할 상황: 자주 호출되는 함수에서 대용량 데이터 조작
function frequentlyCalledFunction() {
  const hugeData = JSON.parse(localStorage.getItem('hugeData'));
  // 데이터 처리...
  localStorage.setItem('hugeData', JSON.stringify(hugeData));
}

// ✅ 더 나은 방법: 필요할 때만 저장
let hugeData = JSON.parse(localStorage.getItem('hugeData')) || {};
let isDataModified = false;

function updateData(key, value) {
  hugeData[key] = value;
  isDataModified = true;
}

// 일정 시간마다 또는 페이지를 떠날 때만 저장
window.addEventListener('beforeunload', () => {
  if (isDataModified) {
    localStorage.setItem('hugeData', JSON.stringify(hugeData));
  }
});

 

 

 

✅ 쿠키 vs 로컬 스토리지 vs 세션 스토리지 

특성 쿠키 로컬 스토리지 세션 스토리지
용량 ~4KB ~5MB ~5MB
유효 기간 직접 설정 가능 영구적 탭/브라우저 종료 시까지
서버 전송 모든 HTTP 요청에 포함 서버로 전송 안 됨 서버로 전송 안 됨
접근 범위 설정된 도메인의 모든 페이지 동일 출처의 모든 페이지 동일 출처의 같은 탭/창
API 편의성 문자열 파싱 필요 간단한 key-value API 간단한 key-value API
주요 용도 세션 관리, 추적 사용자 설정, 캐싱 임시 데이터, 단일 페이지 상태
보안 요소 HttpOnly, Secure 플래그 없음 없음

 

 

✅ 어떤 스토리지를 선택해야 할까?

 

쿠키를 사용해야 할 때

  • 서버에서 데이터를 읽어야 할 때 (인증, 세션 관리)
    → 쿠키는 HTTP 요청 시 자동으로 서버에 전송되므로, 인증 토큰이나 세션 ID 전달에 적합합니다.
  • 모든 HTTP 요청에 데이터가 필요할 때
    → 쿠키에 저장하면 클라이언트가 서버에 요청할 때마다 자동으로 포함되므로, 매 요청마다 필요한 정보 저장에 유리합니다.
  • 오래된 브라우저 지원이 필요할 때
    → 쿠키는 대부분의 구형 브라우저에서도 작동하므로, 호환성 측면에서 안정적입니다.

로컬 스토리지를 사용해야 할 때

  • 장기간 데이터 보존이 필요할 때 (사용자 설정, 테마)
    → 로컬 스토리지는 브라우저가 종료되어도 데이터가 유지되므로, 사용자 맞춤 설정 저장에 적합합니다.
  • 비교적 큰 데이터를 저장해야 할 때
    → 쿠키보다 더 많은 데이터를 저장할 수 있으므로, 용량이 큰 데이터를 다룰 때 유용합니다.
  • 서버에 전송할 필요가 없는 데이터일 때
    → 서버로 보낼 필요가 없는 UI 상태나 캐시 정보 등을 저장할 때 효율적입니다.
  • 모든 탭/창에서 데이터 공유가 필요할 때
    → 로컬 스토리지는 동일한 출처(origin) 내의 모든 탭과 창에서 데이터를 공유할 수 있습니다.

세션 스토리지를 사용해야 할 때

  • 임시 데이터 저장이 필요할 때
    → 세션 스토리지는 현재 세션 동안만 데이터를 보관하므로, 일시적인 정보 저장에 적합합니다.
  • 탭/창 간에 데이터 독립성이 필요할 때
    → 세션 스토리지는 각 탭마다 별도로 관리되므로, 탭 간 데이터 격리가 가능합니다.
  • 브라우저 종료 시 데이터가 삭제되어야 할 때
    → 민감하거나 일회성 데이터는 세션 스토리지를 사용하면 브라우저 종료 시 자동으로 삭제됩니다.
  • 다단계 양식 데이터 같은 일시적 상태 저장이 필요할 때
    → 사용자 입력 도중 페이지를 새로 고쳐도 같은 탭이라면 데이터를 유지할 수 있으므로, 다단계 양식에 적합합니다.

 

✅ 마무리

웹 스토리지와 쿠키에 대해 알아보았는데요. 이제 두 글을 읽으면 각각 필요한 상황에서 적제적소에 잘 사용 할 수 있으시겠죠! 오늘 글은 여기서 마무리 하겠습니다. 감사합니다!

 

 

 

 

 

 

썸네일