본 Spring Security 시리즈 내용은 인프런 정수원님의 강의 내용을 정리한 시리즈입니다.
상업적 이용 목적의 포스팅 무단 복제 및 사용을 금합니다.
HttpSecurity
는 인증/인가와 관련된 모든 설정을 할 수 있기 때문에 spring security 전반에 걸쳐 매우 중요한 클래스다.
HttpSecurityConfiguration
에서 HttpSecurity
를 생성하고 HttpSecurity
는 보안에 필요한 SecurityConfigurer(CsrfConfigurer... 등)
객체들을 LinkedHashMap
타입의 필드로 저장한다.
저장된 SecurityConfigurer
객체들을 초기화 및 기본 설정을 진행하여 Filter들을 생성한다. 그리고 최종적으로 SecurityFilterChain(DefaultSecurityFilterChain)
객체를 생성한다.
빈으로 등록되는 곳은 HttpSecurity
의 build
메소드를 호출하는 SecurityFilterChainConfiguration
클래스의 defaultSecurityFilterChain
빈 생성 메소드다.
SecurityFilterChain
은 인터페이스다.
getFilters
와 matches
라는 메소드 두 개가 선언되어 있다.
boolean matches(HttpServletRequest request)
요청이 현재 SecurityFilterChain
에 의해 처리되어야 하는지 여부를 결정한다.
SecurityFilterChain
빈은 여러 개가 될 수 있다. 따라서 지금 요청이 현재 SecurityFilterChain
에 의해 처리되어야 하는지를 판단해야 한다.List<Filter> getFilters()
현재 SecurityFilterChain
에 포함된 Filter
리스트를 반환한다.
DefaultSecurityFilterChain
은 SecurityFilterChain
의 구현체로 자동 설정에 의해 생성되는 SecurityFilterChain
이다.
SecurifyFilterChain
구현체는 RequestMatcher
타입 필드와, List<Filter>
타입의 필드를 가지고 있다.
현재 요청이 현재 SecurityFilterChain
의 RequestMatcher
와 비교하여 매치가 되면 이 요청은 현재 SecurityFilterChain
이 보안 처리를 담당한다.
WebSecurityConfiguration
클래스에서 WebSecurity
객체를 생성하고 초기화를 진행한다.
WebSecurity
는 HttpSecurity
에서 생성한 SecurityFilterChain
빈을 SecurityBuilder
에 저장한다.
WebSecurity
의 build
메소드는 FilterChainProxy
객체를 생성하고 FilterChainProxy
객체는 SecurityBuilder
에 들어있는 SecurityFilterChain
들을 가지게 된다.
다시 저번처럼 spring security의 자동 설정에 의한 보안 적용 흐름을 살펴보겠다.
HttpSecurityConfiguration
클래스에서 HttpSecurity
객체를 생성하고, HttpSecurity
는 각 보안 요소를 처리해야 하는 각 SecurityConfigurer
들을 생성해서 들고있는다.
그리고 이 HttpSecurity
빈을 등록한다.
SpringBootWebSecurityConfiguration
클래스에서는 HttpSecurity
빈을 주입받고, 추가적인 SecurityConfigurer
들을 생성한 후 build
메소드를 수행한다.
이 build
메소드를 수행하면 SecurityFilterChain
의 구현체인 DefaultSecurityFilterChain
객체를 생성하게 되고 이 객체를 빈으로 등록하게 된다.
HttpSecurity
의 build
메소드는 최종적으로 performBuild
메소드를 호출한다.
performBuild
메소드를 보면 결과적으로 DefaultSecurityFilterChain
객체를 생성하는데, 생성자에 전달하는 인수를 보면 this.requestMatcher
가 있다.
여기서 this.requestMatcher
는 AnyRequestMatcher
다. 즉, 모든 요청에 대해 이 FilterChain(DefaultSecurityFilterChain
)을 통해 보안을 적용하겠다는 의미가 된다.
그럼 이제 WebSecurity
가 HttpSecurity
가 생성한 SecurityFilterChain
을 어떻게 사용하는지를 알아보겠다.
우선 WebSecurityConfiguration
에서 WebSecurity
를 생성한다. HttpsSecurity
를 주입받아야 하기 때문에 HttpSecurityConfiguration
이 먼저 실행된다.
setter 주입을 통해 HttpSecurity
가 생성한 DefaultSecurityFilterChain
을 주입받아서 this.securityFilterChains
필드에 세팅하고 있다.
여기서 보면 SecurityFilterChain
목록들을 살펴보며
WebSecurity
의 securityFilterChainBuilders 필드에 하나씩 추가한다. 근데 지금은 spring security 자동 설정에 의해 생성된 DefaultSecurityFilterChain
하나 밖에 없기 때문에 securityFilterChainBuilders에 하나만 추가된다.
그리고 springSecurityFilterChain
메소드가 실행되어 WebSecurity
의 build
메소드가 실행된다.
build
메소드는 최종적으로 performBuild
메소드를 호출한다. 앞서 살펴본 HttpSecurity
의 performBuild
메소드가 아닌 WebSecurity
의 performBuild
메소드다.
performBuild
메소드에서 FilterChainProxy
객체를 생성하며, SecurityFilterChain
들을 리스트에 담아 FilterChainProxy
객체를 생성할 때 생성자의 인수로 넘겨준다.
그리고 FilterChainProxy
를 return하여 빈을 등록한다.