프로젝트를 진행하면서
사용자가 로그인하면 서버에서는 refreshToken을 쿠키에 발급하는데
서버에서는 이 쿠키 정보를 불러오지 못하는 문제가 발생하였다.
내가 쿠키에 저장하기 위한 코드는 아래와 같으며
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 값이 리턴되는 것을 알 수 있다.
이 문제는 처음 쿠키에 저장할 때 설정을 잘못하여 생긴 문제인 것을 알게되었다.
SameSite 속성값을 None 에서 Lax 로 수정한 후 디버깅하였더니 제대로 값을 불러오는 것을 알 수 있다.
cookie.setAttribute("SameSite", "Lax");
여기서 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에서 외부 사이트로 요청을 보낼 때, 쿠키가 전송된다.
'SpringBoot > 오류 해결' 카테고리의 다른 글
[OAuth2] 카카오 로그인페이지가 출력되지 않는 문제 (0) | 2025.02.21 |
---|---|
[JWT] vue.js에서 응답헤더의 Authorization 받는 법(undefined 문제) (0) | 2025.01.08 |