ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠키, 세션, 스토리지, 로컬 스토리지 이해하기
    코드잇 부스트 2024. 7. 13. 16:13

    쿠키

    • 쿠키의 특징로그인을 한 뒤 서버에서는 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
    자바스크립트 웹 개발 기본기  (0) 2024.07.13
    메타 태그 이해하기  (0) 2024.07.13
    인터랙티브 자바스크립트  (0) 2024.07.13
Designed by Tistory.