트러블슈팅

[JWT] 서버에서 쿠키로부터 refreshToken 값을 불러오지 못하는 문제

공부 기록장 2025. 1. 24. 19:44

프로젝트를 진행하면서 

사용자가 로그인하면 서버에서는 refreshToken을 쿠키에 발급하는데

서버에서는 이 쿠키 정보를 불러오지 못하는 문제가 발생하였다.

개발자도구(F12)를 통해 쿠키 정보를 확인할 수 있다.

 

 

 

 

내가 쿠키에 저장하기 위한 코드는 아래와 같으며

private void setRefreshTokenCookie(HttpServletResponse response, String refreshToken){
        Cookie cookie = new Cookie("refreshToken", refreshToken);

        cookie.setHttpOnly(true);      //js 에서 쿠키에 접근할 수 없도록 함(xss 공격 방지)
        cookie.setSecure(false);       //https 연결에서만 쿠키 전송 true -> https, false -> http
        cookie.setPath("/");           //쿠키가 적용될 경로
        cookie.setMaxAge(60*60*24*30); //쿠키 유효 기간(30일)
        cookie.setAttribute("SameSite", "None"); //Strict 외부사이트에서 요청할 경우 쿠키를 전송하지 않도록 설정 (CSRF 공격 방지)

        response.addCookie(cookie);
    }

 

 

 

 

서버에서 쿠키로부터 refreshToken 값을 가져오기 위한 코드는 아래와 같은데 이 때 값이 있는데에도 불구하고 null 값이 리턴되는 것을 알 수 있다.

Cookie 값이 null로 리턴됨

 

 

 

 

이 문제는 처음 쿠키에 저장할 때 설정을 잘못하여 생긴 문제인 것을 알게되었다.

SameSite 속성값을 None 에서 Lax 로 수정한 후 디버깅하였더니 제대로 값을 불러오는 것을 알 수 있다.

cookie.setAttribute("SameSite", "Lax");

 

cookie 값이 제대로 리턴됨

 

 

 

 

 

 

 

여기서 SameSite 는 쿠키가 외부 사이트에서 오는 요청에 대해 어떻게 처리할지 결정하는 속성으로

주로 CSRF 공격 방지에 사용된다고 하며 None, Strict, Lax 세 가지 값이 있다고 한다.

 

 

Strict

설명 : 가장 제한적인 설정으로 같은 사이트에서 발생한 요청에 대해서만 쿠키가 전송된다.

 

예시 : 사용자가 example.com에서 로그인한 상태에서, 다른 사이트인 another-site.com에서 example.com으로 요청을 보낼 때, 쿠키는 전송되지 않는다.

 

Lax

설명 : 덜 제한적인 설정으로 안전한 메서드(ex GET, HEAD)로 이루어진 외부 사이트의 요청에 대해서는 쿠키를 전송하고

위험한 메서드( ex Post, Put 등)에는 쿠키를 전송하지 않는다.

 

예시 : 사용자가 example.com에서 로그인하고, 다른 사이트인 another-site.com에서 example.com으로 링크를 클릭해서 이동하는 경우, 쿠키가 전송된다. 그러나 외부 사이트에서 example.com에 POST 요청을 보낼 때는 쿠키가 전송되지 않는다.

 

None

설명 : 가장 자유로운 설정으로 외부 사이트에서 오는 모든 요청에 대해 쿠키를 전송한다.

이 때  SameSite = None 으로 설정하려면 Secure = true로 설정해야하며 HTTPS 에서만 쿠키가 전송된다.

 

예시 : 사용자가 외부 사이트에서 로그인하고, 그 인증 상태를 유지하기 위해 example.com에서 외부 사이트로 요청을 보낼 때, 쿠키가 전송된다.