3.Spring Security의 인증 처리 흐름 |
-사용자의 인증 요청이 Spring Security Filter Chain의 특정 Filter에 도달했을 때, Spring Security의 컴포넌트들이 어떤 과정을 거쳐 사용자의 인증 요청을 처리하는지에 대한 흐름은 아래와 같음
-먼저, 위의 그림은 가장 일반적인 인증 방식인 ID/Password(Spring Security에서의 Username/Password)를 이용한 로그인 인증의 처리 흐름임
- (1)에서 사용자가 로그인 폼 등을 이용해 Username(로그인 ID)과 Password를 포함한 request를 Spring Security가 적용된 애플리케이션에 전송하면 로그인 요청이 Spring Security의 Filter Chain까지 들어오고, 여러 Filter들 중에서 UsernamePasswordAuthenticationFilter 가 해당 요청을 전달받음
- 사용자의 로그인 요청을 전달받은 UsernamePasswordAuthenticationFilter는 Username과 Password를 이용해 (2)와 같이 UsernamePasswordAuthenticationToken 을 생성함(*여기에서의 Authentication은 아직 인증 되지 않았음*)
- 미인증된 Authentication 을 가진 UsernamePasswordAuthenticationFilter는 (3)과 같이 해당 Authentication을 AuthenticationManager에게 전달함(*AuthenticationManager 의 구현 클래스는 ProviderManager 이고, ProviderManager 가 인증이라는 작업을 총괄하는 실질적인 매니저 역할을 함*)
- (4)와 같이 ProviderManager 로부터 Authentication을 전달 받은 AuthenticationProvider는 (5)와 같이 UserDetailsService 를 이용해 UserDetails 를 조회함(*UserDetails는 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜(Credential)인 Password, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트*)
- UserDetailsService 는 (6)에서 처럼 데이터베이스 등의 저장소에서 사용자의 크리덴셜(Credential)을 포함한 사용자의 정보를 조회함
- 데이터베이스 등의 저장소에서 조회한 사용자의 크리덴셜(Credential)을 포함한 사용자의 정보를 기반으로 (7)과 같이 UserDetails 를 생성한 후, (8)처럼 생성된 UserDetails 를 다시 AuthenticationProvider 에게 전달함
- UserDetails 를 전달받은 AuthenticationProvider 는 PasswordEncoder를 이용해 UserDetails 에 포함된 암호화된 Password와 인증을 위한 Authentication 안에 포함된 Password가 일치하는지 검증하는데, 검증에 성공하면 (9)에서 처럼 UserDetails를 이용해 인증된 Authentication을 생성하고, 검증에 성공하지 못하면 Exception을 발생시키고 인증 처리를 중단함
- AuthenticationProvider 는 (10)처럼 인증된 Authentication을 ProviderManager 에게 전달함(*(2)에서의 Authentication은 인증에 필요한 사용자의 로그인 정보를 가지고 있지만, 현재 단계에서 ProviderManager 에게 전달한 Authentication은 인증에 성공한 사용자의 정보(Principal, Credential, GrantedAuthorities)를 가지고 있음*)
- ProviderManager 는 (11)과 같이 인증된 Authentication을 다시 UsernamePasswordAuthenticationFilter에게 전달함
- 인증된 Authentication을 전달 받은 UsernamePasswordAuthenticationFilter는 마지막으로 (12)와 같이 SecurityContextHolder를 이용해 SecurityContext 에 인증된 Authentication을 저장함
4.Spring Security의 권한 부여 처리 흐름 |
-위의 그림은 사용자가 로그인 인증에 성공한 이후, Spring Security에서 인증된 사용자에게 권한을 부여하는 흐름을 나타냄
- Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter는 AuthorizationFilter 임
- AuthorizationFilter 는 (1)과 같이 SecurityContextHolder로 부터 Authentication을 획득함
- (2)와 같이 SecurityContextHolder로 부터 획득한Authentication과 HttpServletRequest를 AuthorizationManager 에게 전달함
- RequestMatcherDelegatingAuthorizationManager 내부에서 매치되는 AuthorizationManager 구현 클래스가 있다면 해당 AuthorizationManager 구현 클래스가 사용자의 권한을 체크함(3)
- 적절한 권한이라면 (4)와 같이 다음 요청 프로세스를 계속 이어감
- 적절한 권한이 아니라면 (5)와 같이 AccessDeniedException이 throw되고 ExceptionTranslationFilter가 AccessDeniedException을 처리함
+먼저, 인증과 권한 부여의 전체적인 흐름을 살펴보았으니 추후에 각각의 컴포넌트들의 내부 코드를 보면서 처리 흐름을 좀 더 확실히 하는 포스팅을 진행할 예정
-이미지 및 내용 출처 : code states
'부트캠프' 카테고리의 다른 글
Spring Security - 권한 부여 컴포넌트 (0) | 2023.03.22 |
---|---|
Spring Security - 인증 컴포넌트 (0) | 2023.03.22 |
Spring Security - DelegatingPasswordEncoder (0) | 2023.03.21 |
Spring Security - Filter 와 Filter Chain (1) | 2023.03.21 |
Spring Security - 기본 part 1 (1) | 2023.03.16 |