사이드 프로젝트를 진행하면서 Spring Security를 설정 중 Controller의 로그인 페이지가 무한 리다이렉션 오류를 발생시켰습니다. 처음 겪었던 문제이기에 원인을 찾는데 많은 삽질을 한 것 같습니다.
Spring Boot가 3.x로 올라가면서 Spring Security도 함께 바뀌었고 이전 방식과 조금 달라진 감이 있습니다. 저는 Spring Security 6.1 버전을 사용하였습니다.
Spring Security 설정은 다음과 같습니다.
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.httpBasic(AbstractHttpConfigurer::disable)
.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configure(http))
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(httpSecuritySessionManagementConfigurer -> httpSecuritySessionManagementConfigurer
.sessionCreationPolicy(STATELESS))
.authorizeHttpRequests((authorize -> authorize
.requestMatchers("/token/**").permitAll()
.requestMatchers("/", "/css/**", "/images/**", "/js/**", "/favicon.ico", "/h2-console/**").permitAll()
.anyRequest().authenticated())) // 그 외의 모든 요청은 인증 필요
.oauth2Login(login -> login
.loginPage("/login")
.defaultSuccessUrl("/")
.userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint
.userService(customOAuth2UserService)))
.build();
return http.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class).build();
}
문제의 원인은 requestMatchers()를 통해 요청이 허용된 것 이외 모든 요청은 권한이 필요하다고 설정했기 때문입니다.
anyRequest().authenticated() 밑에 loginPage("login")가 설정되어 있습니다.
이러한 원인은 "/login" 페이지를 로그인으로 사용하려고 하고 있으며, 권한이 필요한데 권한이 없어 반복적으로 리다이렉션이 된 것입니다.
"/login" 페이지를 사용
권한 확인 -> 권한 없음
"/login" 페이지를 사용
권한 확인 -> 권한 없음
"/login" 페이지를 사용
권한 확인 -> 권한 없음
이러한 이유로 loginPage("/login") 뒤에 permitAll을 붙여주면 해결됩니다.
// .loginPage("/login")
.loginPage("/login").permitAll()
해당 경험을 통해 요청에 대한 인증 설정을 좀 더 생각하고 설정해야겠다는 깨달음을 얻었습니다...
'Project > Trouble Shooting' 카테고리의 다른 글
Invalid bean definition with name 'jpaAuditingHandler'... (0) | 2024.08.19 |
---|---|
warning: unknown enum constant When.MAYBE (0) | 2024.08.18 |