문제 상황
현재 상황은 다음과 같다.
FE : http://localhost:3000
BE : https:// ~~
FE에서 BE에 로그인 요청을 보내는 과정인데 다음과 같은 에러가 발생했다.
즉, OAuth2 로그인 과정 자체에서 실패해버리는 것.
과정은 다음과 같다.
1. server_domain/oauth2/authorization/kakao 접속
2. localhost:3000/api/auth/callback?code={code} 로 리디렉션
3. 해당 임시 코드를 가지고 서버에 Token 발급 API 호출
4. Response Body에 AT를, Set-cookie 헤더에 Refresh Token을 발급
쿠키 정책에서 문제가 생긴다.
쿠키를 응답에 추가하는 방식이 문제일 가능성
Cookie refreshTokenCookie = new Cookie("refreshToken", tokenResponse.refreshToken());
refreshTokenCookie.setHttpOnly(true);
refreshTokenCookie.setPath("/");
refreshTokenCookie.setMaxAge(336 * 3600);
response.addCookie(refreshTokenCookie);
이 방식은 SameSite 설정이 불가능해서, 크로스 도메인 요청일 때 브라우저가 쿠키를 무시할 수 있다.
→ Set-Cookie 자체를 브라우저가 아예 차단해버림.
해결 : Set-Cookie를 수동 헤더로 넣기
String cookieValue = String.format(
"refreshToken=%s; Path=/; Max-Age=%d; HttpOnly; Secure; SameSite=None",
tokenResponse.refreshToken(),
336 * 3600
);
response.addHeader("Set-Cookie", cookieValue);
이렇게 하면 브라우저가 Set-Cookie 헤더를 무시하지 않고 내려보낼 수 있어.
✅ Secure, SameSite=None은 반드시 세트로 써야 하고, Secure가 있다면 배포 환경에서 HTTPS여야 정상 동작한다.
<고려 사항> 서버 레벨(Nginx 등)에서 Set-Cookie 필터링 가능성
혹시 Nginx나 Spring Cloud Gateway 등 프록시 서버가 있으면, Set-Cookie를 삭제하거나 수정할 수 있어.
nginx.conf 예시로, 이런 거 있는지 확인해봐:
proxy_hide_header Set-Cookie;
이 설정이 있으면 백엔드가 보내더라도 Nginx가 헤더를 없애버림.
→ 이 경우, 해당 줄을 삭제하거나 주석 처리해줘야 한다.
'Back-end > Spring' 카테고리의 다른 글
[Spring] filter vs AOP vs Interceptor (0) | 2025.04.09 |
---|---|
[Spring] Docker-Compose를 활용한 CI / CD 구축 (1) | 2025.03.18 |
[Spring] com.auth0 vs jsonwebtoken.jjwt (1) | 2025.02.16 |
[Spring] JPA 벌크 연산이란? (0) | 2025.02.01 |
[Spring] Spring Batch를 활용한 배치 프로세싱 (2) | 2025.01.20 |