Spring Security가 6 버전으로 변경되며
어떤 변경점이 있는지 알아보는 김에
전체적인 초기화 구성에 대해서 정리하고 넘어가는 시간을 가졌다.
기존 Servlet을 활용한 처리 개념이 있다면
이해에 많은 도움이 될 것이다.
Servlet Applications의 Architecture 관련 설명
Architecture :: Spring Security
The Security Filters are inserted into the FilterChainProxy with the SecurityFilterChain API. Those filters can be used for a number of different purposes, like authentication, authorization, exploit protection, and more. The filters are executed in a spec
docs.spring.io
| Security 구성
- SecurityBuilde
> 역할 : 웹 보안 구성 빈 객체 및 설정 클래스들을 생성
> 종류 : WebSecurity, HttpSecurity
- SecurityConfigurer
> 역할 : http 요청 관련 보안 처리 필터 생성, 초기화 설정
> 목적 : 인증/인가/초기화 작업 진행
- 연계 작업 및 구성
> Security Builder는 Security Configurer를 참조함
* 동작원리
| Security Builder & Configurer
1) AutoConfiguration에서 build()를 통해 빌더 클래스 생성
2) SecurityBuilder가 설정클래스 즉 SecurityConfigurer 생성
3) SecurityConfigurer에는 init, configure 메서드가 존재함
> 이 둘은 매개변수로 Builder 클래스를 받음
> 이 과정으로 초기화 및 필터 생성이 진행됨
| HttpSecurity
- 생성 및 초기화 : HttpSecurityConfiguration에서 이루어짐
- 역할
> 보안에 필요한 각 설정 클래스 및 필터 생성
> 최종적으로 SecurityFilterChain Bean 생성
- 생성 과정
1) HttpSecurityConfiguration가 초기화 시 실행됨
2) HttpSecurityConfiguration는 HttpSecurity Bean을 생성함
2-1) HttpSecurity 내부에서 여러 설정 클래스 들을 생성
> CsrfConfigurer, LogoutConfigurer ...
2-2) 이후 build()가 호출이 되면
> 각 클래스 내부에 존재하는 init(), configurer()이 호출되며
> 각 객체에 관련된 객체 및 필터들이 생성됨
3) 이 필터들이 SecurityFilterChain라는 빈이 생성되며 저장
| SecurityFilterChain
- SecurityFilterChain : 인터페이스
> List<Filter> getFilters()
> boolean matches(HttpServletRequest)
이곳에서 matches는 현 요청이 SecurityFilterChain에 의해 처리되어야 하는지 여부를 결정한다. true인 경우에만 해당 필터 체인을 이용한다는 의미를 가진다. 이를 통해 특정 요청에 대한 적절한 보안 필터링을 적용한다. |
- DefaultSecurityFilterChain
> List<Filter> getFilters()
> String toString()
> RequestMatcher getRequestMatcher()
> boolean matches(HttpServletRequest)
getFilters는 현재 SecurityFilterChain에 포함된 Filter 객체 리스트를 반환한다. 이를 통해 어떤 필터가 현 필터 체인에 포함되는지 알 수 있으며, 각 필터는 요청 처리 과정에서 특정 작업*을 수행함. * 작업? : 인증, 권한 부여, 로깅 등 |
| WebSecurity
- 생성 및 초기화 : HttpSecurityConfiguration에서 이루어짐
- 역할
> HttpSecurity에서 생성한 SecurityFilterChain빈을 SecurityBuilder에 저장
> build 이후 SecurityBuilder에서 SecurityFilterChain을 꺼냄
> 꺼내진 FilterChain을 FilterChainProxy 생성자에게 전달
| HttpSecurity와 WebSecurity의 연관 관계
- WebSecurity 역할
: 전반적인 필터 체인 관리를 담당하며, 특정 경로를 필터링에서 제외
- HttpSecurity 역할
: 각 요청 경로에 맞는 보안 필터를 구성하여 SecurityFilterChain 구성
- SecurityFilterChain
: FilterChainProxy에 의해 관리되며, 들어오는 HTTP 요청이 올바른
필터 체인으로 처리되도록 함
- WebSecurity 설정이 우선적으로 적용된 후,
- HttpSecurity가 구성한 필터들이 SecurityFilterChain을 통해 실행됨
| Filter
- SevletFilter
> 역할 : 클라이언트 요청 및 서버 응답 가공/검사 시의 구성 요소
> 동작 시점 : 클라이언트 요청이의 서블릿 도달 이전, 응답 반환 시
> 생성/실행/종료 지점 : Sevlet Container(WAS)
- init/destroy는 생성 종료 시 한 번만 수행
- doFilter는 요청에 대해 계속적인 처리 진행
| Filter : DelegatingFilterProxy
: 서블릿 컨테이너와 스프링 애플리케이션 컨텍스트 간의 연결고리 역할
- 역할 및 구조
> 서블릿 필터 기능 수행
> 동시에 스프링 의존성 주입 및 빈 관리 기능과 연동되도록 설계됨
> springSecurityFilterChain이름의 빈을 ApplicationContext에서 찾아 요청을 위임
- 주의
> 스프링에서만 이용되는 서블릿 필터
> 실제 보안 처리를 수행하지 않음
- 존재의의
> 본래 Filter에는 DI/AOP 같은 Spring의 기능 적용이 불가함
> 이러한 기능을 가지고 요청 및 처리가 가능하기 위해 만들어짐
- springSecurityFilterChain은 누군데요?
> 그게 바로 FilterChainProxy
| Filter : FilterChainProxy
: DelegatingFilterProxy로부터 요청을 위임받고 보안 처리 역할을 함
- 특징
> springSecurityFilterChain이름의 빈으로 생성됨
> 내부에 하나 이상 SecurityFilterChain 객체를 지님
> URL 정보 기준 적절 SecurityFilterChain을 선택해 필터 호출
> HttpSecurity를 통한 API 추가 시 관련 필터가 추가됨
> 요청에 대해 필터 순대로 호출하여 보안 기능 동작
> 필요 시 직접 필터를 생성해 기존 필터 전/후 추가 가능
요약지
SpringSecurityInitialization.pdf
drive.google.com
'기술 단어장 > Backend' 카테고리의 다른 글
[Spring] Spring 생태계 정리 (3) | 2024.11.05 |
---|---|
[사고 변천] 음악 유사도 검사 전략의 사고 과정 (0) | 2024.04.09 |
[MyBatis] MyBatis 적용 이전과 이후 DB 데이터 접근 방식의 차이 (0) | 2023.10.25 |
[Web-Backend] MySQL, JDBC, Servlet, AJAX - 요약지 (0) | 2023.10.24 |
[SpringBoot] JWT - 요약지 (0) | 2023.03.28 |
댓글