- Cookie
- 브라우저에 저장되는 작은 문자열
- HTTP 프로토콜의 일부
- 가장 오래된 저장 방법
- 쿠키 추가하기
document.cookie = `key = value`
- 이전 쿠키를 덮어쓰는게 아니라 새로 추가 됨
- 읽어오기
document.cookie
로 접근- ;로 구분된 문자열이 넘어옴
- 쿠키 유효기간 넣기
- `document.cookie =
~; expires=GMT 시간;
- expires 말고
max-age
- 유효기간이 없으면 브라우저를 닫을 때 쿠키가 삭제 됨
- 주의사항
- HTTP 요청시 헤더에 쿠키가 같이 나가기 때문에, 쿠키 사이즈가 커지면 HTTP 요청 크기가 커지는 것 ⇒ 사이즈에 제한
- 여러 보안 취약점이 있음
Local Storage
- key, value 기반으로 로컬에 데이터 저장
- 도메인 기반으로 storage가 생성
- 같은 도메인이면, 같은 탭일 때 storage가 공유
- 명시적으로 삭제하지 않는다면, 삭제되지 않음
- 값을 넣는 법
- localstorage.key =
- localstorage[key] =
- localstorage.setItem(key, value)
- 제일 권장하는 방법!
- 위에 1,2 방법은 사용자가 localStorage의 내장 함수들나 length, toString 등과 동일한 이름으로 key를 설정해서 덮어 씌우는 실수를 범할 수 있음
- key, value 모두 문자열로 취급
- 위의 이유로, 객체를 값으로 넣고 싶다면 JSON.stringify(str)로 넣고, 꺼내서 쓸 땐 JSON.parse로 파싱해서 가져옴
- 만약 객체를 그냥 setItem 했다면, 객체를 toString한 값이 저장됨
- 불러오기 : ~.getItem(key)
- 삭제 : removeItem(key)
- 전체 삭제 : clear()
Session Storage
- 전체적으로 로컬 스토리지와 같음
- 차이점 하나 ⇒ 브라우저를 닫으면 저장된 내용 초기화
앞서 만든 todoList에 localStorage를 적용해서, 새로고침에도 데이터 보존하게 하기!
⇒ form에서 submit할 때 setItem 코드 추가!
- 상태 배열을 JSON.stringify를 이용해 JSON 문자열로 변환해서 값으로 넣기
- JSON : JavaScript Object Notation, 데이터를 나타내는 범용 포맷 (문자열 형태)
- JSON.parse() : JSON 문자열 → Javascript 객체로 변환
- JSON.stringify() : JavaScript 객체 → JSON 문자열로 변환
- 직렬화 : 특정 언어의 내장 타입의 데이터를 문자열로 변환하는 과정(외부에 데이터를 전송하기 용이하기 위함)
- 값으로 올 수 있는 객체, 배열, 숫자, 문자열, 불리언, 널을 생긴 것 그대로 문자열로 변환되는 것..(변수 등은 값으로 변환)
- 값으로 없는 것은 무시됨
⇒ 투두를 추가할 때, LocalStorage에도 저장하도록 수정
-App.js
new TodoForm({ $target, onSubmit : (text) => { list.setState( [ ...list.state, { text } ] ) localStorage.setItem('todos', JSON.stringify(list.state)); //로컬 스토리지에도 추가! } }); const list = new TodoList({ ...
⇒ 초기화 배열 data를 삭제하고, localStorage에서 꺼내게 함
-main.js
const initialState = JSON.parse(localStorage.getItem('todos')) || [] //코드 추가 const $app = document.querySelector('.app'); new App({$target : $app}, initialState);
- 외부 툴(ex. 크롬 개발자도구)을 이용해 json을 임의로 조작해서 에러가 난다면?
⇒ 이를 대비하기 위해 로컬 스토리지의 getItem 함수를 커스텀한다.
⇒ 에러가 발생하면 기본 값을 주도록!
- 또한 localStorage는 메모리 제한이 있는데, 캐싱을 잘못 설계하면 용량이 제한을 벗어나서 에러 발생
⇒ setItem을 에러 처리하도록 커스텀 한다.
const storage = (function(storage) { const setItem = (key,value) => { try { storage.setItem(key, value) } catch(e) { console.log(e.message) } } const getItem = (key,defaultValue) => { try { const storedValue = storage.getItem(key) if (storedValue) { return JSON.parse(storedValue) // 여기서 value가 따옴표 안붙인 string이 오면 오류, 숫자는 통과 // JSON의 값으로 올 수 있는 type은 객체, 배열, 숫자, 문자열, boolean, null이기 때문 } } catch(e) { console.log(e.message) return defaultValue } } } )(window.localStorage)
- LocalStorage에 stringify 하지 않고 배열을 저장하면 []없이 문자열 형태로 저장된다.
- ex) setItem([a,b,c]) ⇒ getItem 하면 : ‘a,b,c’ (이중 배열 모두)
- 돔객체는 JSON.parse 가 아닌 DOM Parser 이용 ⇒ 참고
- chrome 개발자 도구 > application 에서 localStorage 값을 확인할 수 있다.