
내일배움캠프 22일차 TIL : Spring - Cookie
Cookie는 클라이언트에 저장될 목적으로 생성된 작은 정보를 담는 파일
Cookie는 HTTP 기록서의 일종으로 User가 어떠한 웹 사이트를 방문할 경우 사이트가 사용하고 있는 서버를 통해 User의 컴퓨터에 설치되는 작은 기록 정보 파일을 일컫는다.
https://ychcom.tistory.com/entry/%EC%BF%A0%ED%82%A4Cookie%EB%9E%80
Cookie는 보안적으로 중요하지 않아도 되면서, 서버에서 클라이언트의 정보를 트래킹하고 싶은 경우 사용된다.
Cookie의 정보는 HTTP Header에 노출되므로 비밀번호와 같은 중요정보는 담으면 안된다.
쿠키는 Key : Value 형태의 데이터이다.
- Client가 서버로 요청을 보낸다.
- 서버에서 request header에 Cookie key의 Value를 확인한다.
- 데이터가 있으면 해당 서버에서 설정한 Cookie가 있는지 확인한다.
3-1. 설정한 Cookie가 없다면 ResponseHeader의 set-cookie key의 value로 Cookie를 발급한다.
3-2. 해당 Cookie를 사용한다.- Client(Browser)에서 응답을 받았을 때, set-Cookie가 있다면 로컬 쿠키 저장소로 저장한다.
쿠키의 생성 방법은
- Cookie cookie = new Cookie()처럼 메서드를 사용해 쿠키를 생성한다.
- Cookie 생성 시 Key, Value를 넣어준다.
- Cookie의 유효시간 (Expires or Max-age)를 지정한다.(권장)
- 유효 시간까지 정해준 쿠키를 HttpServletResponse 객체인 response에 addCookie를 통해 쿠키를 태워서 전송
위의 과정을 코드로 보도록 하겠다. 저번과 같이 코드 주석으로 표현
public class AuthController {
public static final String AUTHORIZATION_HEADER = "Authorization";
@GetMapping("/create-cookie")
public String createCookie(HttpServletResponse res) {
// 0. api를 통해 Cookie 생성하는 부분을 호출한다.
// 여기서 "Cookie Auth"가 Cookie의 value가 된다.
addCookie("Cookie Auth", res);
return "createCookie";
}
...
public static void addCookie(String cookieValue, HttpServletResponse res) {
try {
cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20"); // Cookie Value 에는 공백이 불가능해서 encoding 진행
// 1. Cookie를 생성한다.
// 2. 차례대로 Key, Value값이 들어간다.
Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue); // Name-Value
// 2-1. 경로를 지정해준다. -> localhost:8080/
cookie.setPath("/");
// 3. setMaxAge를 통해 쿠키의 유효 시간을 설정한다.
cookie.setMaxAge(30 * 60);
// 4. Response 객체에 Cookie 추가
// HttpServletResponse 객체에 쿠키를 태워서 전송한다.
res.addCookie(cookie);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage());
}
}
}
쿠키를 생성했으니 쿠키를 확인해봐야겠다. 확인하는 방법은 다음과 같다.
(순차적인 느낌보다는 종류의 1, 2)
- 쿠키를 넣었다면 다음 요청부터는 넣어준 쿠키가 자동으로 넘어온다.
- @CookieValue 어노테이션을 이용해 쿠키 값을 받아올 수 있다.
2-1. @CookieValue 어노테이션에 required 속성이 존재한다.
required = true로 지정하면 쿠키가 존재하지 않을 경우 예외가 발생한다.
@RestController
@RequestMapping("/api")
public class AuthController {
public static final String AUTHORIZATION_HEADER = "Authorization";
...
@GetMapping("/get-cookie")
// Cookie의 Key가 AUTHORIZATION_HEADER 인 쿠키를 찾아 value를 가져온다.
public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
System.out.println("value = " + value);
return "getCookie : " + value;
}
...
// 2-1. 해당 쿠키가 없는 경우에도 메소드가 호출된다.
// 따라서 쿠키의 값이 없을 때에도 value 매개변수는 null이 아닌 빈 문자열로 초기화한다.
public String getCookie(@CookieValue(value = AUTHORIZATION_HEADER, required = false) String value) {
}
참고
- https://developer-hm.tistory.com/19
- https://binux.tistory.com/84
- https://goodwoong.tistory.com/125
- https://chb2005.tistory.com/174
마지막 블로그는 쿠키를 통한 로그인도 있으니 추천!
원래 Session이랑 JWT까지 하려했는데....
심지어 HttpServletRequest를 이용해서 쿠키를 가져오는 방식이 하나 더 있긴한데 이건...