BackEnd/Spring Security

[Spring Security] AuthenticationManager

샤아이인 2022. 8. 28.

본 글은 Spring Security docs 와 여러 블로그 들을 참고하고, 공부하면서 요약하였습니다.

https://docs.spring.io/spring-security/reference/servlet/authentication/architecture.html#servlet-authentication-authenticationmanager

 

Servlet Authentication Architecture :: Spring Security

ProviderManager is the most commonly used implementation of AuthenticationManager. ProviderManager delegates to a List of AuthenticationProviders. Each AuthenticationProvider has an opportunity to indicate that authentication should be successful, fail, or

docs.spring.io

 

 

1. AuthenticationManager


인증 관리자(AuthenticationManager)는 필터로부터 인증처리를 지시받으면 가지고 있는 인증 처리자(AuthenticationProvider)들 중에서 현재 인증처리를 할 수 있는 Provider를 선택하고, 인증처리를 위임한다.

 

만약 인증에 성공 한다면 반환받은 인증객체를 다시 필터로 전달해준다.


만약, 적절한 Provider를 못찾는다면 자신의 부모ProviderManager에서 Provider를 찾게된다.

부모에게 해당 인증을 처리할 수 있는 Provider가 있으면 인증처리를 위임시키고, 인증객체를 반환받는다.

 

AuthenticationManager 는 인터페이스이며 구현체가 바로 ProviderManager이다.


ProviderManager는 AuthenticationProvider 목록 중 인증처리 요건에 맞는 적절한 Provider를 찾아 인증처리를 위임하는 클래스.
적절한 AuthenticationProvider를 찾지 못하면 부모 ProviderManager에서 AuthenticationProvider 찾아보게 된다.

 

2. 디버깅 해보기

맨 처음 어플리케이션을 실행시킬때 AuthenticationManagerBuilder 에서 authenticationProvider를 추가하게 된다.

 

provider가 추가되고 나면 performBuild() 메서드에서 ProviderManager를 생성하게 된다.

생성자를 통해 ProviderManager를 생성할 때  인자로 직전에 추가해던 DaoAuthenticationProvider가 전달된다.

지금 생성되는 ProviderManager는 맨 처음 생성되었기 때문에 parent 에는 null이 넘어가게 된다.

 

바로 다음에 생성되는 ProviderManager에는 바로 위에서 생성한 ProviderManager가 부모가 된다.

 

두번째로 다시 add할때 AnonymousAuthenticationProvider가 추가되었다.

 

이후 다시 performBuild()가 실행될때를 살펴보자.

이전과 달리 parentAuthenticationManager로 직전에 만든 DaoAuthenticationProvider 가 지정된다.

 

즉 처음에 초기화 될때 ProviderManager를 2개 만드는데, 하나는 부모용 ProviderManager가 되고, 다른 하나는 자식이 된다.

 

이제 로그인페이지를 통해 Form 로그인을 요청해보자.

UsernamePasswordAuthenticationFilter에서 걸리게 된다.

위 메서드 안에서 AuthenticationManger를 찾아와 인증객체를 전달한다.

 

AuthenticationManger의 구현체인 ProviderManager로 넘어오게 된다.

 

부모로 DaoAuthenticationProvider를 가지고 있는 AnonymousAuthenticationProvider를 찾아오게 된다.

 

찾아온 Provider의 supports()를 통해 사용가능한 type인지 확인한다.

AnonymousAuthenticationProvider 는 AnonymousAuthenticationToken을 받는데, UsernamePasswordAuthenticationToken이 넘어와 처리할수가 없다.

 

따라서 result에 null이 담긴다.

이때 result는 null이고, parent는 null이 아닌 DaoAuthenticationProvider 이기 때문에 DaoAuthenticationProvider에서 인증처리를 진행하게 된다.

여기서 생성된 인증객체를 다시 자신을 호출한 Filter로 전달하게 된다.

 

3. 참고

https://catsbi.oopy.io/f9b0d83c-4775-47da-9c81-2261851fe0d0

 

스프링 시큐리티 주요 아키텍처 이해

목차

catsbi.oopy.io

 

댓글