
localStorage와 sessionStorage는 모두 웹 브라우저에 데이터를 저장하기 위해 사용되는 웹 스토리지 객체(Wek Storage Object)이다.
이 두 개를 사용하면 페이지를 새로고침하거나 심지어 탭을 닫고 열어도 데이터가 유지되도록 할 수 있다.
localStorage와 sessionStorage는 개발자도구(F12)를 열고 애플리케이션 탭 내의 저장용량에서 확인할 수 있다.
localStorage는 데이터를 웹 브라우저에 저장하며, 웹 브라우저를 종료하고 재시작하여도 데이터가 웹 브라우저에 저장되어 있다.
localStorage는 다크 모드를 설정 후 재방문 시 설정 유지, 자동로그인 등에 사용된다.
localStorage.setItem("myCat", "Tom");
이때, 각 데이터 항목은 키와 값으로 구성되어 있으므로 myCat이 key, Tom이 value이다.
이때 주의점은 문자열만 지원한다.
const cat = localStorage.getItem("myCat");
localStorage.removeItem("myCat");
localStorage.clear();
이전에 진행한 프로젝트에서 localStorage를 사용한 경험이 있어서 그 때의 코드를 조금 가져왔다.
// login.js
const login = async () => {
if (!cnt++) {
await getAccessToken();
const res = await getUser();
const id = res.id;
const name = res.name;
const avatar = res.avatar;
setId(id);
setName(name);
setAvatar(avatar);
localStorage.setItem("id", id);
localStorage.setItem("name", name);
localStorage.setItem("avatar", avatar);
}
};
위 코드는 로그인 과정에서 받아온 사용자의 id, 이름, 프로필 사진을 locaStorage에 저장하는 코드이다.
// header.js
const checkIsLogin = async () => {
const loggedIn = await checkTokenValid();
if (loggedIn) {
setSrc(localStorage.avatar);
setUserId(localStorage.id);
setUserName(localStorage.name);
} else {
localStorage.removeItem("id");
localStorage.removeItem("name");
localStorage.removeItem("avatar");
}
setIsLogin(loggedIn);
};
const handleCloseUserMenu = async () => {
const res = await axios.post(
process.env.REACT_APP_SERVER_URL + "/auth/github-logout",
"",
{ withCredentials: true },
);
setIsLogin(false);
localStorage.setItem("id", "guest");
localStorage.setItem("name", "guest");
localStorage.setItem("avatar", "");
setUserId(localStorage.getItem("id"));
setUserName(localStorage.getItem("name"));
setSrc(localStorage.getItem("avatar"));
setAnchorElUser(null);
};
위 코드는 로그인 토큰을 받아올 수 있는지 확인하고, 로그인이 되어 있을 경우 사용자의 id, 이름, 프로필 사진을 받아오고 그렇지 않을 경우 localStorage에 있는 사용자의 id, 이름, 프로필 사진을 삭제한다.
이후 로그아웃을 해 setIsLogin이 false일 경우 게스트 상태로 두기 위해 이름과 아이디를 게스트로 설정하고, 프로필 사진을 설정하지 않는다. (임의로 다른 데이터를 저장한다.)
if (loggedIn) {
setSrc(localStorage.avatar);
setUserId(localStorage.id);
setUserName(localStorage.name);
위 코드에서 예제와 다르게 사용된 문법이 있어서 의아할 수 있는데, loacStorage의 키를 얻거나 설정할 때 일반 객체와 유사한 방법을 사용할 수 있다.
// 일반 객체처럼 사용하기
// 키 설정하기
localStorage.test = 2;
// 키 얻기
alert( localStorage.test ); // 2
// 키 삭제하기
delete localStorage.test;
그러나 하위 호환성 때문에 위와 같은 방법이 지원되기는 하지만, length,toString 등의 내장 메서드를 키로 사용할 수 있기 때문에 추천하지 않는다. 이는 getItem,setItem은 정상적으로 작동하더라도 일반 객체처럼 다룰 때 아래처럼 TypeError가 발생할 수 있다.
// 오류 예시
let key = 'length';
localStorage[key] = 5; // TypeError: Cannot assign to read only property 'length'...
sessionStorage는 데이터를 웹 브라우저에 저장하나, 웹 브라우저를 종료할 때 데이터가 삭제된다.
sessionStorage는 현재 떠 있는 탭 내에서만 유지된다.
sessionStorage는 회원 가입 도중 새로고침을 해도 입력한 정보가 남아있도록 하는 등의 예시가 있다.
sessionStorage와 localStorage는 동일한 문법을 사용한다.
sessionStorage.setItem("key", "value");
이때 주의점은 sessionStorage 또한 문자열만 지원한다.
let data = sessionStorage.getItem("key");
sessionStorage.removeItem("key");
sessionStorage.clear();
위에서 sessionStorage를 사용하는 예시로 회원가입과 같이 브라우저를 새로고침해도 내용이 유지되는 경우가 있었다. 이런 경우에 사용하는 예제는
// 텍스트 필드 가져오기
let field = document.getElementById("field");
// 자동 저장 값이 있는지 확인
// (페이지를 새로 고침한 경우에 해당)
if (sessionStorage.getItem("autosave")) {
// 텍스트 필드 내용 복원 (get)
field.value = sessionStorage.getItem("autosave");
}
// 변경 사항 불러오기
field.addEventListener("change", () => {
// sessionStorage에 결과 저장 (set)
sessionStorage.setItem("autosave", field.value);
});
- 두 개 모두 데이터를 웹 브라우저 상에 저장한다.
- 각 데이터 항목은 키(key)와 값(value) 쌍으로 저장되어 있다.
- 자바스크립트 API가 동일한 형태이다 .
- 서버로 데이터가 전송되지 않는다.
(이는 밑에 설명할 cookie와의 차이점이다)- 데이터 만료 기간을 설정할 수 없으며, 영구적으로 데이터가 저장되기 때문에 삭제를 위해서는 직접 삭제해야 한다.
(이것도 밑에 설명할 cookie와의 차이점이다)
- localStorage는 브라우저를 닫아도 데이터가 유지되나, sessionStorage는 브라우저를 닫을 때 데이터를 삭제한다.
즉, 데이터가 어떤 범위 내에서 얼마나 오래 보존되느냐가 가장 큰 차이점이다.- localStorage와 달리 sessionStorage는 브라우저끼리 공유가 불가능하다.
쿠키는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각으로, 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다.
간단하게 말해서, 만료 기간이 있는 클라이언트 단에 저장하는 작은 텍스트 파일이다.
쿠키는 스토리지 객체와 다르게 라이프타임을 정의할 수 있다.
영속적인 쿠키 설정 예시
Set-Cookie: id=a3fWa; Expires=Wed, 11 Apr 2024 07:28:00 GMT+9;

localStorage만 사용해보고 sessionStorage는 사용해 본 경험이 없어서 잘 몰랐는데, 이번 기회에 어떨 때 사용하는지/사용법을 배우게 되었다. 또한 localStorage를 사용할 때 guest를 사용했기 때문에 removeItem를 사용할 필요가 없었는데, remove가 필요한 이유를 생각하며 localStorage가 데이터 만료 기간을 설정할 수 없다는 것을 다시 생각하게 되었다.
이렇게 비슷한 개념들을 공부할 때는 차이점이 무엇인지 확실히 알고 넘어가는 게 중요한 것 같다,,,, 앞으로 이론 공부 열심히 해야지
참고한 문서
mdn localStorage
mdn sesstionStorage
mdn cookie
javascript info
loginradius blog