쿠키와 세션이란?

금은체리·2023년 11월 15일
1

Spring

목록 보기
11/49

쿠키와 세션

  • 쿠키와 세션 모두 HTTP에 상태 정보를 유지(Stateful)하기 위해 사용됨
  • 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가 가능
  1. 쿠키
  • 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일
  • 구성요소
    • Name(이름): 쿠키를 구별하는 데 사용되는 키
      • 중복될 수 없음
    • Value(값): 쿠키의 값
    • Domain(도메인): 쿠키가 저장된 도메인
    • Path(경로): 쿠키가 사용되는 경로
    • Expires(만료기한): 쿠키의 만료기한
      • 만료기한 지나면 삭제됨
  1. 세션
  • 서버에 일정시간 동안 클라이언트 상태를 유지하기 위해 사용됨
  • 서버에서 클라이언트 별로 유일무이한 '세션ID'를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
  • 서버에서 생성한 '세션ID'는 클라이언트의 쿠키값('세션 쿠키'라고 부름)으로 저장되어 클라이언트 식별에 사용됨
  • 세션 동작 방식
  1. 클라이언트가 서버에 1번 요청
  2. 서버가 세션ID를 생성하고, 쿠키에 담아 응답 헤더에 전달
    • 세션 ID 형태: "SESSIONID = 12A345"
  3. 클라이언트가 쿠키에 세션ID를 저장('세션쿠키')
  4. 클라이언트가 서버에 2번 요청
    • 쿠키값(세션 ID) 포함하여 요청
  5. 서버가 세션 ID를 확인하고, 1번 요청과 같은 클라이언트임을 인지
쿠키세션
설명클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
저장 위치클라이언트
(웹 브라우저)
웹 서버
사용 예사이트 팝업의 "오늘 다시보지 않기" 정보 저장로그인 정보 저장
만료 시점쿠키 저장 시 만료일시 설정 가능
(브라우저 종료시도 유지 가능)
다음 조건 중 하나가 만족될 경우 만료됨
1. 브라우저 종료 시까지
2. 클라이언트 로그아웃 시 까지
3. 서버에 설정한 유지기간까지 해당 클라이언트의 재요청이 없는 경우
용량 제한브라우저 별로 다름(크롬 기준)
- 하나의 도메인 당 180개
- 하나의 쿠키 당 4KB(=4096byte)
개수 제한 없음
(단, 세션 저장소 크기 이상 저장 불가능)
보안취약
(클라이언트에서 쿠키 정보를 쉽게 변경, 삭제 및 가로채기 당할 수 있음)
비교적 안전
(서버에 저장되기 때문에 상대적으로 안전

쿠키 다루기

  • 쿠키 생성

    • URLEncoder.encode(encode 할 값, utf-8")
    • .replaceAll("\\+", "%20");
      • 공백을 이렇게 바꾸겠다!
      • Cookie Value에는 공백 불가능
    • new Cookie(Name 값, Value 값);
      • Cookie에 저장될 Name과 Value를 생성자로 받는 Cookie 객체 생성
    • setPath("/"), setMaxAge(30*60)
      • Path와 만료시간 설정
    • ServletResponse객체.addCookie(우리가 만든 쿠키)
      • HttpServletResponse 객체에 생성한 Cookie 객체를 추가하여 브라우저로 반환
      • 이렇게 반환된 Cookie는 브라우저의 Cookie 저장소에 저장됨
    • Cookie 생성은 범용적으로 사용될 수 있기 때문에 static 메서드로 선언
  • 쿠키 읽기

    • @CookieValue("Cookie의 Name")
      • Cookie의 Name 정보를 전달해주면 해당 정보를 토대로 Cookie의 Value를 가져옴
  • 실행 결과

    • 아래쪽에 Show URL-decoded를 누르면 원본 값을 볼 수 있음




세션 다루기

  • Servlet에서는 유일무이한 '세션ID'를 간편하게 만들수 있는 HttpSession을 제공 해줌
  • HttpSession 생성
    • HttpServletRequest를 사용하여 세션을 생성 및 반환 가능
      • Servlet에서 요청 들어왔을 때 Request 객체 만들어줌 ➡️ 파라미>터에 선언하면 받아 올 수 있음
    • req.getSession(true)
      • 세션이 존재할 경우 세션을 반환하고 없을 경우 새로운 세션을 생성
    • 세션에 저장할 정보를 Name-Value 형식으로 추가
    • 반환된 세션은 브라우저 Cookie 저장소에 'JESSIONID'라는 Name으로 Value에 저장됨

  • HttpSession 읽기
    • req.getSession(false)
      • 세션이 존재할 경우 세션을 반환하고 없을 경우 null 반환
    • session.getAttribute("세션에 저장된 정보 Name")
      * Name을 사용하여 세션에 저장된 Value를 가져옴

profile
전 체리 알러지가 있어요!

0개의 댓글