Spring Security를 로그인에 적용하던 중, 로그인을 성공하고 인증 객체가 제대로 생성이 되었음에도 302 상태 코드가 발생하여 다음 페이지로 넘어가지 않는 상황이 발생했다.
o.s.web.servlet.DispatcherServlet : Completed 302 FOUND
1. Spring SecurityContext 인증 정보 손실
SecurityContext의 인증 정보는 기본적으로 HttpSession을 사용하여 저장되지만, 현재 컨트롤러에서 명시적으로 SecurityContext에 인증 정보를 설정했다. 그러나 이 설정이 리다이렉트 이후 HTTP 요청에 반영되지 않아 문제가 발생했다.
2. 세션 인증과 Spring Security의 인증 상태 간 불일치
HttpSession에 사용자의 정보를 저장했지만, Spring Security가 이를 인식하지 못한다. 따라서 다음 요청에서 인증된 사용자로 간주되지 않았다.
SecurityContextPersistenceFilter 활성화 및 세션 관리 개선
SecurityContextPersistenceFilter는 SecurityContext를 자동으로 관리해준다. 이를 위해 Spring Security 설정과 HttpSession을 적절히 연동해야 한다.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.securityContext(securityContext -> securityContext
.securityContextRepository(new HttpSessionSecurityContextRepository())
);
return http.build();
}
SecurityContextHolder.getContext().setAuthentication(authentication);
302 상태 코드는 발생하지만 저장된 세션을 활용할 수 있게 되면서 리디렉션을 통해 정상적으로 다음 페이지가 로딩되었다. 다음 페이지는 200 status로 떨어진다.