본문 바로가기

코드잇 부스트

쿠키, 세션, 스토리지, 로컬 스토리지 이해하기

쿠키

  • 쿠키의 특징로그인을 한 뒤 서버에서는 response로 쿠키 값을 보내주고 이는 자동으로 클라이언트에 기록된다.
  • 서버에서 설정해둔 기간 동안은 쿠키로 사용자를 인지하여 로그인 상태를 유지할 수 있다.
  • 쿠키 사용법
    • 서버에서 set-cookie 헤더를 리스폰스로 보내주면 웹 브라우저는 알아서 쿠키 값을 저장해 둔다.
    • 리퀘스트를 보낼 때 주소에 해당하는 쿠키가 저장되어 있다면 웹 브라우저가 알아서 쿠키를 보내준다.
    • 권장되지 않지만 자바스크립트에서도 쿠키를 생성, 참조, 수정할 수 있다.
      • 추가, 수정하기위 코드는 쿠키를 등록하고, 만약 기존에 session-id 라는 쿠키가 있다면 수정한다.
      • document.cookie = "session-id=1234; Domain=codeit.kr; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=2592000;";
      • 값 참조하기
        • document.cookie 값을 참조하면 모든 쿠키의 키와 값이 ; 문자로 구분된 문자열입니다.
        • split() 함수를 사용해서 직접 분리해서 사용하거나, 다양한 방법(스택오버플로우 링크)이 있다.
        • cookie 라는 NPM 패키지를 활용할 수도 있다.
      • 값 지우기
        document.cookie = "session-id; Max-Age: 0;";
        
        
      • Max-Age 값을 0으로 업데이트하면 (수명이 0) 쿠키가 지워진다.
  • 알아두면 좋은 Attribute Path
    • 설정: 쿠키를 보낼 경로를 지정
    • 예시: Path=/이면 /, /abc, /abc/xyz 경로에 요청 시 쿠키 전송
    HttpOnly
    • 기능: 쿠키를 자바스크립트로 접근할 수 없게 막음
    • 보안: 자바스크립트로 쿠키 탈취 방지, 민감 정보 보호
    Secure
    • 기능: HTTPS 요청 시에만 쿠키 전송
    • 참고: SameSite=None 설정 시 반드시 Secure도 함께 설정해야 함
    SameSite
    • 기능: 크로스 사이트 요청 위조(CSRF) 방지
    • :
      • Strict: 제3자 사이트에서의 모든 요청에 쿠키 전송 불가
      • Lax: 사용자가 링크 클릭 시 요청에 쿠키 전송 가능
      • None: 모든 경우에 쿠키 전송 가능 (반드시 Secure와 함께 사용)
    • 요약표:상황 SameSite=Strict SameSite=Lax SameSite=None
      다른 사이트에서 우리 사이트로 리퀘스트를 보낼 때 X X O
      다른 사이트에서 이미지 파일 등을 받을 때 X X O
      다른 사이트에서 사용자가 링크를 클릭해 우리 사이트로 이동할 때 X O O
      우리 사이트에서 우리 사이트로 리퀘스트를 보낼 때 O O O
    Expires와 Max-Age ⭐️
    • 기능: 쿠키의 수명을 지정
    • Expires: 만료 시기 지정
    • Max-Age: 수명 지정
    • 종류:
      • 세션 쿠키: 브라우저를 닫으면 지워짐 (Expires나 Max-Age를 지정하지 않음)
      • 영속적인 쿠키: 지정한 수명 후에 지워짐 (Expires나 Max-Age로 수명 지정)
  • Domain
  • 개인정보와 쿠키쿠키를 사용하는 경우 GDPR(일반 정보 보호 규정; General Data Protection Regulation) 규정에 따르면 개인정보 이용목적을 안내하고 사용자의 동의를 받는 등의 절차가 필요하다.
  • 최근 많은 사이트들이 처음 들어가면 팝업을 띄우고 동의를 받는다.
  • 구글, 페이스북 등 빅테크들이 쿠키를 사용해서 사용자의 정보를 과도하게 수집하고 자사 광고에 활용해 논란이된 적이 있다.
  • 참고자료HTTP 쿠키 - HTTP | MDN브라우저 쿠키와 SameSite 속성 / seob.devCross Site Request Forgery (CSRF) | OWASP Foundation
  • react-cookie 쉽게 사용하기
  • Set-Cookie - HTTP | MDN
  • 쿠키, 세션, 캐시가 뭔가요?

세션 스토리지와 로컬 스토리지

  • 세션 스토리지와 로컬 스토리지란?클라이언트에는 데이터를 저장해 놓고 사용하고 싶은 경우에 세션, 로컬 스토리지를 사용한다.
  • 쿠키는 서버에서 만들고 관리한다.
  • 세션 스토리지
    // 값을 참조해서 사용할 때
    const draftData = sessionStorage.getItem('draft');
    
    // 값 지우기
    sessionStorage.removeItem('draft');
    
    • 현재 탭에서만 유효.
    • 탭을 닫으면 데이터 삭제.
    • 다른 탭과 데이터는 공유되지 않음.
  • // 값을 저장하는 코드. (이미 값이 있다면) 수정하는 코드 const data = inputElement.value; sessionStorage.setItem('draft', data);
  • 로컬 스토리지
    // 사용자가 처음 접속했을 때
    const showSidebar = localStorage.getItem('show-sidebar') === 'true';
    
    // 값 지우기
    localStorage.removeItem('show-sidebar');
    
    • 해당 사이트에서 유효한 저장소.
    • 탭을 닫거나 브라우저를 닫아도 데이터가 유지.
    • 여러 탭 사이에서도 데이터가 공유.
  • // 사이드바 보이기 가리기 코드 정보를 참조 및 저장하는 코드 // 사용자가 사이드바 감추기 버튼을 클릭했을 때 값을 저장, 수정 localStorage.setItem('show-sidebar', 'false');
  • 쿠키와 세션/로컬 스토리지의 다른 점?
    • 클라이언트가 만들고 관리하는 데이터
    • 자바스크립트로 편리하게 조작할 수 있다
    • 만료 기간(수명)이 없다
    • 쿠키보다 사용할 수 있는 용량이 크다.
  • 스토리지가 변경되었을 때 처리하기스토리지가 변경되었을 때 'storage' 라는 이벤트가 발생함.
window.addEventListener("storage", 
	() => { 
	      // showSidebar 값 적용하기 
    	    const showSidebar = localStorage.getItem('show-sidebar') === 'true'; 
          });

활용사례

  • 쿠키
    1. 로그인 시 세션 ID를 쿠키로 보내주고 이를 통해 서버에서 회원 정보를 확인함
    2. 하루동안 팝업 다시 보지 않기 (로컬 스토리지로 구현할 경우? 참고자료)
    3. 장바구니 (로컬 스토리지로 구현할 경우? 예시)
  • 세션 스토리지, 로컬 스토리지
    1. 초안 저장: 텍스트 입력 도중 창을 닫아도 내용 유지 (https://stackedit.io/)
    2. 각종 웹 앱

'코드잇 부스트' 카테고리의 다른 글

리액트로 데이터 다루기  (0) 2024.08.05
React 웹 개발 시작하기  (0) 2024.07.13
자바스크립트 웹 개발 기본기  (1) 2024.07.13
메타 태그 이해하기  (0) 2024.07.13
인터랙티브 자바스크립트  (0) 2024.07.13