Spring Security 인증 컴포넌트의 인터랙션 과정

 

  • UsernamePasswordAuthenticationFilter 는 Username/Password 기반의 인증 요청을 처리한다.
    • UsernamePasswordAuthenticationToken 생성
      • 아직 인증되지 않은 Authentication 객체
  • AuthenticationManager는 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스.
  • ProviderManager는 AuthenticationManager를 구현한 구현 클래스
  • UserDetails는 사용자의 자격을 증명해주는 크리덴셜(Credentials) 과 권한 정보를 가지고 있는 객체.
  • UserDetailsService가 사용자의 Credential과 권한 정보를 조회해서 UserDetails 를 생성.
  • UserDetailsService가 AuthenticationProvider에게 UserDetails 를 전달.
  • AuthenticationProvider는 전달 받은 UserDetails에서 패스워드가 일치하는지 검증.
  • AuthenticationProvider가 패스워드 검증에 성공하면 인증에 성공한 사용자의 정보(Principal, Credential, GrantedAuthorities)를 포함한 Authentication을 생성.
  • 인증된 Authentication을 전달 받은 UsernamePasswordAuthenticationFilterSecurityContextHolder를 이용해 SecurityContext인증된 Authentication을 저장.
    SecurityContext는 다시 HttpSession에 저장되어 사용자의 인증 상태를 유지.

 

Spring Security의 인증 컴포넌트

1️⃣ UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter

  • Username/Password 방식의 인증 처리의 시작점

2️⃣ UsernamePasswordAuthenticationToken

  • 사용자의 인증 처리가 되기 전에는 인증되지 않은 Authentication.
    • Username과 Password 정보를 포함하고 있다.
  • 사용자의 인증 처리가 된 이후에는 인증된 Authentication
    • Principal, Authorities를 포함하고 있다.
    • Credentials 정보는 민감한 정보이므로 인증 이 후에는 제거된다.

3️⃣ AuthenticationManager

  • 인증 처리를 지시하는 매니저 역할을 한다.
  • 인증 매니저 계의 총 지배인

4️⃣ ProviderManager

  • AuthenticationManager의 구현 클래스
  • 인증 매니저 계의 지배인
  • 인증이 성공적으로 이루어진 후, Crendentials를 제거한다.
    • 인증 끝났으니까 민감한 정보는 가지고 있을 필요가 없음.

5️⃣ AuthenticationProvider

  • 인증된 사용자인지를 판단하는 역할
  • 인증 매니저의 지시를 받는 현장 담당자 역할

6️⃣ UserDetails

  • 크리덴셜 저장소에 저장된 크리덴셜 정보를 가지고 있는 객체
  • AuthenticationProvider는 UserDetailsService로부터 UserDetails를 전달 받는다.

7️⃣ UserDetailsService

  • UserDetails 객체를 생성해서 AuthenticationProvider에게 제공하는 역할을 한다.

8️⃣ SecurityContext와 SecurityContextHolder

  • 인증된 Authentication 정보를 저장하는 저장 객체
  • SecurityContext는 인증 성공 이 후, HTTP Session에 저장된다.
  • HTTP Session은 최종적으로 StandardManager의 상위 클래스인 ManagerBase에서 관리된다.
  • HTTP Session에 누가 저장 할까?
    • 최초 인증에 성공할 경우에는 UsernamePasswordAuthenticationFilter에서  HttpSessionSecurityContextRepository를 이용해 HTTP Session에 저장한다.
    • 인증 이 후에 재요청 시에는 SecurityContextPersistenceFilter가 저장한다.
      • 인증 이 후 재요청 시의 프로세스는 대략 아래와 같다.
        • HTTP 요청
        • --> SecurityContextPersistenceFilter가 HTTP Session에서 SecurityContext를 꺼낸 후, SecurityContextHolder에 저장
        • -> 이 후, 요청이 끝나는 시점에 SecurityContextPersistenceFilter의 finally 블럭에서
          • SecurityContextHolder에 저장된 SecurityContext를 지운 뒤,
          • --> HttpSessionSecurityContextRepository를 이용해 HTTP Session에 SecurityContext를 다시 저장한다.

SecurityContext의 구조

 

+ Recent posts

출처: http://large.tistory.com/23 [Large]