저번 게시물에서 Spring Security의 Filter와 Interceptor 기능에 대해서 알아봤다!
사실 진짜 간단하게 말하면 클라이언트의 요청이 발생하고, 데이터가 오고가고 하는 와중에 에러가 날 수도 있고, 보안상에 문제가 발생할 수도 있는데 이 때 디버깅하거나 이를 방지할 수도 있게 해주는 친구들이었다!😊
이번에는 Spring Security의 Architecture에 대해서 알아볼 것이다.
Spring Security의 핵심은 SecurityFilterChain이다.
그 내부에 Spring Security가 제공하는 수 많은 Filter들이 존재하고 이를 기반으로 동작한다.
HTTP Request를 가로채는 웹 애플리케이션 Architecture의 첫 번째 계층은 Filter Chain이다.
Filter Chain에서 생성한 Filter와 Spring에서 관리하는(빈으로 정의되어 관리되는)Filter는 다르니 주의☝️
Spring Security의 내부 구조에 대해서 알아보기 전에 각 영역의 역할들에 대해서 알아보자.
UsernamePasswordAuthenticationToken
AuthenticationManager
AuthenticationProvider
ProviderManager
UserDetailsService
UserDetails
SecurityContextHolder⭐
SecurityContext⭐
Authentication⭐
아래는 Spring Security 내부에 HTTP Request가 들어왔을 때 일어나는 과정이다.
HTTP Request
)최종적으로 SecurityContextHolder는 세션 영역에 있는 SecurityContext에 Authentication 객체를 저장한다.
Spring Security의 Authentication관련 동작의 원리에 대해 살펴보자
AuthencitionFilter -> AuthenticationManager -> AuthenticationProvider로 인증 진행
그렇다면 각 객체들의 역할을 구체적으로 살펴보자
AuthenticationToken 생성 및 저장 주체
1. AuthenticationToken 생성: 인증(검증)을 위한 객체 생성, 아직 미인증
2. AuthenticationToken 저장
a. SecurityContextHolder: 지정된 보관 모드에 따라 SecurityContext 보관
b. SecurityContext: 인증된 Authentication객체를 보관하는 역할
AuthenticationFilter를 구현한 구현체들이 다양하게 존재하는데, 몇개만 보면 아래와 같다.
AuthenticationToken 인증(검증) 방법 할당
구현체가 바로 ProviderManager!
이 Manager가 수많은 AuthenticationProvider중에서 적합한 AuthenticationProvider를 찾아 Token을 검증한다.
AuthenticationToken 인증(검증) 처리 주체
앞서 AuthenticationFilter에서 만든 미인증 AuthenticationToken을 인증
이를 구현하기 위한 방법은 아래와 같은 것들이 존재!
결론적으로 Provider에 인증되지 않은 AuthenticationToken을 넣어주면 해당 Token의 인증 여부를 결정하여 AuthenticationToken 내에
authenticated
파라미터에true
/false
중 하나를 설정하여 넣어준다.
Spring Security의 동작 과정을 세부적으로 살펴보았다.
원래 Spring Security Configuration이랑 CustomFilter도 같이 적어보려고 했는데 Spring Security의 Architecture가 공부하면 할 수록 알아볼 수록 내용이 너무 많고 딥하게 들어가면 끝도 없이 딥한거같아서 나눠 정리했다.
처음엔 너무 복잡해보여서 막막했는데 하나하나 보니 생각보다 단순했다. 최근에 OAuth를 잠깐 다뤘었는데 그 때랑 겹쳐서 보니까 그 당시 상황이 뭔가 좀 이해가 되는거같다. 다음에 OAuth 사용하게 되면 여기 다시 한번 와서 봐야겠다!😎