[Spring] 쿠키와 세션

thingzoo·2023년 6월 27일
1

Spring

목록 보기
34/54
post-thumbnail

쿠키와 세션 모두 HTTP에 상태 정보를 유지(Stateful)하기 위해 사용된다. 즉, 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 된다.

쿠키(Cookie)

클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일

  • 특정 호스트에서 생성된 쿠키는 이후 모든 요청마다 서버로 전송됨
  • 요청 해더의 set-cookie 속성에 정보를 담을 수 있음
  • 쿠키에 담긴 데이터는 브라우저에서 관리됨

  • 개발자도구 > Application > Storage > Cookies에서 확인 가능
  • 이름, 값, 도메인, 경로, 만료 날짜 로 구성

세션(Session)

서버와 클라이언트의 연결이 활성화된 상태

  • 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
  • 서버에서 클라이언트 별로 유일무이한 '세션 ID' 를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
  • 서버에서 생성한 '세션 ID' 는 클라이언트의 쿠키값('세션 쿠키' 라고 부름)으로 저장되어 클라이언트 식별에 사용

쿠키 vs 세션

항목쿠키세션
설명클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일서버와 클라이언트의 연결이 활성화된 상태
저장 위치클라이언트 (웹 브라우저)웹 서버
예시사이트 팝업 "오늘 다시보지 않기" 정보 저장로그인 정보 저장
만료 시점쿠키 저장시 만료일시 설정 가능
(브라우져 종료시도 유지 가능)
다음 조건 중 하나가 만족될 경우 만료됨
1. 브라우져 종료 시까지
2. 클라이언트 로그아웃 시까지
3. 서버에 설정한 유지기간까지 해당 클라이언트의 재요청이 없는 경우
용량 제한브라우저 별로 다름 (크롬 기준)
- 하나의 도메인 당 180개
- 하나의 쿠키 당 4KB(=4096byte)
개수 제한 없음
(단, 세션 저장소 크기 이상 저장 불가능)
보안취약
(클라이언트에서 쿠키 정보를 쉽게 변경, 삭제 및 가로채기 당할 수 있음)
비교적 안전
(서버에 저장되기 때문에 상대적으로 안전)

쿠키 다루기

스프링에서는 Cookie 클래스를 제공해준다.

쿠키 생성

public static void addCookie(String cookieValue, HttpServletResponse res) {
    try {
        cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20"); // Cookie Value에는 공백이 불가능해서 encoding 진행

        Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue); // Name-Value
        cookie.setPath("/");
        cookie.setMaxAge(30 * 60);

        // Response 객체에 Cookie 추가
        res.addCookie(cookie);
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e.getMessage());
    }
}
  • new Cookie(AUTHORIZATION_HEADER, cookieValue);
    • Cookie에 저장될 Name과 Value를 생성자로 받는 Cookie 객체를 생성
  • setPath("/"), setMaxAge(30 * 60)
    • Path와 만료시간 지정
  • res.addCookie(cookid)
    • HttpServletResponse 객체에 생성한 Cookie 객체를 추가하여 브라우저로 반환
    • 이렇게 반환된 Cookie는 브라우저의 Cookie 저장소에 저장됨
  • Cookie 생성은 범용적으로 사용될 수 있기 때문에 static 메서드로 선언

쿠키 읽기

@GetMapping("/get-cookie")
public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
    System.out.println("value = " + value);

    return "getCookie : " + value;
}
  • @CookieValue("Cookie의 Name")
    • Cookie의 Name 정보를 전달해주면 해당 정보를 토대로 Cookie의 Value를 가져옴

세션 다루기

스프링에서는 Servlet에서 유일무이한 '세션 ID'를 간편하게 만들수 있는 HttpSession을 제공한다.

HttpSession 생성

@GetMapping("/create-session")
public String createSession(HttpServletRequest req) {
    // 세션이 존재할 경우 세션 반환, 없을 경우 새로운 세션을 생성한 후 반환
    HttpSession session = req.getSession(true);

    // 세션에 저장될 정보 Name - Value 를 추가합니다.
    session.setAttribute(AUTHORIZATION_HEADER, "Robbie Auth");

    return "createSession";
}
  • HttpServletRequest를 사용하여 세션을 생성 및 반환
  • req.getSession(true)
    • 세션이 존재할 경우 세션을 반환하고 없을 경우 새로운 세션을 생성
  • 세션에 저장할 정보를 Name-Value 형식으로 추가
  • 반환된 세션은 브라우저 Cookie 저장소에 ‘JSESSIONID’라는 Name으로 Value에 저장

HttpSession 읽기

@GetMapping("/get-session")
public String getSession(HttpServletRequest req) {
    // 세션이 존재할 경우 세션 반환, 없을 경우 null 반환
    HttpSession session = req.getSession(false);

    String value = (String) session.getAttribute(AUTHORIZATION_HEADER); // 가져온 세션에 저장된 Value 를 Name 을 사용하여 가져옵니다.
    System.out.println("value = " + value);

    return "getSession : " + value;
}
  • req.getSession(false)
    • 세션이 존재할 경우 세션을 반환하고 없을 경우 null을 반환
  • session.getAttribute(”세션에 저장된 정보 Name”)
    • Name을 사용하여 세션에 저장된 Value를 가져옴
profile
공부한 내용은 바로바로 기록하자!

0개의 댓글