sparta-incubating / rchive-back

2 stars 0 forks source link

HOTFIX: 리프레시토큰 set-cookie 오류 #165

Closed jiisuniui closed 3 weeks ago

jiisuniui commented 1 month ago

작업사항

설명

jiisuniui commented 1 month ago

문제1

이 Set-Cookie 헤더는 속성을 지정하지 않았습니다.
속성을 지정하지 않았으며 기본값은
"SameSite=Lax"로 기본 설정되어 있으며 최상위 탐색에 대한 응답이 아닌 교차 사이트 응답에서 왔기 때문에 차단되었습니다.
설정 쿠키는 다음과 같이 설정되어야 했습니다.
"SameSite=None"으로 설정해야 교차 사이트 사용을 활성화할 수 있습니다.

image image

해결1

기존 코드

Cookie cookie = new Cookie(REFRESH_TOKEN_HEADER, refreshToken);

cookie.setMaxAge(24*60*60);
cookie.setSecure(true);
cookie.setPath("/");
cookie.setHttpOnly(true);

response.addCookie(jwtUtil.addRefreshTokenToCookie(refreshToken));

바뀐 코드

ResponseCookie cookie = ResponseCookie.from(REFRESH_TOKEN_HEADER, refreshToken)
                .path("/")
                .sameSite("None")
                .httpOnly(true)
                .secure(true)
                //.maxAge(maxAge)
                .build();

response.addHeader("Set-Cookie", jwtUtil.addRefreshTokenToCookie(refreshToken).toString());

문제2

Cookie[] cookies = req.getCookies();

if (cookies != null) {
            System.out.println("yes cookieeeeeeeee");
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("Refresh")) {
                    refreshToken = cookie.getValue();
                }
            }
} else {
            System.out.println("no cookieeeeeeeee");
}

cookie가 null이 받아짐

해결2

response.addHeader("Set-Cookie", ...)를 사용하여 쿠키를 설정했을 때, 클라이언트 측에서 해당 쿠키가 제대로 전송되지 않아 req.getCookies()에서 가져올 수 없는 문제는 여러 가지 원인으로 발생할 수 있습니다. req.getCookies()가 예상한 대로 쿠키를 반환하지 않는 이유를 이해하고, 문제를 해결하기 위해 다음의 점들을 확인해야 합니다.

req.getCookies()null을 반환할 수 있는지

  1. 쿠키 설정 문제: 클라이언트가 서버로 쿠키를 전송할 때, 올바른 Set-Cookie 헤더가 사용되지 않았을 수 있습니다.
  2. SameSite 속성 문제: SameSite=None 속성을 사용할 때는 반드시 Secure 속성이 true로 설정되어 있어야 합니다. 이 조건이 맞지 않으면 브라우저에서 쿠키를 무시할 수 있습니다.
  3. 경로(Path) 문제: 쿠키의 경로 설정이 잘못되었을 경우, 해당 경로에 대한 요청에서만 쿠키가 전송됩니다.
  4. 쿠키 도메인 문제: 도메인이 올바르게 설정되지 않으면 클라이언트가 서버로 쿠키를 전송하지 않습니다.
  5. HTTP 및 HTTPS 문제: Secure 속성이 설정된 경우, 쿠키는 HTTPS 연결에서만 전송됩니다.