클라이언트의 Cookie Storage에 Key-Value 형태로 저장되는 자료구조를 뜻한다.
서버에서 클라이언트에게 응답을 줄 때 Set-Cookie Header에 담아서 전달하게 되면, 브라우저는 Cookie Storage에 저장하게 된다.
저장된 쿠키는 클라이언트가 요청을 할 때마다 저장 되어있는 모든 쿠키들(최대 300개)을 Cookie Header에 담아서 보내게 된다.
서버는 요청 헤더에 쿠키가 있다면, 그 쿠키에 접근하여 그에 맞는 처리를 진행할 수 있다.
서버에서 쿠키를 보낼때 만료 시간을 입력할 수 있으며, 만료 시간을 어떻게 지정하냐에 따라 영속 쿠키와 세션 쿠키로 나뉘게 된다.
package jakarta.servlet.http;
public class Cookie implements Cloneable, Serializable {
public Cookie(String name, String value) { ... }
// 도메인 설정
public void setDomain(String pattern) { ... }
// 유효 기간 설정 (s)
public void setMaxAge(int expiry) { ... }
// 유효 경로 설정
public void setPath(String uri) { ... }
// 보안 여부 설정
public void setSecure(boolean flag) { ... }
// 자바스크립트 접근 여부 설정
public void setHttpOnly(boolean httpOnly) { ... }
// 값 변경
public void setValue(String newValue) { ... }
// 키-값 변경
public void setAttribute(String name, String value) { ... }
}
Spring에서는 Cookie 클래스를 통해 쿠키를 생성할 수 있도록 지원한다.
-1
/auth/login
에서 쿠키를 전송했다면 /auth
가 전송된다.false
false
Cookie cookie = new Cookie("Cookie Key", "Cookie Value");
response.addCookie(cookie);
HttpServletResponse의 addCookie 메서드를 통해 클라이언트에게 전달할 수 있다.
Cookie[] cookies = request.getCookies();
if (cookies != null) {
Optional<String> cookieValue = Arrays.stream(cookies)
.filter(cookie -> cookie.getName().equals("memberId"))
.map(Cookie::getValue)
.findFirst();
}
쿠키를 가져오기 위해선 위의 과정을 거치면 가져올 수 있는데, 위의 방법은 뭔가 불편하다.
그래서 Spring은 애노테이션을 통해 쿠키를 가져올 수 있도록 지원한다.
@GetMapping("/cookie")
public String getCookie(
@CookieValue(
value = "myCookie",
required = false
) String cookieValue
) {
log.info("cookieValue: {}", cookieValue);
return "ok";
}
컨트롤러의 Argument에 @CookieValue 애노테이션을 붙임으로써 특정 쿠키의 값을 가져올 수 있다.
name
, value
required
true
로 설정했는데 값이 없는 경우, MissingRequestCookieException
을 발생시킨다.false
로 설정했는데 값이 없는 경우, cookieValue에 null
이 입력된다.true