1) 웹 애플리케이션 서버의 Filter
- 웹 애플리케이션 서버, 곧 서블릿 컨테이너의 Filter는 디스패처 서블릿으로 가기전에 먼저 적용
- 여러 개의 Filter들이 연결되어 있어 FilterChain이라도 불림
- 모든 Request는 Filter들을 거쳐 서블릿에 도착
2) Spring Security의 Filter
- DelegatingFilterProxy라는 필터를 만들어 FilterChain 사이에 넣어 SpringSecurity Filter를 거치도록 하고, Proxy 아래 SecurityFilterChain 그룹을 적용하여 특정 Url을 설정하여 다르게 동작하도록 한다.
- WevSecurityConfigurerAdapter을 상속받은 Config 사용자 클래스로 Config(HttpSecurity http) 메소드를 통해 Filter를 구성할 수 있다.
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser(User.builder()
.username("user2")
.password(passwordEncoder().encode("2222"))
.roles("USER")
).withUser(User.builder()
.username("user3")
.password(passwordEncoder().encode("3333"))
.roles("ADMIN")
);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) ->
requests.antMatchers("/").permitAll()
.anyRequest().authenticated());
http.formLogin();
http.httpBasic();
}
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
3) Spring Security 의 Filter 종류
- 각각의 필터는 단일 필터로 각기 서로 다른 관심사를 해결
- HeaderWriterFilter : Http 해더를 검사한다. 써야 할 건 잘 써있는지, 필요한 해더를 더해줘야 할 건 없는가?
- CorsFilter : 허가된 사이트나 클라이언트의 요청인가?
- CsrfFilter : 내가 내보낸 리소스에서 올라온 요청인가?
- LogoutFilter : 지금 로그아웃하겠다고 하는건가?
- UsernamePasswordAuthenticationFilter : username / password 로 로그인을 하려고 하는가? 만약 로그인이면 여기서 처리하고 가야 할 페이지로 보내 줄께.
- ConcurrentSessionFilter : 여거저기서 로그인 하는걸 허용할 것인가?
- BearerTokenAuthenticationFilter : Authorization 해더에 Bearer 토큰이 오면 인증 처리 해줄께.
- BasicAuthenticationFilter : Authorization 해더에 Basic 토큰을 주면 검사해서 인증처리 해줄께.
- RequestCacheAwareFilter : 방금 요청한 request 이력이 다음에 필요할 수 있으니 캐시에 담아놓을께.
- SecurityContextHolderAwareRequestFilter : 보안 관련 Servlet 3 스펙을 지원하기 위한 필터라고 한다.(?)
- RememberMeAuthenticationFilter : 아직 Authentication 인증이 안된 경우라면 RememberMe 쿠키를 검사해서 인증 처리해줄께
- AnonymousAuthenticationFilter : 아직도 인증이 안되었으면 너는 Anonymous 사용자야
- SessionManagementFilter : 서버에서 지정한 세션정책을 검사할께.
- ExcpetionTranslationFilter : 나 이후에 인증이나 권한 예외가 발생하면 내가 잡아서 처리해 줄께.
- FilterSecurityInterceptor : 여기까지 살아서 왔다면 인증이 있다는 거니, 니가 들어가려고 하는 request 에 들어갈 자격이 있는지 그리고 리턴한 결과를 너에게 보내줘도 되는건지 마지막으로 내가 점검해 줄께.
- 그 밖에... OAuth2 나 Saml2, Cas, X509 등에 관한 필터들도 있습니다.
- 필터는 넣거나 뺄 수 있고 순서를 조절할 수 있습니다. (이때 필터의 순서가 매우 critical 할 수 있기 때문에 기본 필터들은 그 순서가 어느정도 정해져 있습니다.)@Order(1), Order(2)... 사용
FilterChain 지나간 log 출력
@EnableWebSecurity(debug = true)
debug = true 옵션을 붙여주어 Filter를 확인 가능
Security filter chain: [
WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
CsrfFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
DefaultLogoutPageGeneratingFilter
BasicAuthenticationFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
]
특정 Url을 설정하여 원하는 Filter에 적용
- http.antMacher를 통해 설정
- 모든 request에 동작하려면 http.antMacher("/**") 적용
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**");
http.authorizeRequests((requests) ->
requests.antMatchers("/").permitAll()
.anyRequest().authenticated());
http.formLogin();
http.httpBasic();
}
'Spring > 1-5. Spring Security' 카테고리의 다른 글
6) DaoAuthenticationManager와 UserDetailsService 사 (0) | 2023.06.11 |
---|---|
5) BasicAuthenticationFilter를 사용하여 토큰 인증 (0) | 2023.06.08 |
4) Form Login과 Logout Filter (0) | 2023.06.04 |
3. Spring Security Authentication 구조와 매커니즘 (0) | 2023.06.04 |
1. Spring Security 개념 (0) | 2023.06.04 |