본문 바로가기
Spring-Boot

스프링부트 JSESSIONID URL 노출 문제 해결하기 feat.Oauth2

by 준형코딩 2024. 10. 29.

문제 상황

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 로그인 프로세스가 안정적으로 동작합니다.