부트캠프

Spring Security - 기본 part 2

hunm719 2023. 3. 21. 20:40
3.Spring Security의 인증 처리 흐름

 -사용자의 인증 요청이 Spring Security Filter Chain의 특정 Filter에 도달했을 때, Spring Security의 컴포넌트들이 어떤 과정을 거쳐 사용자의 인증 요청을 처리하는지에 대한 흐름은 아래와 같음

Spring Security의 컴포넌트로 보는 인증(Authentication) 처리 흐름

 -먼저, 위의 그림은 가장 일반적인 인증 방식인 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의 컴포넌트로 보는 권한 부여(Authorization) 처리 흐름

 -위의 그림은 사용자가 로그인 인증에 성공한 이후, Spring Security에서 인증된 사용자에게 권한을 부여하는 흐름을 나타냄

  • Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 FilterAuthorizationFilter 임
  • AuthorizationFilter(1)과 같이 SecurityContextHolder로 부터 Authentication을 획득함
  • (2)와 같이 SecurityContextHolder로 부터 획득한Authentication과 HttpServletRequest를 AuthorizationManager 에게 전달함
  • RequestMatcherDelegatingAuthorizationManager 내부에서 매치되는 AuthorizationManager 구현 클래스가 있다면 해당 AuthorizationManager 구현 클래스가 사용자의 권한을 체크함(3)
  • 적절한 권한이라면 (4)와 같이 다음 요청 프로세스를 계속 이어감
  • 적절한 권한이 아니라면 (5)와 같이 AccessDeniedException이 throw되고 ExceptionTranslationFilterAccessDeniedException을 처리함

 

 

+먼저, 인증과 권한 부여의 전체적인 흐름을 살펴보았으니 추후에 각각의 컴포넌트들의 내부 코드를 보면서 처리 흐름을 좀 더 확실히 하는 포스팅을 진행할 예정

 

 

 

 

 

 

-이미지 및 내용 출처 : code states