본문 바로가기

더 나은 엔지니어가 되기 위해/지금은 안쓰는 자바

[부스트코스 웹 프로그래밍] 쿠키와 세션

부스트코스 웹 프로그래밍 BE 영상을 보며 공부한 것을 간단히 정리한다.

1. 쿠키와 세션

개념

  • 쿠키
    • 사용자 컴퓨터에 저장
    • 저장된 정보를 다른 사람이나 시스템이 볼 수 있음
    • 유효기간이 지나면 사라짐
  • 세션
    • 서버에 저장
    • 서버가 종료되거나 유효기간이 지나면 사라짐

동작 과정

1) 쿠키

출처 : https://www.edwith.org/boostcourse-web/lecture/16799/

2) 세션

출처 : https://www.edwith.org/boostcourse-web/lecture/16799/

구현

1) 쿠키

쿠키는 javax.servlet.http.Cookie 에 (키, 값) 형태로 구현되어 있다.

// 서버에서 쿠키 생성
Cookie cookie = new Cookie(키, 값);

// 클라이언트가 보낸 쿠키 읽기 (방법 1)
Cookie[] cookies = request.getCookies();
if(cookies != null) {
  for(Cookie cookie : cookies) {
    if("key".equals(cookie.getName())) {
      find = true;
      value = cookie.getValue();
    }
  }
}

// 클라이언트가 보낸 쿠키 읽기 (방법 2, Spring MVC)
@CookieValue(value="key", defaultValue="1", required=true) String value

// 쿠키 삭제 요청(0) 혹은 유지 기간 설정. 초 단위.
cookie.setMaxAge(0);

// 경로 이하에 모두 쿠키 적용. 
cookie.setPath("/");

// 응답에 쿠키 넣어주기
response.addCookie(cookie);

예를 들어, 다음과 같이 사용이 가능하다.

@GetMapping(path="/list")
public String list(...
  @CookieValue(value="count", defaultValue="0", required=true) String value,
  HttpServletResponse response) {

  // 쿠키가 있는 경우, 없는 경우 처리
  try {
    int i = Integer.parseInt(value);
    value = Integer.toString(++i);
  } catch (Exception e) {
    value = "1";
  }

  // 쿠키 갱신하여 Response 에 추가
  Cookie cookie = new Cookie("count", value);
  cookie.setMaxAge(60*60*24*365); // 1년으로 설정
  cookie.setPath("/");
  response.addCookie(cookie);

  ...
}

2) 세션

세션은 javax.servlet.http.HttpSession 에 (키, 값) 형태의 오브젝트로 구현되어 있다.
즉, 쿠키는 단일 키와 값(String)만 담는 반면, 세션은 여러 키로 여러 개의 값(Object)을 담을 수 있음.

// 세션 생성 및 얻기 (방법 1)
// 1) 서버에 생성된 세션이 있다면 세션을 반환하고 없다면 새롭게 세션을 생성하여 반환
HttpSession session = request.getSession(); 
// 2) 이미 생성된 세션이 있다면 반환하고 없으면 null을 반환
HttpSession session = request.getSession(false);

// 세션 생성 및 얻기(방법 2, Spring MVC)
@SessionAttribute("user") User user

// 세션에 데이터 저장, 삭제
session.setAttribute(키, 값);
session.removeAttribute(키, 값);

// 세션 내 데이터 읽기
String value = (String) session.getAttribute("id"); // 반환 값은 Object 유형

세션 유지 시간은 web.xml 파일에서 설정해야함.
따로 설정하지 않을 경우, 기본 값은 30분임.

<session-config>
  <session-timeout>30</session-timeout>
</session-config>

예를 들어 다음과 같이 사용이 가능하다.

@GetMapping("/guess")
public String guess(...
                    HttpSession session) {

  session.setAttribute("count", 0);
  session.setAttribute("randomNumber", (int)(Math.random()*100)+1);

  ...

  int count = (Integer)session.getAttribute("count");
  int randomNumber = (Integer)session.getAttribute("randomNumber");

  ...
}

한편, Spring @SessionAttribute 어노테이션을 사용한 예는 다음과 같다.

@GetMapping("/info")
public String userInfo(@SessionAttribute("user") User user) {
  ...
  return "user";
}