Spring Security 6.2.4 구조를 한번 확인해 보자.
https://docs.spring.io/spring-security/reference/servlet/architecture.html
Architecture :: Spring Security
The Security Filters are inserted into the FilterChainProxy with the SecurityFilterChain API. Those filters can be used for a number of different purposes, like authentication, authorization, exploit protection, and more. The filters are executed in a spec
docs.spring.io
기본은 하나의 요청이 발생하면 Servlet이 필터를 거쳐 Client에 응답을 주는 것이 기본이다.
하지만 하나 이상의 필터를 사용하기 위해서는 Servlet이 호출되지 않도록 처리하는 방법구현 후 일반적으로 HttpServletResponse를 별도로 작성하고 다른 방법으로는 다운스트림 필터 인스턴스와 Servlet에서 사용하는 HttpServletRequest 또는 HttpServletResponse를 수정하면 된다네요.
/* FilterChain Usage Example */
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// do something before the rest of the application
chain.doFilter(request, response); // invoke the rest of the application
// do something after the rest of the application
}
DelegatingFilterProxy는 ApplicationContext에서 Bean Filter0을 검색한 다음 Bean Filter0을 호출합니다. 다음 목록에는 DelegatingFilterProxy의 의사 코드가 나와 있다:
기본 구조는 구성을 나타내는 그림을 참고하는 것이 구조를 이해하기 쉬울 것 같다.
Multiple SecurityFilterChain 그림에서 FilterChainProxy는 사용할 SecurityFilterChain을 결정합니다. 일치하는 첫 번째 SecurityFilterChain만 호출됩니다. /api/messages/의 URL이 요청되면 먼저 /api/**의 SecurityFilterChain0 패턴과 일치하므로 SecurityFilterChainn에서도 일치하지만 SecurityFilterChain0만 호출됩니다. /messages/의 URL이 요청되면 /api/**의 SecurityFilterChain0 패턴과 일치하지 않으므로 FilterChainProxy는 각 SecurityFilterChain을 계속 시도합니다. 다른 SecurityFilterChain 인스턴스가 일치하지 않는다고 가정하면 SecurityFilterChainn이 호출됩니다.
SecurityFilterChain0에는 3개의 SecurityFilter 인스턴스만 구성되어 있습니다. 그러나 SecurityFilterChainn에는 4개의 SecurityFilter 인스턴스가 구성되어 있습니다. 각각의 SecurityFilterChain은 고유할 수 있고 분리되어 구성될 수 있다는 점에 유의해야 합니다. 실제로 응용 프로그램이 스프링 보안이 특정 요청을 무시하도록 하려면 SecurityFilterChain에 0개의 SecurityFilter 인스턴스가 있을 수 있습니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(Customizer.withDefaults())
.authorizeHttpRequests(authorize -> authorize
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults())
.formLogin(Customizer.withDefaults());
return http.build();
}
}
The above configuration will result in the following Filter ordering:
Filter : Added by
CsrfFilter : HttpSecurity#csrf
UsernamePasswordAuthenticationFilter : HttpSecurity#formLogin
BasicAuthenticationFilter : HttpSecurity#httpBasic
AuthorizationFilter : HttpSecurity#authorizeHttpRequests
First, the CsrfFilter is invoked to protect against CSRF attacks.
Second, the authentication filters are invoked to authenticate the request.
Third, the AuthorizationFilter is invoked to authorize the request.
첫째, CSRF 공격으로부터 보호하기 위해 CsrfFilter가 호출된다.( Cross Site Request Forgery )
둘째, 인증 필터는 요청을 인증하기 위해 호출됩니다.
셋째, AuthorizationFilter를 호출하여 요청을 승인합니다.
'프로그램 > Web' 카테고리의 다른 글
온라인강좌 사이트 만들기 2단계 분석(2024.07.13~) (0) | 2024.07.13 |
---|---|
온라인강좌 사이트 만들기 1단계 분석(2024.07.09~10) (0) | 2024.07.10 |
spring security 6.2.4 (2024.05) (0) | 2024.05.11 |
window에서 https 서비스 테스트(2023.08.09) (0) | 2023.08.09 |
vscode 에서 mvn 명령사용을 위한 설정(2023.08.09) (0) | 2023.08.09 |