Spring Security: Authentication

John Jun·2023년 7월 11일
0

++Table of Contents
1. Spring Security 기본 구조 및 웹 요청 처리 흐름
2. 인증 처리 흐름
3. 인증 컴포넌트

1. Spring Security 기본 구조와 처리 흐름

  • 기본적인 흐름 이해

사용자가 어떠한 리소스에 접근하기 원할때:
사용자가 Credential(Password)와 함께 보낸 인증 요청을 Spring Security Filter중 하나인, 인증관리자 역할을 하는 AbstractAuthenticationProcessingFilter를 상속하는 필터가 잡아 크리텐셜 저장소에서 사용자의 크리덴셜을 조회, 비교 검증을 수행한다. 유효한 크리덴셜이라면 접근 결정 관리자가 사용자의 Authoritiy를 검증하고 접근의 허용여부를 결정한다.

  • 자바는 클라이언트에서 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로채 특정 처리를 할 수 있게 하는 적절한 포인트인 Servelet Filter를 제공한다. 이때 하나이상의 필터들을 연결해 Filter Chain을 구성할 수 있다.
  • Spring Security는 DelegatingFilterProxy와 FilterChainProxy 클래스를 이용해 느슨하게 Servelet Filter들의 중간에 연결되어 보안 관련 기능을 수행한다.

1. 인증관리자

  1. UsernamePasswordAuthenticationFilter
    (AbstractAuthenticationProcessingFilter상속):
  • 전달받는 인증 데이터를 기반으로 인증을 처리;
    UsernamePasswordAuthenticationFilter의 경우 로그인 폼에서 제출되는 Username과 Password를 통한 인증을 처리한다.
  • UsernamePasswordAuthenticationFilter는 클라이언트로부터 전달받은 Username과 Password를 Spring Security가 인증 프로세스에서 이용할 수 있도록 UsernamePasswordAuthenticationToken을 생성
  1. AbstractAuthenticationProcessingFilter:
  • HTTP 기반의 인증 요청을 처리
  • 실질적인 인증 시도는 하위 클래스에 맡기고, 인증에 성공하면 인증된 사용자의 정보를 SecurityContext에 저장하는 역할을 한다.
    (SecurityContextHolder를 통해 사용자의 인증 정보를 SecurityContext에 저장한 뒤, SecurityContext를 HttpSession에 저장)
  1. UsernamePasswordAuthenticationToken
  • Spring Security에서 Username/Password로 인증을 수행하기 위해 필요한 토큰으로, 인증 성공 후 인증에 성공한 사용자의 인증 정보가 UsernamePasswordAuthenticationToken에 포함되어 Authentication 객체 형태로 SecurityContext에 저장한다.
  1. Authentication
  • Authentication은 Spring Security에서의 인증 자체를 표현하는 인터페이스로 인증을 위해 생성되는 인증 토큰 또는 인증 성공 후 생성되는 토큰은 UsernamePasswordAuthenticationToken과 같은 하위 클래스의 형태로 생성되지만 생성된 토큰을 리턴 받거나 SecurityContext에 저장될 경우에 Authentication 형태로 리턴 받거나 저장된다.
  • Principal

Principal은 사용자를 식별하는 고유 정보

일반적으로 Username/Password 기반 인증에서는 Username이 Principal이 되며, 다른 인증 방식에서는 UserDetails가 Principal이 된다.

  • Credentials

사용자 인증에 필요한 Password를 의미하며 인증이 이루어지고 난 직후, ProviderManager가 해당 Credentials를 삭제

  • Authorities

AuthenticationProvider에 의해 부여된 사용자의 접근 권한 목록.
일반적으로 GrantedAuthority 인터페이스의 구현 클래스는 SimpleGrantedAuthority이다.

  1. AuthenticationManager
  • 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스로 Filter는 AuthenticationManager를 통해 느슨한 결합을 유지하고 있으며, 인증을 위한 실질적인 관리는 AuthenticationManager를 구현하는 구현 클래스를 통해 이루어진다.
  1. ProviderManager
  • AuthenticationManager 인터페이스의 구현 클래스
  • AuthenticationProvider를 관리하고, AuthenticationProvider에게 인증 처리를 위임
  1. AuthenticationProvider
  • AuthenticationProvider는 AuthenticationManager로부터 인증 처리를 위임받아 실질적인 인증 수행을 담당하는 컴포넌트

  • Username/Password 기반의 인증 처리는 DaoAuthenticationProvider가 담당하고 있으며, DaoAuthenticationProvider는 UserDetailsService로부터 전달받은 UserDetails를 이용해 인증을 처리

  1. UserDetails
  • 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해 주는 크리덴셜(Credential)인 Password 그리고 사용자의 권한 정보를 포함하는 컴포넌트이며, AuthenticationProvider는 UserDetails를 이용해 자격 증명을 수행
  1. UserDetailsService
  • UserDetails를 로드(load)하는 핵심 인터페이스

  • loadUserByUsername(String username)을 통해 사용자의 정보를 로드하여 AuthenticationProvider에 인증정보를 UserDetails로 전달

  1. SecurityContext & SecurityContextHolder
  • SecurityContext는 인증된 Authentication 객체를 저장하는 컴포넌트이고, SecurityContextHolder는 SecurityContext를 관리하는 역할을 담당
  • Spring Security는 SecurityContext에 값이 채워져 있다면 인증된 사용자로 간주
    +SecurityContextHolder를 통해 인증된 Authentication을 SecurityContext에 설정할 수 있고 또한 SecurityContextHolder를 통해 인증된 Authentication 객체에 접근할 수 있다.
profile
I'm a musician who wants to be a developer.

0개의 댓글