본문 바로가기

TIL

[Spring Security][인증 구성요소 이해]

728x90

Spring Security에서는 Spring Security Filter Chain을 통해 보안을 위한 특정 작업을 처리한다.

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

사용자가 로그인 인증을 위한 요청을 전송할 경우, Spring Security에서 해당 인증 요청을 어떻게 처리하는지를 한눈에 볼 수 있는 Spring Security의 핵심 컴포넌트로 구성된 인증처리 흐름이다.

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

 

  1. 사용자가 로그인 폼등을 이용해 UserName(로그인ID)과 Password를 포함한 request를 Spring Security가 적용된 애플리케이션에 전송한다
    사용자의 로그인 요청이 Spring Securitydml Filter Chain까지 들어오면 여러 Filter들 중에서 UsernamePasswordAuthenticationFilter가 해당요청을 전달 받는다.
  2. 사용자의 로그인 요청ㅇ르 전달받은 UsernamePasswordAuthenticationFilter는 Username과 Password를 이용해 2)와 같이 UsernamePasswordAuthenticationToken을 생성한다
    UsernamePasswordAuthenticationToken은 Authentication 인터페이스를 구현한 구현 클래스이며, 여기서의 Authentication은 아직 인증이 되지않은 Authentication이다.
  3. 아직 인증되지 않은 Authentication을 가지고있는 UsernamePasswordAuthenticationFilter는 3)과 같이 해당 Authentication을 AuthenticationManager에게 전달한다
    AuthenticationManager는 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스이고, AuthenticationManger를 구현한 구현 클래스가 바로 ProviderManager이다.
    즉 ProviderManager가 인증이라는 작업을 총괄하는 실질적인 매니저 인것이다
    ※현실세계의 매니저 처럼 Spring Security의 ProviderManager 역시 직접 인증을 처리하는 것이 아니라 인증을 처리할 누군가를 찾은 뒤 인증 처리를 대신 맡긴다 그 누군가는 AuthenticationProvider이다.
  4. 4)와같이 ProviderManager로부터 Authentication을 전달 받은 AuthenticationProvider는 5)와같이 UserDetailsService를 이용해 UserDetails를 조회한다
    UserDetails는 데이터베이스등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜인 Password, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트이다 그리고 이 UserDetails를 제공하는 컴포넌트가 바로 UserDetailsService이다.
  5. UserDetailsService는 5)에서 처럼 데이터베이스 등의 저장소에서 사용자의 크리덴셜을 포함한 사용자의 정보를 조회한다.
  6. 데이터베이스 등의 저장소에서 조회한 사용자의 크리덴셜을 포함한 사용자의 정보를 기반으로 7)과 같이 UserDetails를 생성한 후, 생성된 UserDetails 를 다시 AuthenticationProvider에게 전달한다.
  7. UserDetails를 전달 받은 AuthenticationProvider는 PasswordEncoder를 이용해 UserDetails에 포함된 암호화 된 Password와 인증을 위한 Authentication 안에 포함된 Password가 일치하는지 검증한다
    검증에 성공하면 UserDetails를 이용해 인증된 Authentication을 생성한다
    만약 검증에 성공하지 못하면 Exception을 발생시키고 인증 처리를 중단한다
  8. 10) AuthenticationProcvider는 인증된 Authentication을 ProviderManager에게 전달한다
    2)에서의 Authentication은 인증을 위해 필요한 사용자의 로그인 정보를 가지고 있지만, 이단계에서 ProviderManager에게 전달한 Authentication은 인증에 성공한 사용자의 정보(Principal,Credential,GrantedAutheorities)를 가지고있다
  9. 이제 ProviderManager는 11)과 같이 인증된 Authentication을 다시 UsernamePasswordAuthenticationFilter에게 전달한다
  10. 인증된 Authentication을 전달 받은 UsernamePasswordAuthenticationFilter는 마지막으로 12)와 같이 SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication을 저장한다 그리고 SecurityContext는 Spring Security의 세션 정책에 따라 HttpSession에 저장되어 사용자의 인증 상태를 유지하기도하고, HttpSession을 생성하지 않고 무상태를 유지하기도 한다

Point

  • 사용자의 로그인 요청을 처리하는 Spring Security Filter는 UsernamePasswordAuthenticationFilter 이다.
  • UsernamePasswordAuthenticationToken은 Authentication 인터페이스를 구현한 구현 클래스이며, 여기서의 Authentication 은 ⭐ 아직 인증이 되지 않은 Authentication을 의미한다.
  • AuthenticationManager는 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스이고, AuthenticationManager를 구현한 구현 클래스가 ProviderManager 이다.
  • UserDetails는 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜(Credential)인 Password, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트이다.
  • UserDetails 를 제공하는 컴포넌트가 바로 UserDetailsService 입니다.
  • UserDetailsService 는 데이터베이스 등의 저장소에서 사용자의 크리덴셜(Credential)을 포함한 사용자의 정보를 조회하여 AuthenticationProvider 에게 제공한다.
  • UsernamePasswordAuthenticationFilter가 생성하는 Authentication인증을 위해 필요한 사용자의 로그인 정보를 가지고 있지만, ⭐ AuthenticationProvider 가 생성한 Authentication인증에 성공한 사용자의 정보(Principal, Credential, GrantedAuthorities)를 가지고 있다.
  • 인증된 Authentication을 전달 받은 UsernamePasswordAuthenticationFilter는 SecurityContextHolder를 이용해 SecurityContext 에 인증된 Authentication을 저장한다. SecurityContext는 다시 HttpSession 에 저장되어 사용자의 인증 상태를 유지한다.
728x90

'TIL' 카테고리의 다른 글

[Spring Security] [세션/토큰 방식]  (1) 2022.11.23
[Spring Security][인증 컴포넌트]  (0) 2022.11.22
[Spring Security][Web요청 처리 흐름]  (0) 2022.11.20
[인증/보안][SQL Injection][CSRF]  (0) 2022.11.19
[인증/보안][Session]  (0) 2022.11.19