문제 상황
Spring Boot에서 OAuth2 소셜 로그인을 구현하던 중, 세션이 만료된 상태에서 로그인을 시도하면 계속해서 알 수 없는 에러가 나는 것을 확인하였습니다. nginx 로그를 통해 원인을 분석한 결과 JSESSIONID가 URL에 노출되는 문제 때문에 oauth2 로그인 과정이 거절 되었다는 것을 알 수 있었습니다.
문제가 발생했던 Oauth2 URL
https://example.com/oauth2/authorization/kakao;jsessionid=6A536F40C07B383860906AB325E68945
위 url의 끝에 jsessionid가 붙어있는것을 확인할 수 있고 이러한 URL rewriting은 보안상 취약점이 될 수 있으며, oauth2 url에 불필요한 jsessionid가 붙어 oauth2 로그인이 실패할 수 있습니다.
원인 분석
Spring Boot의 기본 설정에서는 세션 추적 모드가 명시적으로 설정되어 있지 않아, 세션이 만료된 경우 위와 같이 url 뒤에 jsessionid를 붙여 URL rewriting 방식을 사용할 수 있습니다. 이는 쿠키를 지원하지 않는 클라이언트를 위한 레거시 지원 기능이지만, 현대 웹/앱 환경에서는 불필요합니다.
해결 방법
1. application.yml 설정 수정
다음과 같이 application.yml 파일을 수정하여 세션 관리 설정을 변경합니다:
server:
servlet:
session:
tracking-modes: cookie
이 설정은 세션 추적 모드를 쿠키로만 제한합니다. 이를 통해 불필요한 URL rewriting을 막을 수 있습니다.
테스트 방법
1. 세션 만료 후 URL 확인
@GetMapping("/test/redirect")
public String testRedirect(HttpSession session) {
session.invalidate(); // 세션 만료
return "redirect:/after-redirect";
}
2. 리다이렉트 URL 모니터링
@GetMapping("/after-redirect")
public void afterRedirect(HttpServletRequest request) {
log.info("리다이렉트 URL: {}", request.getRequestURL());
log.info("쿼리스트링: {}", request.getQueryString());
}
결과
- JSESSIONID가 URL에 노출되지 않습니다.
- 세션은 쿠키로만 관리됩니다.
- OAuth2 로그인 프로세스가 안정적으로 동작합니다.
'Spring-Boot' 카테고리의 다른 글
스프링부트 CloudWatch, API 성공, 실패, 소요시간을 모니터링해 보자 (1) | 2024.10.29 |
---|---|
Spring 테스트에서 @Transactional과 비관적 락 사용 시 주의점 (2) | 2024.10.14 |
redis로 채팅 메시지 다룰 때 이스케이프 조심해야 되는 이유 (1) | 2024.09.08 |
스프링부트 filter에서 발생한 예외를 핸들링 해보자 (1) | 2024.08.30 |
스프링부트 JPA 모범 사례 - @ManyToMany 연관관계를 효과적으로 구성하는 방법 (0) | 2024.08.23 |