Spring Security 란
Spring Security는 접근제어, 인증, 인가의 기능을 수행한다.
이 기능을 수행할 때 아래와 같은 절차로 시행된다.
- 인증(Authentication):
- 사용자가 시스템에 접근하려 할 때 그들의 신원을 확인하는 과정.
- 인가(Authorization):
- 인증된 사용자가 특정 자원이나 데이터에 접근하거나 특정 작업을 수행할 수 있는 권한을 부여받는 과정
- 사용자의 역할, 접근 정책, 권한 등에 따라 결정됨.
- 감사(Auditing):
- 접근 시도와 실제 접근에 대한 기록을 유지하는 과정.
- 보안 위반 시도를 추적 및 시스템의 보안 상태를 평가
Spring Security는 Servlet 모듈과 WebFlux 각각에 대한 모듈을 나누어 제공한다.
- Servlet 기반(Spring MVC): >> tomcat
- 전통적인 Servlet API에 기반하며, 각 HTTP 요청을 처리하기 위해 별도의 스레드를 사용하는 동기적 블로킹 모델을 따른다.
- 클라이언트로부터의 요청이 들어올 때마다 서버는 요청을 처리할 스레드를 할당하고, 해당 요청의 처리가 완료될 때까지 스레드는 블로킹 상태가 된다.
- Spring WebFlux (비동기 및 논블로킹): >> netty
- Reactor를 기반으로 하는 비동기 및 논블로킹 I/O 모델을 사용.
- 이 접근 방식은 클라이언트 요청을 처리할 때 스레드를 효율적으로 사용할 수 있게 해 주며, 하나의 스레드가 여러 요청을 비동기적으로 처리할 수 있다. (고성능과 확장성이 요구되는 환경에서 유리)
** Spring Security의 Servlet 모듈 Filter를 기반으로 돌아간다.
Security 아키텍쳐
DelegatingFilterProxy
- 서블릿 컨테이너와 스프링 컨테이너를 연결해 주는 역할.
- 실제 수행할 작업은 Spring Container의 Bean에 위임.
- 이를 통해 Spring의 이점(DI 등)을 그대로 가져가면서 서블릿 `Filter`를 정의.
- 단, 스프링 부트에서는 Filter 구현체 Bean 만으로도 등록 가능.
ServletContainer와 SpringContainer 구조도
FilterChainProxy
- Spring Security에서 정의한 Filter
- SecurityFilterChain을 통해 다수의 Filter에 수행 작업을 위임하는 것이 가능
- Bean으로 관리되며, DelegatingFilterProxy 인터페이스에 래핑.
SpringSecurity의 최종 아키텍처
SecurityFilterChain
- 특정 요청에 대한 `Security Filter`의 집합
- 단순한 Bean이며, `DelegatingFilterProxy`에 의해 등록되지 않고, `FilterChainProxy`에 의해 등록
Security Filter
- `SecurityFilterChain`을 구성하는 `Filter`입니다.
- 인증, 인가, 보안 취약점 방어 등 다양한 목적에 따라 사용.
- 인가 전에는 반드시 인증이 되어야 하듯이 필터 간 순서에 대한 정의도 필요.
ExceptionTranslationFilter :
권한과 관련된 `Exception`을 HTTP 응답으로 변환(AccessDeniedException , AuthenticationException)
- `AuthenticationException` 이 발생한 경우 요청을 캐싱하고 인증을 재시도.
- `AccessDeniedException` 이 발생한 경우 `AcessDeniedHandler`를 통해 처리.
References
스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0/dashboard
스프링 공식 문서 - https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-filters-review
'Spring' 카테고리의 다른 글
SpringSecurity 인증 방식 (0) | 2024.03.02 |
---|---|
SpringSecurity 인증 (0) | 2024.03.01 |
N+1 문제 해결(JPA) (1) | 2024.02.12 |
N+1 해결 (QueryDSL) (0) | 2024.02.11 |
프로젝트 QueryDSL 적용기 (0) | 2024.02.08 |