💡 개요
Spring Security의 인증(Authentication) 과정에서 많은 개념들이 사용되는데, Authentication(인증) 과정의 도식화를 살펴보고 각 개념들이 어떤 역할을 하는지 살펴보고자 한다.
📘 인증 과정 도식화
ex) UsernamePasswordAuthenticationToken(Authentication 객체)이
ProviderManager에 도착하면, ProviderManager는 내부에 있는 AuthenticationProvider 목록을
순회하면서 AuthenticationProvider의 supports() 메서드 return 값이 true인
AuthenticationProvider에게 Authentication 객체를 전달하고,
해당 AuthenticationProvider는 authenticate() 메서드를 실행한다.
📌 GrantedAuthority
개념
- 보안 주체(User 등)에게 부여된 권한을 뜻한다. (roles, scopes 등)
- 사용자 이름/비밀번호 기반 인증을 사용할 때, GrantedAuthority는 일반적으로 UserDetailsService에 의해 로드된다.
📌 Authentication
개념
- 인증에 사용되는 객체로, 인증 시 AuthenticationManager의 파라미터 값으로 전달된다.
- 3가지 요소를 포함하고 있다.
- principal : 사용자를 식별하는 요소
- credentials : 비밀번호
- authorities : 해당 principal에 부여된 권한 (roles, scopes 등)
📌 AuthenticationManager
개념
- Spring Security의 Filter가 Authentication(인증)을 수행하는 방법을 정의한 API로, 인증을 담당한다.
- Spring Security의 필터들에 의해 반환된 Authentication은 SecurityContextHolder에 저장된다.
- 일반적인 구현체는 ProviderManager이다.
📌 ProviderManager
개념
- AuthenticationManager의 구현체이다.
- AuthenticationProvider 목록을 가지고 있다.
구성도
📌 AuthenticationProvider
개념
- 여러 AuthenticationProvider를 ProviderManager에 주입할 수 있다.
- support() 메서드와 authenticate() 메서드가 존재하며, support() 메서드는 처리 가능한 Authentication을 알려주는 역할을 한다.
- authenticate() 메서드는 Authentication 객체를 입력값으로 받으며, 실질적으로 사용자로부터 입력받은 값을 검증해야 하는 메서드이다. 인증에 성공하면 GrantedAuthority 객체가 포함된 Authentication 객체를 반환하고 반환된 Authentication 객체는 SecurityContextHolder에 설정된다.
- 각 AuthenticationProvider는 특정 유형의 인증을 진행한다.
- DaoAuthenticationProvider : username/password 기반 인증 지원
- JwtAuthenticationProvider : JWT 토큰 기반 인증 지원
📌 SecurityContextHolder
개념
- Spring Security의 Authentication model의 핵심이다.
- Spring Security에서 인증된 User의 세부정보를 저장하는 곳
- 특정 User의 값이 SecurityContextHolder에 포함되어 있다면 인증된 사용자로 간주한다.
- SecurityContext를 포함하고 있다.
📌 SecurityContext
개념
- SecurityContextHolder에 포함되어 있다.
- 현재 인증된 User의 Authentication을 포함한다.
구성도
🏴 Reference
docs.spring.io - Authentication Architecture