🔗 참고링크
sessionStorage
https://ko.javascript.info/localstorage
https://velog.io/@ejchaid/localstorage-sessionstorage-cookie의-차이점
링크 학습 후 재 정리 한 것입니다.
HTML5에는 웹의 데이터를 클라이언트에 저장할 수 있는 새로운 자료구조인 웹 스토리지 객체(web storage object) 스펙이 포함되어 있다.
웹 스토리지 객체(web storage object)는 key/value 로 데이터를 저장하고 key를 기반으로 데이터를 조회하는 패턴이다.
웹 스토리지 객체(web storage object)인 localStorage
와 sessionStorage
는 브라우저 내에 키-값 쌍을 저장할 수 있게 해준다. localStorage
는 영구저장소, sessionStorage
는 임시저장소인데, 이 둘을 따로 두어 데이터의 지속성을 구분해서 응용 환경에 맞게 선택할 수 있다.
웹 스토리지 객체(web storage object)는 기존 웹 환경의 쿠키(Cookie)와 매우 유사한 개념이다. 쿠키의 단점을 극복하는 개선점이 도입되었다. 그러나 쿠키는 여전히 유효하고 꽤 적절한 클라이언트 저장 도구임이 틀림없기때문에 HTML5에서 스펙을 새로 추가했지만 쿠키를 배제한다는 의미는 아니다. 여전히 쿠키는 이용 가능하다.
쿠키를 사용하면 브라우저에 데이터를 저장할 수 있는데, 왜 또 다른 객체를 사용해 데이터를 저장하는 걸까?
웹 스토리지 객체(web storage object)는 데이터의 지속성과 관련하여 두 가지 용도의 저장소를 제공한다.
웹 스토리지 객체(web storage object)는 쿠키와 마찬가지로 사이트의 도메인 단위로 접근이 제한된다. A 도메인에서 저장한 데이터는 B 도메인에서 조회할 수 없다는 것이다. 이는 데이터 보안 측면에서 당연하다.
두 스토리지 객체는 동일한 메서드와 프로퍼티를 제공합니다.
setItem(key, value)
– 키-값 쌍을 보관한다.getItem(key)
– 키에 해당하는 값을 받아온다.removeItem(key)
– 키와 해당 값을 삭제한다.clear()
– 모든 것을 삭제한다.key(index)
– 인덱스(index
)에 해당하는 키를 받아온다.length
– 저장된 항목의 개수를 얻는다.localStorage
의 데이터는 만료되지 않는다.저장한 데이터를 명시적으로 지우지 않는 이상 영구적으로 보관이 가능하다.
도메인마다 별도로 localStorage가 생성된다.
Windows 전역 객체의 LocalStorage라는 컬렉션을 통해 저장과 조회가 이루어진다.
// LocalStorage.js
localStorage.setItem('test', 1);
// Main.jsx
alert(localStorage.getItem("test"));
💡 localStorage 저장 값 확인 하는 방법
개발자 도구 > Application > Lcal Storage
오리진(domain/port/protocol)만 같다면 url 경로는 달라도 동일한 결과를 볼 수 있다.
localStorage
는 동일한 오리진을 가진 모든 창에서 공유되기 때문이다. 따라서 한 창에 데이터를 설정하면 다른 창에서 변동 사항을 볼 수 있다.
localStorage
의 키를 얻거나 설정할 때, 아래처럼 일반 객체와 유사한 방법을 사용할 수 있다.
// 키 설정하기
localStorage.test = 2;
// 키 얻기
alert( localStorage.test ); // 2
// 키 삭제하기
delete localStorage.test;
이런 방법이 지원되긴 하지만 추천하지 않습니다.
1. 사용자는 length
나 toString
, localStorage
의 내장 메서드를 키로 설정할 수 있다. 이렇게 되면 getItem
, setItem
은 정상 작동해도, 일반 객체처럼 다룰 때 에러가 발생할 수 있다.
let key = 'length';
localStorage[key] = 5; // TypeError: Cannot assign to read only property 'length'...
localStorage는 key를 사용해 값을 얻고, 설정하고, 삭제할 수 있다.
키나 값 전체는 어떻게 얻을 수 있을까?
스토리지 객체는 반복 가능한 객체가 아니다. 대신 배열처럼 다루면 전체 key-value를 얻을 수 있다.
for(let i=0; i<localStorage.length; i++) {
let key = localStorage.key(i);
alert(`${key}: ${localStorage.getItem(key)}`);
}
일반 객체를 다룰 때처럼 for key in localStorage
반복문을 사용해도 전체 키-값을 얻을 수 있습니다.
하지만 이 방법을 사용하면 필요하지 않은 내장 필드까지 출력된다 (??? 이게 무슨 소리지)
// 좋지 않은 방법
for(let key in localStorage) {
alert(key); // getItem, setItem 같은 내장 필드까지 출력됩니다.
}
for key in localStorage
반복문을 사용하려면 hasOwnProperty
를 이용해 프로토타입????에서 상속받은 필드를 골라내야 한다.
for(let key in localStorage) {
if (!localStorage.hasOwnProperty(key)) {
continue; // setItem, getItem 등의 키를 건너뜁니다.
}
alert(`${key}: ${localStorage.getItem(key)}`);
}
아니면 아래처럼 Object.keys
로 '자기 자신’의 키를 받아온 다음 순회하는 방법을 사용할 수도 있다.
let keys = Object.keys(localStorage);
for(let key of keys) {
alert(`${key}: ${localStorage.getItem(key)}`);
}
Object.keys
는 해당 객체에서 정의한 키만 반환하고 프로토타입에서 상속받은 키는 무시하기 때문
숫자나 객체 등 다른 자료형을 사용하게 되면 문자열로 자동 변환된다.
localStorage.user = {name: "John"};
alert(localStorage.user); // [object Object]
JSON을 사용하면 객체처럼 쓸 수 있다.
localStorage.user = JSON.stringify({name: "John"});
let user = JSON.parse( localStorage.user );
alert( user.name ); // John
디버깅 등의 목적으로 스토리지 객체 전체를 문자열로 변환하는 것도 가능하다.
// 보기 좋도록 JSON.stringify에 서식 옵션을 추가했습니다.
alert( JSON.stringify(localStorage, null, 2) );
sessionStorage
의 데이터는 페이지 세션이 끝날 때 제거된다.sessionStorage.setItem('test', 1);
alert( sessionStorage.getItem('test') ); // 새로 고침 후: 1
페이지를 새로 고침 하면 데이터가 여전히 남아있는 것을 확인할 수 있다.
하지만 다른 탭에서 본 페이지를 열고 위 예시만 실행해보면 null이 반환된다. (???? 계속 있는데…?)
이렇게 sessionStorage는 오리진뿐만 아니라 브라우저 탭에도 종속되어 있다. 이런 제약 때문에 sesstionStorage는 잘 사용되지않는다.
웹 스토리지 객체(web storage object)의 보안은 서로 다른 도메인의 데이터 침범을 막고는 있지만 클라이언트, 즉 사용자를 막고 있지는 않다. 클라이언트는 얼마든지 저장된 값을 임의로 수정이 가능하다. 따라서 개발자는 사용자에 의한 임의 변경에 항상 예의 주시하고 방어 코드의 작성을 잊지 말아야한다.