스프링부트에서 스프링 시큐리티를 이용해서 로그인 페이지를 구현하고 있었다. 시큐리티가 일반적으로 이동시키는 인증 화면이 아닌 개인이 구현한 로그인 페이지 구현을 위해서 아래와 같은 코드가 쓰였다.
@Configuration // IoC
public class SecurityConfig {
@Bean
SecurityFilterChain configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/auth/loginForm");
return http.build();
}
}
authorizeRequests() : 시큐리티 처리에 HttpServletRequest를 사용한다는 것을 의미
antMatchers("주소") : 지정한 주소에 대해 예외를 두어 설정
permitAll() : 앞에 지정한 주소를 모두에게 접근 허가
anyRequest().authenticated() : 다른 어떤 접근에도 보안 검사를 한다.
formLogin().loginPage("주소") : 로그인 페이지로 주소값으로 이동 설정
문제는 2023년 5월 기준으로 2개월 전의 코드를 보고 공부하고 있었는데도 최신 버전에서 사용할 수 없는 코드가 있었다.
configuration을 bean에 등록해서 필터로 설정을 만드는 과정이었는데, 최신 업데이트에서 .authorizeRequests()와 antMatchers() 더 이상 사용이 불가능했다.
수정된지 얼마 되지 않아서 구글링에서도 딱히 큰 정보가 나오지 않아 chatGPT에도 쳐보고 난리를 치고, 원문 업데이트 로그를 보면서 일단 수정을 했다.
@Configuration // IoC
public class SecurityConfig {
@Bean
SecurityFilterChain configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests()
.requestMatchers("/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/auth/loginForm");
return http.build();
}
}
업데이트 사항대로
authorizeRequest() => authorizeHttpRequests()로 수정
antMatchers() => requestMatchers()로 수정
이렇게 하였지만 화면에서 리디렉트가 과도하게 요청되었다는 오류만 떴다. 분명 /auth 주소 하위는 모두 permitAll()을 설정했음에도 권한이 없어 같은 로그인 주소로 재요청이 무한히 반복되다가 오류가 나는 상황이었다.
스프링시큐리티 6부터는 forward에도 기본으로 인증이 걸리게 설정되었다
해결방안
dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() 추가
@Configuration // IoC
public class SecurityConfig {
@Bean
SecurityFilterChain configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests()
.dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll()
.requestMatchers("/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/auth/loginForm");
return http.build();
}
}