Spring Security는 서블릿 필터 체인을 기반이다
각 필터에는 특정 책임이 있고, 구성에 따라 필터를 추가하거나 제거한다
Security Debugging
각 요청에 대한 자세한 보안 정보를 기록하는 보안 디버깅의 활성여부이다
debug 속성을 사용하여 보안 디버깅을 활성화할 수 있다
@EnableWebSecurity(debug = true)
이렇게 하면 서버에 요청을 보낼 때 모든 요청 정보가 기록된다
그리고 전체 보안 필터 체인을 볼 수 있다
Security filter chain: [
WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
// ...
]
Logging
FilterChainProxy 에 대한 로깅을 활성화하여 보안 필터를 찾는다
application.properties 에 다추가하여 로깅을 활성화할 수 있다 .
logging.level.org.springframework.security.web.FilterChainProxy=DEBUG
관련 로그
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 4 of 12 in additional filter chain; firing Filter: 'LogoutFilter'
DEBUG o.s.security.web.FilterChainProxy - /foos/1 at position 5 of 12 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter'
...
Obtaining the Filters Programmatically
등록된 보안 필터를 프로그래밍 방식으로 가져올 수 있다
FilterChainProxy를 사용하여 보안 필터를 가져온다.
springSecurityFilterChain 빈을 자동으로 연결한다
FilterChainProxy 대신 필터 유형을 가진 springSecurityFilterChain 이라는 이름의 @Qualifier를 사용하고 있다
Spring Security필터 체인을 생성하는 WebSecurityConfiguration의 springSecurityFilterChain() 메서드가 FilterChainProxy 가 아닌 Filter 유형을 반환하기 때문이다
@Autowired
@Qualifier("springSecurityFilterChain")
private Filter springSecurityFilterChain;
이 개체를 FilterChainProxy 로 캐스팅 하고 getFilterChains() 메서드를 호출한다 .
public void getFilters() {
FilterChainProxy filterChainProxy = (FilterChainProxy) springSecurityFilterChain;
List<SecurityFilterChain> list = filterChainProxy.getFilterChains();
list.stream()
.flatMap(chain -> chain.getFilters().stream())
.forEach(filter -> System.out.println(filter.getClass()));
}
샘플 출력
class org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
class org.springframework.security.web.context.SecurityContextPersistenceFilter
class org.springframework.security.web.header.HeaderWriterFilter
class org.springframework.security.web.authentication.logout.LogoutFilter
class org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
...
FilterChainProxy는 SecurityFilterChain 목록을 사용하여 구성된다
대부분의 애플리케이션에는 SecurityFilterChain이 하나만 필요하다
Important Spring Security Filters
Finally, let's take a look at some of the important security filters:
- UsernamePasswordAuthenticationFilter : 프로세스 인증, 기본적으로 "/login" URL에 응답
- AnonymousAuthenticationFilter : SecurityContextHolder에 인증 객체가 없을 때 익명의 인증 객체를 생성하여 그곳에 넣는다.
- FilterSecurityInterceptor: 액세스가 거부되면 예외 발생
- ExceptionTranslationFilter : 스프링 보안 예외 포착
- UsernamePasswordAuthenticationFilter: process authentication, responds by default to “/login” URL
- AnonymousAuthenticationFilter: when there's no authentication object in SecurityContextHolder, it creates an anonymous authentication object and put it there
- FilterSecurityInterceptor: raise exceptions when access is denied
- ExceptionTranslationFilter: catch Spring Security exceptions
'Spring 정리ver2 > Security' 카테고리의 다른 글
[baeldung] Default Password Encoder in Spring Security 5 (0) | 2023.04.27 |
---|---|
[baeldung] Control the Session with Spring Security (0) | 2023.04.26 |
[baeldung] Intro to Spring Security Expressions (0) | 2023.04.26 |
[baeldung] Retrieve User Information in Spring Security (0) | 2023.04.25 |