본 글에 앞서, Spring Security는 큰 관점에서 인증
과 인가
로 나뉜다.
💡 인가란?사용자의 신원을 검증하는 프로세스. (ex : 로그인)
인증 이후의 프로세스. 사용자마다 특정 리소스 혹은 기능에 접근할 수 있는 권한이 다르므로, 해당 권한을 부여(허락)하는 것을 뜻한다.
거시적인 관점에서, Spring Security는 웹 요청을 가로챈(intercept) 후, 사용자에게 인증 절차를 밟게 한 이후, 적절한 권한이 있는지 확인한다.
https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-filterchainproxy
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
Filter delegateToUse = this.delegate;
if (delegateToUse == null) {
synchronized(this.delegateMonitor) {
delegateToUse = this.delegate;
if (delegateToUse == null) {
WebApplicationContext wac = this.findWebApplicationContext();
if (wac == null) {
throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?");
}
delegateToUse = this.initDelegate(wac);
}
this.delegate = delegateToUse;
}
}
this.invokeDelegate(delegateToUse, request, response, filterChain);
}
@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();
}
}
필터 실행 순서
Filter | Added by |
---|---|
CsrfFilter | HttpSecurity#csrf |
UsernamePasswordAuthenticationFilter | HttpSecurity#formLogin |
BasicAuthenticationFilter | HttpSecurity#httpBasic |
AuthorizationFilter | HttpSecurity#authorizeHttpRequests |
Config에서 등록 순서에 상관없이, 절대적인 Filter 순서에 따라 invoke된다.