[Spring Security] 인증 처리 흐름 및 구성요소

정윤호·2023년 3월 16일
0

Spring Security의 인증 처리 흐름

Spring Security 인정 처리 절차 흐름도(출처 : 코드스테이츠)


✋ Authentication관련 안내
위 Spring Security 인증 처리 흐름도에서 서로 다른 Authentication 등장하여 혼동의 여지가 있어, 아래의 설명해서는 검증 전 Authentication은 (Unauthenticated)Authentication으로 표기하고, 검증 후 인증된 Authentication은 (Authenticated)Authentication으로 표기합니다.

  1. 사용자가 로그인 폼 등을 이용해 Username(로그인 ID)와 Password롤 포함한 로그인 Request 전송

    1. Spring Security FilterChain 중 UsernamePasswordAuthenticationFilter가 해당 요청 전달 받음
    2. Spring Security의 실질적인 인증 처리 시작
  2. UsernamePasswordAuthenticationFilter는 Username과 Password를 이용해 UsernamePasswordAuthenticationToken 생성

    1. UsernamePasswordAuthenticationToken은 Authentication 인터페이스를 구현한 구현 클래스
    2. (2)에서 생성된 Authentication은 아직 인증되지 않은 (Unauthenticated)Authentication임.
  3. UsernamePasswordAuthenticationToken는 생성한 (Unauthenticated)Authentication을 AuthenticationManager에게 전달

    1. AuthenticationManager : 인증처리 총괄 매니저 역할을 하는 인터페이스
    2. ProviderManager : AuthenticationManager를 구현한 구현 클래스
  4. ProviderManager는 해당 (Unauthenticated)Authentication을 AuthenticationProvider에게 전달

  5. AuthenticationProvider는 UserDetailsService를 통해 UserDetails를 조회

    1. UserDetails : 사용자의 Username, Password, 권한 등이 담긴 정보
  6. 크리덴셜 저장소에 저장된 크리덴셜 조회

  7. 데이터베이스 등 저장소에서 조회한 사용자 정보를 기반으로 UserDetails 생성

  8. UserDetailsService는 새로 생성된 UserDetails를 AuthenticationProvider에게 전달

  9. AuthenticationProvider는 ProviderEncoder를 이용해 전달받은 UserDetails의 암호화된 Password와 (Unauthenticated)Authentication 안에 포함된 Password의 일치하는지 검증

    1. 검증에 성공하면 UserDetails를 이용해 인증된 (Authenticated)Authentication 생성
    2. 검증에 실패하면 Exception 발생

    📝 인증된 Authentication의 구성요소
    Principal(주체), Credential(크리덴셜), GrantedAuthorities(부여된 권한)

  10. AuthenticationProvider는 인증된 Authentication을 ProviderManager에게 전달

  11. ProviderManager는 인증된 Authentication을 UsernamePasswordAuthenticationFilter에게 전달

  12. UsernamePasswordAuthenticationFilter는 SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication을 저장

    1. Spring Security의 세션 정책에 따라서 HttpSession에 저장되어 사용자 인증 상태를 유지
    2. 혹은 HttpSession을 생성하지 않고 무상태(Stateless)를 유지


Spring Security의 인증 컴포넌트

  • UsernamePasswordAuthenticationFilter
    • 일반적으로 로그인 폼에서 제출되는 Username과 Password를 통한 인증을 처리하는 Filter
    • 클라이언트로부터 전달받은 Username과 Password를 Spring Security가 인증 프로세스에서 이용할 수 있도록 UsernamePasswordAuthenticationToken을 생성
  • AbstractAuthenticationProcessingFilter
    - UsernamePasswordAuthenticationFilter가 상속하는 상위 클래스로써 Spring Security에서 제공하는 필터 중 하나
    - HTTP 기반의 인증 요청을 처리(실질적인 인증 시도는 하위 클래스에 위임)
    - 인증에 성공한 인증된 사용자의 정보를 SecurityContext에 저장

    AbstractAuthenticationProcessingFilter의 절차(출처 : https://docs.spring.io)

  • UsernamePasswordAuthenticationToken
    • Spring Security에서 Username/Password로 인증을 수행하기 위해 필요한 토큰
    • 인증 성공 후 인증에 성공한 사용자의 인증 정보가UsernamePasswordAuthenticationToken에 포함되어 Authentication 객체 형태로 SecurityContext에 저장됨
  • Authentication
    • Spring Security에서의 인증 자체를 표현하는 인터페이스로 아래의 정보를 가짐
      • Principal : 사용자를 식별하는 고유 정보
      • Credential : 사용자 인증에 필요한 Password 등을 의미
      • Authorities : 사용자의 접근 권한 목록
  • AuthenticationManager
    • 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스

AuthenticationManager의 역할(출처 : https://docs.spring.io)

- ProviderManager - AuthenticationManager 인터페이스의 구현 클래스 - AuthenticationProvider 관리 및 인증 처리를 위임하는 역할

ProviderManager의 역할(출처 : https://docs.spring.io)

  • AuthenticationProvider
    • ProviderManager로 부터 인증 처리를 위임받아 실질적인 인증 수행을 담당하는 컴포넌트
    • Username/Password 기반의 인증 처리는 DaoAuthenticationProvider가 담당
    • DaoAuthenticationProvider는 UserDetailsService로부터 전달받은 UserDetails를 이용해 인증을 처리함
  • UserDetails
    • 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜(Credential)인 Password 그리고 사용자의 권한 정보를 포함하는 컴포넌트
  • UserDetailsService
    • UserDetails를 로드(load)하는 핵심 인터페이스
  • SecurityContext와 SecurityContextHolder
    - SecurityContext는 인증된 Authentication 객체를 저장하는 컴포넌트
    - SecurityContextHolder는 SecurityContext를 관리하는 역할
    - SecurityContextHolder를 통해 Authentication을 SecurityContext에 설정할 수 있고, 인증된 Authentication 객체에 접근할 수 있음

    SecurityContextHolder의 구조(출처 : https://docs.spring.io)

profile
오늘 하루도 최선을 다하자!!

0개의 댓글