노트

localStorage와 sessionStorage

Web Storage API

프런트엔드#browser#js · 연결된 개념 7개

쉽게 말하면

localStorage는 브라우저에 둔 개인 사물함이라 탭을 닫아도 남고, sessionStorage는 탭마다 받는 임시 바구니라 탭을 닫으면 비워져요. 서버에 묻지 않고도 설정이나 장바구니를 기억할 수 있죠.

비유가 깨지는 곳 사물함이지만 잠금장치는 없어요. 같은 출처의 모든 스크립트가 읽을 수 있어 XSS에 노출돼요. 쿠키와 달리 요청에 자동으로 안 실리고, 문자열만 담는 동기 API라 큰 데이터는 IndexedDB를 써요.

브라우저에 문자열 키-값을 저장하는 Web Storage API의 두 가지. 쿠키와 달리 요청에 자동으로 실리지 않고, 출처 단위로 나뉘며(동일 출처 정책), 보통 출처당 5MB 안팎을 쓸 수 있다. 동기 API라 큰 데이터를 자주 읽고 쓰면 메인 스레드를 막는다.

동작localStoragesessionStorage
새로고침유지유지
같은 탭에서 같은 출처 페이지 이동유지유지
같은 사이트를 새 탭으로 열기공유탭마다 따로
탭 복제공유그 시점 값을 복사해 따로
탭 닫기유지삭제
브라우저 재시작유지보통 삭제(세션 복원 기능이 살리기도 함)

새로고침했는데 sessionStorage 값이 사라진다면 저장소 특성이 아니라 코드 어딘가가 초기화하고 있을 가능성이 크다.

storage 이벤트로 탭 간 동기화

같은 출처의 다른 탭에서 localStorage가 바뀌면 storage 이벤트가 온다. 값을 바꾼 탭 자신에게는 오지 않는다. 이벤트에는 key, oldValue, newValue, url, storageArea가 담긴다.

// 로그아웃한 탭: 신호를 남긴다
localStorage.setItem('logout', Date.now().toString())
 
// 나머지 탭: 신호를 받으면 함께 로그아웃
addEventListener('storage', e => {
  if (e.key === 'logout') location.href = '/'
})

서버 없이 로그인 상태, 장바구니, 설정을 여러 탭에 맞출 수 있다. React에서 이런 외부 저장소를 구독할 때는 useSyncExternalStore가 맞는 도구다.

주의

  • 같은 출처의 모든 스크립트가 읽을 수 있으므로 XSS(Cross-Site Scripting)에 노출된다. 토큰을 여기 두면 CSRF(Cross-Site Request Forgery) 위험은 줄지만 XSS 위험을 떠안는다 → JWT
  • 문자열만 저장하므로 객체는 JSON.stringify로 바꾼다
  • 큰 데이터나 구조화된 데이터는 비동기 API인 IndexedDB를 쓴다

출처: MDN — Web Storage API · MDN — Window: storage event

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 세션 인증

    서버가 로그인 상태를 저장하고, 브라우저는 세션 id(session identifier)만 쿠키로 들고 다니는 방식. 서버에서 세션을 지우면 즉시 로그아웃되고, 세션 쿠키에 HttpOnly를 붙이면 스크립트로 읽을 수 없다.

  • 브라우저 캐시

    한 번 받은 리소스(HTML·CSS·JS·이미지)를 브라우저가 저장해 두었다가 다시 쓰는 기능. 서버가 응답 헤더로 얼마나, 어떻게 캐시할지 알려 주고 브라우저가 그대로 따른다.

  • CSRF

    CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)는 로그인한 사용자가 악성 사이트를 방문했을 때, 그 사이트가 사용자의 브라우저를 시켜 사용자 모르게 원래 사이트에 요청을 보내게 하는 공격이다. 공격자는 토큰을 훔치지 않는다. 브라우저가 쿠키를 알아서 붙여 준다는 점을 이용한다.

  • 브라우저 요청과 서버 간 요청

    같은 HTTP 요청이라도 브라우저에서 보내면 여러 보안 규칙이 강제되고, 서버에서 보내면 아무 제한이 없다. 브라우저 보안 정책은 신뢰할 수 없는 코드로부터 사용자를 지키려고 있기 때문이다.

  • 저장소 역할 분담 (DB·캐시·큐·검색)

    서버 애플리케이션 옆에는 거의 늘 관계형 DB, 인메모리 캐시, 메시지 브로커(message broker), 검색 엔진이 붙는다. 하나로 다 하지 않는 이유는 데이터의 성격(영구성·속도·전달·검색)마다 잘하는 도구가 다르기 때문이다.

보기 옵션