SpringSecurity Architecture
- 스프링 보안 인증 프로세스에 관련된 클래스 및 필터 목록 을 시연하기 위한 다이어그램
1. HttpRequest 수신
- 스프링 시큐리티는 일련의 필터를 갖고 있다.
- 따라서 요청이 오면 인증과 인가를 위한 필터 체인을 거치게 된다.
- 사용자 인증 요청이 있는 경우, 인증 메커니즘/모델에 기반한 관련 인증 필터를 찾을 때까지 필터 체인을 거치게 된다.
HTTP 기본 인증 요청은 BasicAuthenticationFilter에 도달할 때까지 필터체인을 거친다.
ex)
- HTTP 다이제스트 인증 요청이 DigestAuthenticationFilter에 도달할 때까지 필터 체인을 통과한다.
- 로그인 양식 제출 요청(로그인 양식 인증 요청)이 UsernamePasswordAuthenticationFilter에 도달할 때까지 필터체인을 거친다.
- X509 인증 요청이 X509AuthenticationFilter에 도달할 때까지 필터 체인을 통과한다.
2. 사용자 자격증명 기반 AuthenticationToken 생성
- 관련 AuthenticationFilter에서 인증 요청을 받으면 수신된 요청에서 사용자 이름과 암호를 추출한다. (인증 메커니즘의 대부분은 사용자 이름과 암호를 요구한다.)
- 그 후 추출된 사용자 자격 증명 기반으로 인증 객체를 생성한다.
- 추출된 자격증명이 사용자 이름과 암호인 경우 UsernamePasswordAuthenticationToken은 사용자 이름과 비밀번호를 추출/발견하여 생성된다.
3. AuthenticationManager에게 위임하기 위한 AuthenticationToken생성
- UsernamePasswordAuthenticationToken객체를 생성한 후에 AuthenticationManager의 authenticate 메서드를 호출하기 위해 사용된다.
- AuthenticationManager는 단지 인터페이스이며 실제 구현체는 ProviderManager이다.
- ProviderManager는 사용자 요청을 인증하는데 사용하기 위해 AuthenticationProvider를 설정하기 위한 목록을 갖고 있다.
- ProviderManager는 제공된 각 AuthenticationProvider를 검토하고 전달된 Authentication 객체를 기반으로 사용자 인증을 시도한다. (UsernamePasswordAuthenticationToken)
4. AuthenticationProvider 목록으로 인증 시도
- AuthenticationProvider는 제공된 인증 객체로 사용자 인증을 시도한다.
- 프레임워크와 함께 제공되는 기존 Authentication Provider 중 일부
- CasAuthenticationProvider
- JaasAuthenticationProvider
- DaoAuthenticationProvider
- OpenIDAuthenticationProvider
- RememberMeAuthenticationProvider
- LdapAuthenticationProvider
5. UserDetailsService가 필요한가 ?
- 일부 AuthenticationProvider는 사용자 이름 기반으로 사용자 세부 정보를 검색하기 위하여 UserDetailsService를 사용할 수 있다. (DaoAuthenticationProvider)
6 ~ 7. UserDetails와 User
- UserDetailsService는 username 기반으로 UserDetail (실제 구현은 User)를 검색한다.
8. Authentication 과 AuthenticationException
- 사용자가 인증에 성공하면 완전히 채워진 Authentication 객체가 반환된다.
- 그렇지 않은 경우 AuthenticationException가 발생한다.
- AuthenticationProvider 인터페이스에 따르면, 성공적으로 인증하는 경우 AuthenticationProvider는 완전히 채워진 인증 객체를 정확히 반환하거나, 예외 발생 시 AuthenticationProvider 예외를 던진다.
- Fully populated Authentication Object란
- authenticated - true
- grant authorities list
- user credentials (username only)
- AuthenticationException가 예외 발생하는 경우, 인증 메커니즘을 지원하는 AuthenticationEntryPoint에 의해 처리된다.
9. Authentication 완료
- AuthenticationManager는 획득한 Fully populated Authentication객체를 관련 AuthenticationFilter로 반환한다.
10. SecurityContext에서 Authentication 객체를 설정
- 관련된 AuthenticationFilter가 획득한 Authentication 객체를 향후 필터 사용을 위하여 SecurityContext에 저장한다. (Authorization Filters를 위해 사용)
SecurityContextHolder.getContext().setAuthentication(authentication);
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBatch] 예제로 공부하기 (0) | 2020.08.18 |
---|---|
[Spring] JWT 기반 인증 API Server (0) | 2020.08.10 |
[JWT] JWT(Json Web Token) (0) | 2020.07.04 |
[SpringBoot] 기존 테스트에 시큐리티 적용 (0) | 2020.06.02 |
[SpringBoot] OAuth2 Naver Login (2) | 2020.06.01 |