Spring 정리ver2/Security

[baeldung] Find the Registered Spring Security Filters

태애니 2023. 4. 27. 20:39
728x90

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
728x90