RefreshToken은 유효기간이 긴 만큼, 클라이언트 단에서 안전하게 보관하는 것이 중요하다. 따라서, 이번 프로젝트에서, 서버에서 Refresh Token을 쿠키에 보관하도록 지정해서 수 있는 장소를 쿠키로 지정하기로 했다.
서버가 어떤 데이터를 브라우저 측에 저장한 후, 다시 그 데이터를 받아오는 기술. 또는 그 데이터 자체를 뜻한다.
Token을 쿠키에 http only 옵션와 secure 옵션을 true로 한다면, HTTPS에서만 접근이 가능하고 JS로 토큰에 접근을 하지 못하기 때문에 XSS, CSRF 위험으로 부터 방어를 할 수 있다.
실제로, Local storage와 Session storage에서 보관하는 것은 설정도 쉽고 편하지만, JS로 쉽게 접근할 수 있기 때문에 지양하는 것이 좋다.
Set-Cookie: sessionId=abc123;
Domain
속성을 사용하면 특정 도메인과 해당 서브도메인에서 쿠키를 사용할 수 있다.Set-Cookie: userId=123; Domain=example.com;
example.com
및 sub.example.com
에서 쿠키 접근 가능.another.com
에서는 접근 불가.Set-Cookie: cart=xyz; Path=/shop;
/shop
과 /shop/details
에서만 쿠키 전송/home
에서는 쿠키 전송 불가Set-Cookie: token=abc; Expires=Wed, 29 Nov 2024 12:00:00 GMT;
Expires
와 비슷하지만 상대적인 시간을 지정한다.Set-Cookie: token=abc; Max-Age=3600;
Max-Age
가 설정된 경우 Expires
보다 우선 적용Set-Cookie: token=ab; Secure;
Set-Cookie: token=ab; HttpOnly;
Strict
: 동일한 사이트 내에서만 쿠키 전송. 크로스사이트 요청에는 쿠키가 포함되지 않음.Lax
: 안전한 요청(GET, POST 등)에서는 크로스사이트 쿠키 전송 허용.None
: 모든 요청에서 쿠키 전송(단, Secure
속성 필요).Set-Cookie: token=ab; SameSite=Strict;
Set-Cookie: sessionId=abc123;
Domain=example.com;
Path=/;
Expires=Wed, 29 Nov 2024 12:00:00 GMT;
Secure;
HttpOnly;
SameSite=Strict;
sessionId
: 쿠키 이름과 값Domain
: example.com
및 서브도메인에서 쿠키 접근 가능Path
: 모든 경로(/
)에서 유효Expires
: 2024년 11월 29일에 만료Secure
: HTTPS에서만 쿠키 전송HttpOnly
: JavaScript에서 접근 불가SameSite
: 동일한 사이트 요청에서만 쿠키 전송 옵션 @PostMapping("/login")
public ResponseEntity<ApiResult<AccessToken>> login(@RequestBody LoginRequest.Login login) {
UserTokens tokens = authService.login(login.email(), login.password());
AccessToken accessToken = AccessToken.of(tokens.getAccessToken());
ResponseCookie cookie = ResponseCookie.from("refresh-token", tokens.getRefreshToken())
.maxAge(COOKIE_AGE_SECONDS)
.secure(true)
.httpOnly(true)
.sameSite("None")
.path("/")
.build();
return ResponseEntity.ok()
.header(SET_COOKIE, cookie.toString())
.body(ApiResult.success(ApiResponseMessages.LOGIN_SUCCESS, accessToken));
}
HttpCookie
를 클라이언트에 전송하려면 HttpServletResponse
객체를 사용해야 한다 @GetMapping("/set-cookie")
public String setCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("exampleKey", "exampleValue");
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
cookie.setMaxAge(3600);
response.addCookie(cookie);
return "Cookie has been set";
현업에서는 어떻게 구현하는가?
⇒ 결론 : 다양하게 쓴다고…