Java_Spring Security

Minki CHO·2023년 1월 17일
0

CodeStates

목록 보기
19/43

Spring Security의 인증 처리 흐름

Spring Security에서는 Spring Security Filter Chain을 통해 보안을 위한 특정 작업을 처리함
? Sprng Security Filter Chain에 사용자의 인증 요청이 전달된다면, 그 다음 처리는?

Spring Security의 컴포넌트로 보는 인증Authentication 처리 흐름


:사용자가 로그인 인증을 위한 요청을 전송할 경우, Spring Security에서 해당 인증 요청을 어떻게 처리하는지 볼 수 있음

1) 로그인 request
:사용자가 로그인 폼 등을 이용해 Username(로그인 ID)과 Password를 포함한 request를 Spirng Security가 적용된 애플리케이션에 전송함
:사용자의 로그인 요청이 Spring Security의 Filter Chain까지 들어오면 여러 Filter들 중에 UsernamePasswordAuthenticationFilter가 해당 요청을 전달 받음
:Spring Security에서의 실질적인 인증 처리는 지금부터 시작임

2) 인증Authentication 생성
:사용자의 로그인 요청을 전달받은 UsernamePasswordAuthenticationFilter는 Username과 Password를 이용해 UsernamePasswordAuthenticationToken(Authentication)을 생성
:UsernamePasswordAuthenticationToken은 Authentication 인터페이스를 구현한 클래스
:여기서의 Authentication은 아직 인증되지 않은 Authentication임

(다음은 참조하고 있있던 AuthenticationManager(구현체인 ProviderManager)에게 인증을 진행하도록 위임함)

3) Authentication 전달
:아직 인증되지 않은 Authentication을 가지고 있는 UsernamePasswordAuthenticationFilter는 아래와 같이 Authentication을 AuthenticationManager에게 전달함

:AuthenticationManager는 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스이고, AuthenticationManager를 구현한 구현 클래스가 ProviderManager임
:ProviderManager가 인증이라는 작업을 총괄하는 실질적인 매니저임

:Spring Security의 ProviderManager 역시 직접 인증을 처리하는 것이 아닌 인증을 처리할 누군가를 찾으며 인증 처리를 대신 맡기는데 이 대신 처리하는 누군가가 AuthenticationProvider임

4) 인증을 위한 Authentication 전달
:ProviderManager로부터 Authentication을 전달받은 AuthenticationProvider는

5) UserDetails 조회
:UserDetailsService를 이용해 UserDetails를 조회함

UserDetails
:데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜Credential인 Passwrod, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트임
:이 UserDetails를 제공하는 컴포넌트가 바로 UserDetailsService임

6) Credential 조회
:UserDetailsService는 5)에서처럼 데이터베이스 등의 저장소에서 사용자의 크리덴셜Credential을 포함한 사용자의 정보를 조회함

7) UserDetails 생성
:데이터베이스 등의 저장소에서 조회한 사용자의 크리덴셜Cridential을 포함한 사용자의 정보를 기반으로 UserDetails를 생성한 후

8) UserDetails 전달
:생성된 UserDetails를 다시 AuthenticationProvider에게 전달

UserDetails를 전달받은 AuthenticationProvider는 PasswordEncoder를 이용해 UserDetails에 포함된 암호화된 Password와 인증을 위한 Authentication안에 포함된 Password가 일치하는지 검증함
검증에 성공하면?
9) 인증된 Authentication 생성 using UserDetail
:UserDetails를 이용해 인증된 Authentication 생성
검증 성공 못하면?
:Exception을 발생하여 인증 처리를 중단함

10) 인증된 Authentication 전달
:AuthenticationProvider는 인증된 Authentication을 ProviderManager에게 전달
:2)에서의 Authentication은 인증을 위해 필요한 사용자의 로그인 정보를 가지고 있으나
이 단계에서 ProviderManager에게 전달한 Authentication은 인증에 성공한 사용자의 정보(Principal, Credential, GrantedAuthortities)를 가지고 있음

11) 인증된 Authentication 전달
:ProviderManager는 인증된 Authentication을 다시 UsernamePasswordAuthenticationFilter에게 다시 전달

12) 인증된 Authentication을 SecurityContext에 저장
:인증된 Authenticationdmf 전달받은 UsernamePasswordAuthenticationFilter는 마지막으로 SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication을 저장
:SecurityContext는 이 후에 Spring Security의 세션 정책에 따라서 HttpSession에 저장되어 사용자의 인증 상태를 유지하기도 하고, HttpSession을 생성하지 않고 무상태를 유지하도 함

핵심
-사용자의 로그인 요청을 처리하는 Spring Security Filter는 UsernamePasswordAuthenticationFilter
-UsernamePasswordAuthenticationToken은 Authentication 인터페이스를 구현한 구현 클래스이고, 여기서의 Authentication은 아직 인증되지 않은 Authentication임
-AuthenticationManager는 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스이고, AuthenticationManager를 구현한 구현 클래스가 ProviderManager임
-UserDetails는 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜Credential인 Password, 그리고 사용자의 권한 정보를 포함하는 컴포넌트
-UserDetails를 제공하는 컴포넌트는 UserDetailsService
-UserDetailsService는 데이터베이스 등의 저장소에서 사용자의 크리덴셜Credential을 포함한 사용자의정보를 조회하여 AuthenticationProvider에 제공함
-UsernamePasswordAuthenticationFilter가 생성하는 Authentication은 인증을 위해 필요한 사용자 로그인 정보를 가지고 있지만, AuthenticationProvider가 생성한 Authentication은 인증에 성공한 사용자의 정보(Principal, Credential, GrantedAuthorities)를 가짐
-인증된 Authentication을 전달받은 UsernamePasswordAuthenticationFilter는 SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication을 저장. SecurityContext는 이후 HttpSession에 저장되어사용자의 인증 상태를 유지함

profile
Developer

0개의 댓글