✍️ 학습 목표
- Spring Security란?
- Architecture 이해하기
📌 Spring Security
스프링 프레임워크에서 보안(인증, 인가)을 담당하는 스프링 하위 프레임워크이다.
시큐리티를 공부하기 위해 짚고갈 용어들이 존재한다.
🔒 보안 용어
- Authentication, 인증 : 애플리케이션을 접근하는 사람이 누구인지 확인하는 절차
- Authorization, 인가 : 확인된 사용자의 권한을 확인하고 부여하는 절차
- Principal, 접근 주체 : 접근하려는 대상
- Credential, 자격증명 : 비밀번호, 열쇠와 같은 인증을 위한 키
정리하면 스프링 시큐리티는 보호된 리소스에 접근하는 대상이 '누구'인지 확인해주고
그 '누구'에게 부여된 권한에 맞게 기능들을 이용할 수 있게 한다.
✔️ 스프링 시큐리티의 특징
- 보안에 대한 다양하고 편리한 옵션들을 제공한다.
- 서블릿의 필터를 기반으로 동작한다. (MVC 패턴과의 분리)
- 세션, 쿠기 방식을 사용하고 인증에 Credential 인증 방식을 사용한다.
📌 스프링 시큐리티 아키텍처
앞서 서술한 것처럼 스프링 시큐리티는 서블릿의 필터를 기반으로 동작한다.
기본적으로 스프링 프레임워크는 클라이언트의 요청을 DispatcherServlet이 받아서 처리한다.
요청들이 DispatcherServlet에 도착하기 전에 필터를 거치는데, 이 필터는 말 그대로 '필터'의 역할을 수행한다.
필터와 서블렛을 체인처럼 엮으면 필터체인이라고 부른다.
✔️ DelegatingFilterProxy
애플리케이션의 인증과 권한 부여는 필터의 생명주기 동안 이루어지는데 서블릿 컨테이너는 빈을 인식할 수 없다.
스프링 시큐리티는 중간다리 역할을 하는 DelegatingFilterProxy을 제공한다.
이 프록시는 표준 서블렛 컨테이너 메커니즘을 그대로 따르고 모든 작업은 빈에게 위임한다.
여기서 가장 중요한 점은 지연 검색을 가능케 한다는 점이다.
// Example from Spring.io
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// ApllicationContext로부터 필터로 등록된 빈을 가져온다.
Filter delegate = getFilterBean(someBeanName);
// 빈에게 실제 작업을 시킨다.
delegate.doFilter(request, response);
}
✔️ FilterChainProxy
DelegatingFilterProxy 내부에 존재하는 FilterChainProxy는 넘겨받은 요청과 응답을 스프링 시큐리티 필터 체인에 전달하고 작업을 위임한다.
DelegatingFilterProxy에서 바로 실행하지 않고 FilterChainProxy를 두는 이유는 다음과 같다.
🧐 왜 존재할까?
- 서블릿 지원의 시작점 : 서블릿 관련 문제가 발생하면 시작점부터 확인해 나갈 수 있다.
- 시큐리티의 중심 : SecurityContext 비워 메모리 누수를 방지하고, 외부의 공격으로부터 방화벽을 세우는 메인 기능을 수행하게 할 수 있다.
- 유연한 호출 : 기존의 URL 기반의 호출 방식을 벗어나 RequestMatcher와 HttpServletRequest을 활용해 유연하게 호출을 결정할 수 있다.
✔️ SecurityFilterChain
인증을 처리하는 여러 SecurityFilter를 담는 필터 체인이다.
FilterChainProxy가 이 필터체인으로 클라이언트의 요청에 어떤 시큐리티 필터를 사용할지 결정한다.
✔️ SecurityFilter
클라이언트의 요청을 스프링 시큐리티 메커니즘에 따라 처리하는 필터이다.
SecurityFilterChain API를 통해 FilterChainProxy에 삽입되고 스프링 빈으로 등록된다.
순서가 존재하지만 모두 알아야 할 필요는 없다.
-Reference
https://docs.spring.io/spring-security/site/docs/5.4.2/reference/html5
'Web > Spring-Security' 카테고리의 다른 글
[Security] 시큐리티 파헤치기 (4) : 인증이란? (feat. Authentication) (1) | 2023.08.17 |
---|---|
[Security] 시큐리티 파헤치기 (3) : 시큐리티 초기화, 다중 필터 체인 (0) | 2023.08.11 |
[Security] 시큐리티 파헤치기 (2) : RequestCacheAwareFilter, RequestCache (2) | 2023.08.02 |
[Security] 시큐리티 파헤치기 (1) : DelegatingFilterProxy (0) | 2023.08.02 |
[Security] Spring Security (2) (0) | 2022.10.05 |
댓글