WebSocket 핸드쉐이킹과 스프링 시큐리티 리다이렉트 문제 해결
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

WebSocket 핸드쉐이킹과 스프링 시큐리티 리다이렉트 문제

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • *Spring Security와 WebSocket을 사용하는 백엔드 개발자**
  • *난이도:** 중급 (Spring Security 인증 흐름과 WebSocket 핸드쉐이킹 이해 필요)

핵심 요약

  • 세션 만료 후 재로그인 시 WebSocket 핸드쉐이킹 경로로 리다이렉트 되는 문제 발생
  • HttpSessionRequestCache가 인증 실패 요청을 캐싱하여 리다이렉트 경로 오류 유발
  • isAlwaysUseDefaultTargetUrl(true) 설정으로 문제 해결

섹션별 세부 요약

1. 문제 발생 컨텍스트

  • 프론트엔드: React + sockjs-client, stompjs 사용
  • 백엔드: Spring Boot + spring-boot-starter-websocket, spring-boot-starter-security
  • 인증 방식: MS AAD OAuth2 클라이언트 인증

2. 문제 발생 원인

  • 세션 만료 후 WebSocket 연결 시 인증 예외 발생
  • ExceptionTranslationFilterHttpSessionRequestCache를 통해 요청 정보 캐싱
  • 재로그인 성공 시 SavedRequestAwareAuthenticationSuccessHandler가 캐싱된 요청 경로로 리다이렉트

3. 해결 방법

  • defaultSuccessUrl("경로", true) 설정으로 isAlwaysUseDefaultTargetUrl 플래그 활성화
  • isAlwaysUseDefaultTargetUrl(true) 시 캐싱된 요청 무시하고 지정 URL로 리다이렉트
  • WebSocket 핸드쉐이킹 경로("/ws")와 서비스 경로 분리 필요

결론

  • Spring Security 설정에서 isAlwaysUseDefaultTargetUrl(true) 활성화하여 인증 후 리다이렉트 경로 제어
  • WebSocket 연결 시 세션 만료 처리 로직 추가로 재연결 시 인증 상태 확인 필요
  • HttpSessionRequestCache의 캐싱 동작을 이해하고, 인증 흐름과 WebSocket 핸드쉐이킹 경로 분리