1. Spring Security의 인증 처리 흐름을 이해할 수 있다.
2. Spring Security의 핵심 컴포넌트인 인증 컴포넌트의 역할을 이해할 수 있다.
- Spring Security의 인증 처리 흐름
🗣️ Spring Security는 Spring Security Filter Chain을 통해 보안을 위한 특정 작업을 처리
🗣️ 사용자 인증 요청이 특정 Filter에 도달했을 때, Spring Security 컴포넌트들이 어떤 과정을 거쳐 처리하는지의 흐름을 학습해보자❗️
✔︎ UsernamePasswordAuthenticationFilter
✔︎ UsernamePasswordAuthenticationToken
Authentication
인터페이스를 구현한 구현 클래스Authentication
을 의미✔︎ AuthenticationManager
✔︎ ProviderManager
AuthenticationManager
를 구현한 구현 클래스✔︎ UserDetails
크리덴셜(Credential)
인 Password, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트✔︎ UserDetailsService
UserDetails
를 제공하는 컴포넌트AuthenticationProvider
에게 제공✔︎ UsernamePasswordAuthenticationFilter
가 생성하는 Authentication
✔︎ AuthenticationProvider
가 생성한 Authentication
✔︎ 인증된 Authentication을 전달받은 UsernamePasswordAuthenticationFilter
SecurityContextHolder
를 이용해 SecurityContext
에 인증된 Authentication 저장SecurityContext
는 이후 HttpSession에 저장되어 사용자의 인증 상태 유지
- Spring Security의 인증 컴포넌트
🗣️ 앞서 알아본 흐름에 Spring Security에서 지원하는 인증 컴포넌트들의 내부 코드를 들여다 보며 처리 흐름을 확실히 내 것으로 만들자❗️
✔︎ 클라이언트로부터 전달받은 Username과 Password를 Spring Security가 인증 프로세스에서 이용할 수 있도록 UsernamePasswordAuthenticationToken
생성
⭐️ doFilter()
: Filter에서 어떤 처리를 하는 시작점
✔︎ HTTP 기반의 인증 요청을 처리하지만 실질적인 인증 시도는 하위 클래스에 맡기고, 인증에 성공하면 인증된 사용자의 정보를 SecurityContext에 저장하는 역할
✔︎ Username/Password로 인증을 수행하기 위해 필요한 토큰
✔︎ 인증 성공 후, 인증에 성공한 사용자의 인증 정보가 UsernamePasswordAuthentivationToken
에 포함되어 Authentication
객체 형태로 SecurityContext
에 저장
⭐️ unauthenticated()
메서드 : 인증에 필요한 용도의 UsernamePasswordAuthenticationToken객체 생성
⭐️ authenticated()
메서드 : 인증에 성공한 이후 SecurityContext에 저장될 UsernamePasswordAuthenticationToken객체 생성
✔︎ Spring Security에서의 인증 자체를 표현하는 인터페이스
✔︎ 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스
✔︎ 인증을 위한 실질적인 관리는 AuthenticationManager를 구현하는 구현 클래스를 통해 이루어짐
✔︎ AuthenticationProvider를 관리하고, AuthenticationProvider에게 인증 처리를 위임하는 역할
✔︎ AuthenticationManager
로부터 인증 처리를 위임받아 실질적인 인증 수행을 담당하는 컴포넌트
⭐️ AuthenticationProvider
인터페이스의 구현 클래스는 AbstractUserDetailsAuthenticationProvider
이고,
DaoAuthenticationProvider
는 AbstractUserDetailsAuthenticationProvider
를 상속한 확장 클래스
⭐️ 따라서 AbstractUserDetailsAuthenticationProvider
추상 클래스의 authenticate()
메서드에서부터 실질적 인증 처리가 시작
✔︎ 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자 자격을 증명해주는 크리덴셜인 Password, 그리고 사용자 권한정보를 포함하는 컴포넌트
✔︎ AuthenticationProvider
는 UserDetails
를 이용해 자격 증명 수행
⭐️ 사용자의 정보를 메모리에서 로드하든 데이터베이스에서 로드하든 Spring Security가 이해할 수 있는 UserDetails로 리턴해주기만 하면 됨
✔︎ UserDetails를 로드(load)하는 핵심 인터페이스
✔︎ 인증된 Authentication 객체를 저장하는 컴포넌트
✔︎ SecurityContext를 관리하는 역할 담당
⭐️ SprnigContextHolder
에 의해 SecurityContext
값이 채워져 있다면, 인증된 사용자로 간주
⭐️ 그림과 같이,
SecurityContextHolder
가 SecurityContext
를 포함하고 있는 것은 SecurityContextHolder
를 통해 인증된 Authentication
을 SecurityContext
에 설정 가능
⭐️ 또한,
SecurityContextHolder
를 통해 인증된 Authentication
객체에 접근할 수 있다는 것을 의미
☞ 학습 분량은 한정되어 있으나, 그 한정된 량의 압축된 이해해야할 정보들이 낯설고 많은 하루였다 ,,
Spring Security에서 지원하는 수많은 컴포넌트들을 만나봤고, 해당 코드들을 살펴보며 특징들을 파악할 수 있었는데...
겁나 어렵다 ... 다시 봐도 어렵고 ... 또 어렵다 ... 🤯🤯🤯
그렇지만, Spring Security가 아니였다면 ,, 배워야할 내용들이 더 어려웠겠지 ^^..? 라고 스스로 위로를 하며 무한 복습 ...
내일은 권한 부여에 관한 내용을 학습하게 된다.
Authentication과 Authorization의 차이점을 명확히 해둬야 내일 학습에도 도움될 것 같다 :)
・ Spring Security 권한 부여 구성요소 이해