저번 글에서는 Spring Security 프레임워크에서 제공하는
3가지 대표적인 Builder
클래스를 보았습니다.
참고
: 기억 안 나시는 분들을 위해서! 잠깐 복습!
AuthenticationManagerBuilder
인증과 관련된 모든 부속품들을 모아서 하나의AuthenticationManager
인스턴스를
생성하는 빌더 클래스
HttpSecurity
http
요청의 보안처리 담당SecurityFilterChain
인스턴스를 생성하는 빌더 클래스- 하나의
SecurityFilterChain
인스턴스는http
요청의 실질적인
보안 처리를 위한List<Filter>
를 필드로 갖음
WebSecurity
FilterChainProxy
인스턴스를 생성하는 빌더 클래스- 하나의
FilterChainProxy
인스턴스는 여러SecurityFilterChain
인스턴스들을 모아서List
에 담음Servlet Engine
로부터 요청을 받으면FilterChainProxy
인스턴스는
해당 요청에 대한 보안 처리를 해줄 수 있는SecurityFilterChain
에게 요청을 위임
그 중에서 실제 보안처리를 담당하는 인스턴스를 생성할 때 사용하는 게 바로
HttpSecurity
빌더 클래스입니다.
HttpSecurity
빌더 클래스는 Http
요청에 대한 보안처리를 담당하는
SecurityFilterChain
인스턴스를 생성(build
)하는 게 목표입니다.
아래 그림에서 생성 결과물(=return) 타입을 통해 이를 확인할 수 있습니다.
위 그림에서 DefaultSecurityFilterChain
클래스는 를 생성할 때
HttpSecurity
클래스의 this.filters
에 있는 필터 리스트,
즉 List<Filter>
타입의 인스턴스를 사용하는 것을 확인할 수 있습니다.
이 필터 리스트는 추후에 Servlet Engine
으로 받은 Request
에 대한
보안 처리를 수행할 jakarta.servlet.Filter
들입니다.
이 필터들이 Spring Security
의 가장 핵심이 되는 역할을 수행하는 것들이죠.
다시 말해서 HttpSecurity
에 설정된 다양한 Filter
들이 곧
Spring Security 의 핵심 기능을 제공하는 것과 같습니다.
그런데 이 필터 List 는 어디서 온걸까요?
이전 게시물에서 말했지만, HttpSecurity 같은 SecurityBuilder
타입의 클래스들은
SecurityConfigurer
클래스에 의한 설정이 이루어진다고 말했습니다.
앞서 본 Filter 들 모두 이 SecurityConfigurer
덕분에 추가된 것들입니다.
그런데 모든 SecurityBuilder
서브 타입들이 요청에 대한 보안처리용
Filter
를 필요로하는 것은 아닙니다. 즉 모든 SecurityConfigurer
가 필터와
관련된 추가작업을 수행할 필요는 없다는 의미죠.
이런 이유로 HttpSecurity
는 다른 2개의 SecurityBuilder
클래스들과 달리
하나의 인터페이스를 상위 타입으로 더 둡니다. (아래 그림 참고)
HttpSecurityBuilder
가 바로 그 주인공입니다!HttpSecurityBuilder
의 메소드 시그니쳐를 보면 Filter 와 관련된 것들이 눈에 보입니다.
이런 메소드들이 있다면 쉽게 HttpSecurity 에 Filter 설정을 추가할 수 있겠죠?
그런데 말입니다, 앞서서도 말했지만 설정은 주로 SecurityConfigurer
타입의 인스턴스를 통해서 이루어진다고 했습니다.
그렇다면... HttpSecurityBuilder
과 연계해서 동작하는
전용 SecurityConfigurer
서브 타입의 클래스가 있으면 좋지 않을까요?!
그래서 만들어진 클래스가 바로, 바로 AbstractHttpConfigurer
클래스입니다.
먼저 이 클래스의 Java Doc
을 읽어볼까요?
HttpSecurityBuilder
가 보이네요. Type Parameter
설명을 통해서 현재 Configurer 와 연동되어서 동작하는 빌더 클래스의 타입임을 알 수 있습니다.SecurityConfigurer
는 오로지 HttpSecurity
의 설정만을 위한 것임을 알 수 있습니다.AbstractHttpConfigurer
라는 이름에서 알 수 있듯이 이 클래스는 추상클래스이며
이에 대한 서브 타입들이 많이 존재합니다.
이러한 타입의 인스터스들이 HttpSecurity 에 설정될 때마다,
HttpSecurity
에 Filter
가 하나씩 추가된다고 봐도 무방합니다.
이전 게시물에서 봐서 알겠지만, SecurityBuilder
서브 타입 클래스는 build
메소드가 호출되면 자신이 갖고 있는 List<SecurityConfigurer>
타입의 필드에 담고 있는 모든 SecurityConfigurer
들을 순회하면서 아래와 같은 작업을 합니다.
SecurityConfigurer.init()
를 모두 한번 실행SecurityConfigurer.configure()
를 모두 한번 실행init
메소드는 Java Doc 에서 말하지만, 서로 다른 SecurityConfigurer
서브 타입간에 공유하기 위한 인스턴스를 SecurityBuilder
타입의 인스턴스에 추가하기 위함입니다.
그래서 init
이라는 메소드보다는 configure
라는 메소드에서 Filter
를
추가할 가능성이 높습니다.
예를 들어서 AbstractHttpConfigurer
의 서브 타입인 HttpBasicConfigurer
클래스의
configure
메소드 내용을 보면 이를 확인할 수 있습니다.
HttpSecurityBuilder.addFilter
메소드를 호출하여 HttpSecurity
에서 사용할 Filter 를 추가합니다.HttpSecurity
의 build
최종 결과물인 DefaultSecurityFilterChain
의 Filter 로 활용됩니다!이상으로 글을 마치겠습니다.
읽으시느라 고생하셨습니다.
자료 너무 잘 보고있습니다 ㅠㅠ 감사합니다!