Backend/Http+Servlet

서버에서 클라이언트 Cookie 셋팅하기

findmypiece 2021. 3. 29. 11:57
728x90

HTTP 프로토콜은 기본적으로 Stateless 하다.

하지만 경우에 따라 클라이언트의 상태를 기억해야 할 수 있고 이때 Cookie가 활용된다.

 

Cookie는 기본적으로 클라이언트에 저장되는 정보이기 때문에

javascript로 아래와 같이 간단하게 생성할 수 있다.

document.cookie = "test01=test01";
document.cookie = "test02=test02";

console.log(document.cookie);
//test01=test01; test02=test02

 

이렇게 생성한 Cookie는 크롬브라우저 개발자 도구에서 아래와 같이 확인할 수 있고

 

Request에 자동으로 포함되어 서버단에서는 아래와 같이 확인할 수 있다.

@GetMapping("/hello")
public String hello(HttpServletRequest request, HttpServletResponse response){

  // request.getCookies() == Cookie 객체 배열 리턴
  for (Cookie cookie : request.getCookies()) {
    System.out.println(cookie.getName());
    System.out.println(cookie.getValue());
  }
  
  // request.getHeader("Cookie") == Cookie 문자열 리턴(test01=test01; test02=test02;)
  System.out.println(request.getHeader("Cookie"));
  
  return "Hello Example!!!";
}

 

그런데 이런 Cookie를 클라이언트가 아니라 서버단에서 특정 로직에 의해 생성하고 싶은 경우가 있다.

서버에서 Cookie를 생성하는 방법은 아래와 같이 두 가지가 있다.

@GetMapping("/hello")
public String hello(HttpServletRequest request, HttpServletResponse response){

  response.setHeader("Set-Cookie", "test02=test02");
  
  Cookie c = new Cookie("test01", "test01");
  response.addCookie(c);

  return "Hello Example!!!";
}

 

참고로 Set-Cookie를 response.addCookie 보다 아래에서 수행할 경우

response.addCookie 로 추가한 쿠키는 제거된다.

Set-Cookie 로 쿠키 자체를 새로 생성하기 때문..

 

이처럼 서버쪽에서 셋팅하는 쿠키는 기본적으로 javascript 에서

document.cookie 로 접근이 가능하기 때문에 XSS 공격에 취약하다는 단점이 존재한다.

이에 인증과 같은 관련된 민감한 정보의 경우 javascript에서 접근이나 변조가 불가능하도록 설정할 수 있다.

쿠키 생성시 아래와 같이 HttpOnly 옵션을 주면 된다.

@GetMapping("/hello")
public String hello(HttpServletRequest request, HttpServletResponse response){

  Cookie c = new Cookie("test01", "test01");
  response.addCookie(c);

  response.setHeader("Set-Cookie", "test02=test02; HttpOnly");

  return "Hello Example!!!";
}

 

이렇게 되면 브라우저 개발자 도구로 확인하면 Cookies 에서 확인되지만

javascript 상에서 document.cookie로는 접근이 불가능하게 된다.

728x90

'Backend > Http+Servlet' 카테고리의 다른 글

URL 에 포함된 한글 파라미터 처리  (0) 2021.11.17
한글 인코딩과 new String, getBytes  (0) 2021.07.16
Contents-Type, Accept  (0) 2021.04.20
JSESSIONID  (0) 2021.03.29
response.sendRedirect 에 대한 오해  (2) 2021.03.16