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 연결 시 인증 예외 발생
ExceptionTranslationFilter
가HttpSessionRequestCache
를 통해 요청 정보 캐싱- 재로그인 성공 시
SavedRequestAwareAuthenticationSuccessHandler
가 캐싱된 요청 경로로 리다이렉트
3. 해결 방법
defaultSuccessUrl("경로", true)
설정으로isAlwaysUseDefaultTargetUrl
플래그 활성화isAlwaysUseDefaultTargetUrl(true)
시 캐싱된 요청 무시하고 지정 URL로 리다이렉트- WebSocket 핸드쉐이킹 경로(
"/ws"
)와 서비스 경로 분리 필요
결론
- Spring Security 설정에서
isAlwaysUseDefaultTargetUrl(true)
활성화하여 인증 후 리다이렉트 경로 제어 - WebSocket 연결 시 세션 만료 처리 로직 추가로 재연결 시 인증 상태 확인 필요
HttpSessionRequestCache
의 캐싱 동작을 이해하고, 인증 흐름과 WebSocket 핸드쉐이킹 경로 분리