SecurityConfiguration의 configure 차이 비교

ollie·2023년 9월 15일
1

배경 🐈

프로젝트를 하던 중에 인증 필터가 적용되지 않아야 하는 url에 필터 적용이 되는 문제가 발생하였습니다. 이 문제를 해결하기 위해 열심히 삽질 하다가 WebSecurity을 파라미터로 받는 configure와 HttpSecurity를 파라미터로 받는 configure의 차이에 대해 알게 되었습니다.


문제 원인 🐞

삽질을 열심히 하다가 이 블로그를 보고 문제의 원인을 알게 되었습니다.

인증 필터를 지나지 않아도 되는 url에 대한 설정을 WebSecurity를 파라미터로 받는 configure가 아닌 HttpSecurity를 파라미터로 받는 configure에 넣어놓았습니다.


configure(WebSecurity web)과 configure(HttpSecurity http) 차이

공식문서를 확인해보면 두 configure의 차이를 확인할 수 있습니다.

configure(WebSecurity web)

  • 주로 필터가 특정 url 패턴에 적용되지 않도록 설정하는 데 사용

configure(HttpSecurity http)

  • 주로 웹 애플리케이션 보안 설정 정의하는 데 사용
    • 이때하는 보안 설정은 사용자 역할별 접근 url 관리, csrf 설정과 로그인 페이지에 대한 관리
    • 특정 url이 Filter를 통과하는 것에 대한 관리는 맡지 않습니다.
  • 인증된 사용자가 어떤 url에 접근할 수 있는지 결정
    • role별 사용할 수 있는 url을 관리하는 데 사용
  • csrf 설정 관리에 사용
  • 로그인 페이지에 대한 관리
    • 로그인 페이지에 대한 url 설정이 가능하고, 성공과 실패 시 이동하는 url을 설정하는 것이 가능
  	@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를 파라미터로 사용하는 두 메서드의 역할을 달라지지 않을 것입니다.

다른 분들은 두 역할의 차이를 알고 이런 실수를 저지르지 않길 바라는 마음입니다... 🙏

profile
생각하는 개발자가 되겠습니다 💡

0개의 댓글