[Spring boot 3 Security] HttpSecurity 를 위한 Type 들

식빵·2024년 5월 7일
0
post-thumbnail

📌 보안설정의 첫단추 : HttpSecurity

저번 글에서는 Spring Security 프레임워크에서 제공하는
3가지 대표적인 Builder 클래스를 보았습니다.

참고 : 기억 안 나시는 분들을 위해서! 잠깐 복습!

  • AuthenticationManagerBuilder
    인증과 관련된 모든 부속품들을 모아서 하나의 AuthenticationManager 인스턴스를
    생성하는 빌더 클래스

  • HttpSecurity
    • http 요청의 보안처리 담당 SecurityFilterChain 인스턴스를 생성하는 빌더 클래스

    • 하나의 SecurityFilterChain 인스턴스는 http 요청의 실질적인
      보안 처리를 위한 List<Filter> 를 필드로 갖음

  • WebSecurity
    • FilterChainProxy 인스턴스를 생성하는 빌더 클래스

    • 하나의 FilterChainProxy 인스턴스는 여러 SecurityFilterChain
      인스턴스들을 모아서 List 에 담음

    • Servlet Engine 로부터 요청을 받으면 FilterChainProxy 인스턴스는
      해당 요청에 대한 보안 처리를 해줄 수 있는 SecurityFilterChain 에게 요청을 위임

SecurityFilterChain, FilterChainProxy 에 의한 요청 보안처리 흐름:

그 중에서 실제 보안처리를 담당하는 인스턴스를 생성할 때 사용하는 게 바로
HttpSecurity 빌더 클래스입니다.

HttpSecurity 빌더 클래스는 Http 요청에 대한 보안처리를 담당하는
SecurityFilterChain 인스턴스를 생성(build)하는 게 목표입니다.

아래 그림에서 생성 결과물(=return) 타입을 통해 이를 확인할 수 있습니다.


위 그림에서 DefaultSecurityFilterChain 클래스는 를 생성할 때
HttpSecurity 클래스의 this.filters 에 있는 필터 리스트,
List<Filter> 타입의 인스턴스를 사용하는 것을 확인할 수 있습니다.

이 필터 리스트는 추후에 Servlet Engine 으로 받은 Request 에 대한
보안 처리를 수행할 jakarta.servlet.Filter 들입니다.

이 필터들이 Spring Security 의 가장 핵심이 되는 역할을 수행하는 것들이죠.

다시 말해서 HttpSecurity 에 설정된 다양한 Filter 들이 곧
Spring Security 의 핵심 기능을 제공하는 것과 같습니다.




📌 HttpSecurity 만을 위한 타입들

그런데 이 필터 List 는 어디서 온걸까요?
이전 게시물에서 말했지만, HttpSecurity 같은 SecurityBuilder 타입의 클래스들은
SecurityConfigurer 클래스에 의한 설정이 이루어진다고 말했습니다.
앞서 본 Filter 들 모두 이 SecurityConfigurer 덕분에 추가된 것들입니다.


그런데 모든 SecurityBuilder 서브 타입들이 요청에 대한 보안처리용
Filter 를 필요로하는 것은 아닙니다. 즉 모든 SecurityConfigurer 가 필터와
관련된 추가작업을 수행할 필요는 없다는 의미죠.


1. HttpSecurityBuilder 인터페이스

이런 이유로 HttpSecurity 는 다른 2개의 SecurityBuilder 클래스들과 달리
하나의 인터페이스를 상위 타입으로 더 둡니다. (아래 그림 참고)

  • HttpSecurityBuilder 가 바로 그 주인공입니다!

HttpSecurityBuilder 의 메소드 시그니쳐를 보면 Filter 와 관련된 것들이 눈에 보입니다.

이런 메소드들이 있다면 쉽게 HttpSecurity 에 Filter 설정을 추가할 수 있겠죠?
그런데 말입니다, 앞서서도 말했지만 설정은 주로 SecurityConfigurer 타입의 인스턴스를 통해서 이루어진다고 했습니다.

그렇다면... HttpSecurityBuilder 과 연계해서 동작하는
전용 SecurityConfigurer 서브 타입의 클래스가 있으면 좋지 않을까요?!




2. AbstractHttpConfigurer 클래스

그래서 만들어진 클래스가 바로, 바로 AbstractHttpConfigurer 클래스입니다.
먼저 이 클래스의 Java Doc 을 읽어볼까요?

  1. 아까 말씀드린 HttpSecurityBuilder 가 보이네요. Type Parameter 설명을 통해서 현재 Configurer 와 연동되어서 동작하는 빌더 클래스의 타입임을 알 수 있습니다.
  2. 설명을 통해서 이 SecurityConfigurer 는 오로지 HttpSecurity 의 설정만을 위한 것임을 알 수 있습니다.

AbstractHttpConfigurer 라는 이름에서 알 수 있듯이 이 클래스는 추상클래스이며
이에 대한 서브 타입들이 많이 존재합니다.

이러한 타입의 인스터스들이 HttpSecurity 에 설정될 때마다,
HttpSecurityFilter 가 하나씩 추가된다고 봐도 무방합니다.




📌 보충: Filter 추가는 일반적으로 언제할까?

이전 게시물에서 봐서 알겠지만, SecurityBuilder 서브 타입 클래스는 build 메소드가 호출되면 자신이 갖고 있는 List<SecurityConfigurer> 타입의 필드에 담고 있는 모든 SecurityConfigurer 들을 순회하면서 아래와 같은 작업을 합니다.

  • SecurityConfigurer.init() 를 모두 한번 실행
  • init 을 모두 한번씩 호출하고 나서,SecurityConfigurer.configure() 를 모두 한번 실행

init 메소드는 Java Doc 에서 말하지만, 서로 다른 SecurityConfigurer 서브 타입간에 공유하기 위한 인스턴스를 SecurityBuilder 타입의 인스턴스에 추가하기 위함입니다.

그래서 init 이라는 메소드보다는 configure 라는 메소드에서 Filter
추가할 가능성이 높습니다.

예를 들어서 AbstractHttpConfigurer 의 서브 타입인 HttpBasicConfigurer 클래스의
configure 메소드 내용을 보면 이를 확인할 수 있습니다.

  • 보안 처리를 위한 Filter 생성하고, 필요하다면 필터에 몇가지 설정을 더 해줍니다.
  • 최종적으로 HttpSecurityBuilder.addFilter 메소드를 호출하여 HttpSecurity 에서 사용할 Filter 를 추가합니다.
  • 더 나아가서 이는 결과적으로 HttpSecuritybuild 최종 결과물인 DefaultSecurityFilterChain 의 Filter 로 활용됩니다!

이상으로 글을 마치겠습니다.
읽으시느라 고생하셨습니다.

profile
백엔드 개발자로 일하고 있는 식빵(🍞)입니다.

3개의 댓글

comment-user-thumbnail
2024년 5월 27일

자료 너무 잘 보고있습니다 ㅠㅠ 감사합니다!

1개의 답글
comment-user-thumbnail
2024년 5월 27일

자료 너무 잘 보고있습니다 ㅠㅠ 감사합니다!

답글 달기