HTTP는 서버와 클라이언트가 데이터를 주고받기 위한 프로토콜이다.
웹 서비스라면 사용자를 식별해서 무언가를 해야할텐데(맞춤 추천, 장바구니 유지 등)
HTTP는 stateless 프로토콜이기 때문에, 사용자를 식별하거나 임시 데이터를 저장하기 위해서는 상태관리가 필요하다.
HTTP의 stateless는 무슨 의미일까?
- 통신이 끝나면 상태를 유지하지 않는 특징.
- 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다.
비교 | Session Storage | Local Storage |
---|---|---|
파기일 | 세션이 끝날 때 파기 | 지우지 않으면 영구 보관 |
범위 | 세션(동일 탭) | 도메인 |
보안 | 여전히 보안 이슈 있음 | 여전히 보안 이슈 있음 |
사용 | 일회성 로그인 | 민감하지 않은 데이터 |
Local Storage는 디스크에 저장되기 때문에 웹 브라우저가 종료되더라도 디스크에 데이터가 남아 있게 된다. 데이터를 지우도록 프로그램을 개발 했다고 하더라도 웹 브라우저가 비정상적으로 종료되는 경우 데이터가 삭제되지 않을 수 있기 때문에 보안적으로 문제가 되는 데이터의 저장시 보안 이슈를 해결할 수 있는 대책을 마련하지 않고는 사용해서는 안된다.
많은 참고자료에서 공통적으로 하는 말이 있다. Cookie도 보안 이슈가 있는데, Web Storage도 여전히 보안이 좋지 않다고 한다.
결론적으로 민감한 데이터는 암호화를 해서 저장해야하며, Local Storage만 쓸게 아니라, 탭 내에서만 사용할 수 있는 Session Storage를 적절히 사용하는 것이 좋을 것 같다.
// Local Storage에서 userData로 저장된 정보를 가져온다.
JSON.parse(localStorage.getItem('userData'));
// Local Storage의 userData라는 이름으로(key)
// updatedData를 저장한다.(value)
const updatedData = {[id: 1, name: 'jelly'], [id: 2, name: 'brown']};
localStorage.setItem('userData', JSON.stringify(updatedData));
key
name : value
yujin토큰
, 이름
key
productId : value
[ 355, 211, 393, 2, 50 ]조회 이력
key
data : value
[ { id: 1, name: 'yujin' }, { id: 2, name: 'coffee' } ]상품 정보 + a 기록 필요시
HTTP 완벽 가이드, "클라이언트 식별과 쿠기", 305p
HTTP & Network Basic, "쿠키를 사용한 상태관리", 58p
"쿠키와 세션", https://devuna.tistory.com/23
MDN, "Web Storage API", https://developer.mozilla.org/ko/docs/Web/API/Web_Storage_API
웹 스퀘어, "HTML5 Web Storage", https://inswave.com/confluence/pages/viewpage.action?pageId=9667510
"Web Storage!", https://kamang-it.tistory.com/entry/Web%EC%A1%B0%EA%B8%88-%EB%8D%94-%EC%9E%90%EC%84%B8%ED%9E%88cookie%EB%8A%94-%EB%84%88%EB%AC%B4-%EA%B5%AC%EC%8B%9D%EC%95%84%EB%83%90-%EC%9D%B4%EC%A0%9C%EB%B6%80%ED%84%B4-Web-Storage