프로젝트를 하던 중에 인증 필터가 적용되지 않아야 하는 url에 필터 적용이 되는 문제가 발생하였습니다. 이 문제를 해결하기 위해 열심히 삽질 하다가 WebSecurity을 파라미터로 받는 configure와 HttpSecurity를 파라미터로 받는 configure의 차이에 대해 알게 되었습니다.
삽질을 열심히 하다가 이 블로그를 보고 문제의 원인을 알게 되었습니다.
인증 필터를 지나지 않아도 되는 url에 대한 설정을 WebSecurity를 파라미터로 받는 configure가 아닌 HttpSecurity를 파라미터로 받는 configure에 넣어놓았습니다.
공식문서를 확인해보면 두 configure의 차이를 확인할 수 있습니다.
@Override
public void configure(WebSecurity web) {
web.ignoring()
.antMatchers(
"/error"
);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(jwtAuthenticationEntryPoint)
.accessDeniedHandler(jwtAccessDeniedHandler)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/home", "/login", "/signup").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.and()
.apply(new JwtSecurityConfig(tokenProvider));
}
파라미터가 WebSecurity인 configure에 filter 생략할 url을 추가해주었습니다.
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
@Override
public void configure(WebSecurity web) {
web.ignoring()
.antMatchers(
"/home", "/login", "/signup"
);
}
}
인증을 시작할 때 SpringSecurity 구조에 대해서 확실히 이해하기 위해 공부에 꽤 많은 시간을 쏟았다고 생각했는데, 공부가 부족했다는 것을 느끼게 되면서 반성을 많이 했습니다. 다음부터는 각 클래스와 메서드의 역할에 대해 명확하게 공부하고 넘어가야겠다고 다짐하는 계기가 되었습니다.
Spring Security에서 WebSecurityConfigurerAdapter의 deprecated 결정을 했습니다. 이에 따라 SecurityConfiguration은 WebSecurityConfigurerAdapter를 상속받고 두 configure을 오버라이드 받아서 사용하는 방식에서 SecurityFilterChain을 반환하는 filterChain을 생성해 빈 등록하여 사용하는 방식으로 구현 방법이 바뀌게 되었습니다. 그렇지만 WebSecurity와 HttpSecurity를 파라미터로 사용하는 두 메서드의 역할을 달라지지 않을 것입니다.
다른 분들은 두 역할의 차이를 알고 이런 실수를 저지르지 않길 바라는 마음입니다... 🙏