먼저 HTTP 프로토콜의 문제점 주요 단점 중 하나를 알아야한다. HTTP 프로토콜은 stateless 프로토콜이다. 이는 서버가 클라이언트의 상태를 저장하지 않는다는 것이다.
가장 간단한 예시로 쇼핑몰 사이트에서 장바구니 기능을 만들어야한다고 해보자. 그러면 브라우저 메모리에 장바구니 목록을 저장해야하는데, 이런 경우 새로고침을 하면 목록이 사라져버린다. 로그인 기능도 마찬가지다. 로그인이 된 상태를 브라우저 메모리에 저장한다하면 새로고침시 로그인이 풀리고, 계속해서 새로 로그인해야한다.
이러한 HTTP의 stateless 특성 때문에 개발된 것이 스토리지와 쿠키다.
영구적이다. 따라서 오프라인 데이터를 저장하는데 유용하다.
그렇다. 브라우저 혹은 탭이 닫혀도 데이터가 유지된다.
모든 창에서 접근 가능하다.
5MB 또는 10MB를 최대로 저장 가능하다.
// 로컬 스토리지에 데이터 저장
localStorage.setItem("name", "John");
localStorage.setItem("age", "30");
// 로컬 스토리지에서 데이터 조회
const name = localStorage.getItem("name");
const age = localStorage.getItem("age");
console.log(name); // 출력: John
console.log(age); // 출력: 30
// 로컬 스토리지에서 데이터 삭제
localStorage.removeItem("age");
// 로컬 스토리지에서 모든 데이터 삭제
localStorage.clear();
브라우저 탭이 닫힐 경우 사라진다.
아니다. 만료 시간과 연결되어, 브라우저가 닫히거나 탭이 닫히는 경우 사라진다.
각 탭마다 독립적인 저장 공간을 제공해 동일 탭에서만 접근 가능하다.
5MB를 최대로 저장 가능하다.
// 세션 스토리지에 데이터 저장
sessionStorage.setItem("name", "John");
sessionStorage.setItem("age", "30");
// 세션 스토리지에서 데이터 조회
const name = sessionStorage.getItem("name");
const age = sessionStorage.getItem("age");
console.log(name); // 출력: John
console.log(age); // 출력: 30
// 세션 스토리지에서 데이터 삭제
sessionStorage.removeItem("age");
// 세션 스토리지에서 모든 데이터 삭제
sessionStorage.clear();
스토리지들과 다르게 서버에서 생성이 가능하다. 이때 Set-Cookie
헤더를 사용할 수 있는데,
수동으로 설정이 가능하다. 생산시 Expires
또는 Max-Age
옵션을 사용한다.
Expires
의 경우 만료 날짜를 설정하고, Max-Age
의 경우 몇 초 후에 만료될지를 설정한다.
만약 둘 다 설정한 경우, 브라우저는 Max-Age
값을 사용한다.
만료 시간을 설정한 경우, 만료 시간이 지나지 않으면 브라우저를 닫거나, 탭이 닫혀도 유지된다.
따라서 만료 시간에 종속적이다.
모든 창에서 접근 가능하다.
그렇다. 동일 출처 정책을 따르기 때문에 기본적으로 쿠키가 생성된 도메인에만 자동 전송된다. 다만, 요청에 credentials
설정을 해줘야 쿠키가 자동으로 전송된다.
// https://aaa.com 에서 요청
fetch('https://bbb.com/api', {
method: 'GET',
credentials: 'include' // 쿠키를 포함하여 요청
});
예외적으로 CORS 설정을 통해서 다른 도메인으로 쿠키가 포함된 요청을 보낼 수 있다. 이 경우 서버에서 Access-Control-Allow-Credentials
및 Access-Control-Allow-Origin
을 설정을 해주면 된다.
// http://bbb.com/api
Access-Control-Allow-Origin: https://aaa.com
Access-Control-Allow-Credentials: true
5KB를 최대로 저장 가능하다.
HttpOnly
속성을 사용하여 쿠키에 자바스크립트로 접근할 수 없도록 설정한다.HttpOnly
속성을 사용해 XSS공격을 방지한다.Secure
속성을 설정해 쿠키가 HTTPS 연결에만 전송되게한다. HTTPS 연결의 경우 세션 ID가 전송될때 암호화시킨다. SameSite
속성을 설정하여 쿠키가 다른 사이트에서 발생한 요청에 포함되지 않도록 할 수 있다. // 쿠키 설정
document.cookie = "name=John; expires=Thu, 1 Jan 2023 00:00:00 UTC; path=/";
// 쿠키 조회
const cookies = document.cookie.split("; ");
cookies.forEach(cookie => {
const [key, value] = cookie.split("=");
console.log(key, value);
});
// 쿠키 삭제(만료일을 과거로 설정한다.)
document.cookie = "name=; expires=Thu, 1 Jan 1970 00:00:00 UTC; path=/";
https://github.com/baeharam/Must-Know-About-Frontend/blob/main/Notes/html/web-storage-api.md
https://medium.com/@dimplekumari0228/describe-the-difference-between-a-cookie-sessionstorage-and-localstorage-e731a627acb1
https://dev.to/gaurbprajapati/cookies-vs-localstorage-vs-sessionstorage-4p6l
https://www.geeksforgeeks.org/difference-between-local-storage-session-storage-and-cookies/
https://velog.io/@jupiter-j/CSRF%ED%86%A0%ED%81%B0%EC%9D%B4%EB%9E%80