@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private final JwtAuthenticationFilter jwtAuthenticationFilter;
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("logout","/refreshToken","/js/**","/css/**","/error");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
csrf().disable()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler())
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/login", "/join","/logout")
.permitAll()
.antMatchers(HttpMethod.POST, "/signup")
.permitAll()
.anyRequest().authenticated()
.and()
.logout()
.addLogoutHandler(customLogoutHandler)
.and()
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
}
위처럼 web.ignoring().antMatchers(...) 을 사용하면 security filter chain을 거치지 않는다고 알고 있었다.
그런데 /refreshToken으로 접근할 경우 내가 만들어놓은 security filter를 제외하지 않는 문제가 발생했다.
찾아본 결과, 내가 만든 custom filter를 bean으로 등록한 게 문제였다.
web.ignoring().antMatchers(...)는 파라미터로 전달하는 패턴에 대해 security filter chain을 생략하도록 하는데, custom filter를 빈으로 등록하게 되면 해당 필터가 security filter chain에 포함되는 게 아니라 default filter chain에 포함되게 되기 때문에 해당 패턴에 접근하게 됐을 때 그대로 필터를 적용하게 되는 것이다.
필터를 빈으로 등록해 주던 것을 아래처럼 바꿔주면 된다.
.addFilterBefore(new JwtAuthenticationFilter(refreshTokenService,jwtTokenProvider), UsernamePasswordAuthenticationFilter.class);
정말 감사합니다. 4시간 동안 헤맸는데 덕분에 해결됐습니다.
시간 벌어주셔서 정말 감사합니다 🤣🤣