공부/Spring

[스프링]Spring Security - SecurityFilterChain

Dr.thousand 2023. 11. 22. 15:14
728x90

스프링 필터 아키텍처


  • 필터는 무엇인가
  • 스프링 필터의 이해
  • 스프링 시큐리티의 이해

필터는 무엇인가

필터는 클라이언트의 요청을 수행하기 전 공통으로 거치는 검사이다.
클라이언트가 응용프로그램에 요청을 보내면, 톰캣 서블릿 컨테이너에서 요청을 받는다. 
요청은 서블릿 컨테이너의 필터를 거치고 서블릿을 통해 요청이 수행된다.

서블릿 컨테이너 구조 - [출처 https://mossgreen.github.io/Servlet-Containers-and-Spring-Framework/]

 

스프링 필터의 이해

스프링은 기존 필터에 위임 필터 프록시를통해 커스텀 필터를 적용할 수 있다.
오른쪽 이미지와 같이 필터를 Bean으로 등록하면 필터를 등록할 수 있다.

톰캣 필터 아키텍처 - [출처 Spring Security docs]

스프링 시큐리티의 이해

스프링에서는 위임 필터 프록시(Delegating Filter Proxy)를 통해 필터를 추가할 수 있다.
스프링 시큐리티는 위임 필터 프록시에서 시큐리티 필터 체인을 통해 인증을 할 수 있도록한다.

스프링 필터 체인 프록시 아키텍처 - [출처 Spring Security docs]


스프링 시큐리티 필터체인 적용

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
            .csrf(AbstractHttpConfigurer::disable)
            .cors(cors-> cors.configurationSource(corsConfigurationSource()))
            .authorizeHttpRequests(req ->
                    req.requestMatchers(WHITE_LIST_URL)
                            .permitAll()
                            .anyRequest().hasRole("USER")
            )
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authenticationProvider(authenticationProvider)
            .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
            .logout(logout ->
                    logout.logoutUrl("/api/v1/auth/logout")
                            .addLogoutHandler(logoutHandler)
                            .logoutSuccessHandler((request, response, authentication) -> SecurityContextHolder.clearContext())
            )
    ;
    return http.build();
}

해당 체인의 구성에서 설정은 다음과 같다.

CSRF : 해당 프로젝트는 REST API용 이기떄문에 CSRF 설정을 굳이 하지 않았다.

CORS(Cross-Origin-Resource-Sharing) : 설정은 별도 설정으로 빼두었다.

AuthorizeHttpRequests : WHITE_LIST_URL에 담긴 주소는 별도 권한 검사없이 허용하도록 설정해두고, 나머지 권한에 대해서는 USER권한이 있는지 체크하도록 설정했다.

728x90
반응형

'공부 > Spring' 카테고리의 다른 글

[QueryDSL] QueuryDSL vs JPQL  (0) 2023.12.18
[스프링] AuditorAware  (1) 2023.11.22
[Spring] ControllerAdvice  (0) 2022.09.27
BeanFatory와 ApplicationContext  (0) 2022.03.06
스프링 IoC , DI  (0) 2022.03.03