
저번 글에서는 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 로 활용됩니다!이상으로 글을 마치겠습니다.
읽으시느라 고생하셨습니다.
자료 너무 잘 보고있습니다 ㅠㅠ 감사합니다!