스프링 시큐리티는 인증에 대한 정보들을 제공한다.
인증에 대한 아키텍처는 아래와 같다.
SpringSecurityContextHolder
SecurityContext
SpringSecurityContextHolder
에서 가져온 현재 인증된 사용자 인증을 가지고 있다.Authentication
AuthenticationManager
의 입력이 될 수 있음GrantedAuthority
AuthenticationManager
ProviderManager
AuthenticationManager
의 기본 구현체AuthenticationProvider
ProviderManager
에서 특정 유형의 인증을 진행하는 Provider
AbstractAuthenticationProcessingFilter
일반적인 구조는 위와같이 생겼다.
스프링 시큐리티가 인증된 사용자의 정보를 저장하는 곳이다.
값이 포함되어 있으면 현재 인증된 사용자로 사용된다.
사용자가 인증을 위해 제공한 자격 증명 AuthenticationManager
입력값.
이 상태에서 isAuthenticated()
는 false
를 반환
현재 인증된 사용자를 반환 현재 인증은 SecurityContext
에서 얻을 수 있다.
Authentication
이 포함하고 있는 값들
principal
username
, password
로 인증할 때 UserDetails
가 값들을 포함한다.credentials
authorities
GrantAuthority
권한을 포함한다.사용자에게 부여된 상위 수준의 권한
이 객체는 Authentication.getAuthorities()
에서 얻을 수 있다.
이 권한은 인증받으려는 주체에게 부여된 권한이다.
이 권한은 흔히 말하는 사용자, 관리자 등등 해당 권한을 나타낸다.
이 역할로 특정 URI
에 대한 권한이나 접근 권한을 제어할 수 있게 된다.
username, password 기반 인증을 사용할 시에 권한은 UserDetailService
가 가지고 있다.
이 클래스는 AuthenticationProvider
에서 username, password로 인증하기 위해
해당 사용자 이름, 비밀번호, 기타 속성들을 검색하는데에 사용된다.
UserDetailService
를 커스텀 Bean으로 정의할 수 있다.
이 클래스는 스프링 시큐리티 필터가 인증을 수행하는 방법을 명시한 API이다.
반환되는 인증은 AuthenticationManager
를 호출한 컨트롤러에 의해
SpringSecurityHolder
에 설정된다.
스프링 시큐리티의 필터와 통합하지 않는 경우에는 SecurityContextHolder
를 직접
설정 할 수 있고, AuthenticationManager
를 사용할 필요가 없어진다.
AuthenticationManager
의 구현은 어떤것이든 가능하지만, 기본 구현은 ProviderManager
위에서 말했듯, 이 클래스는 AuthenticationManager
의 구현체이다.
ProviderManager
는 AuthenticationProviders
의 리스트에 위임한다.
각 AuthenticationProvider
는 성공, 실패를 나타내거라 결정할 수 없고
다운스트림 AuthenticationProvider
가 결정하도록 허용할 수 없다.
AuthenticationProvider
중 어느 것도 인증을 할 수 없는 경우에는
인증 예외인 ProviderNotFoundException
이 발생하여 인증이 실패하게 된다.
설명했듯 각 provider들이 특정 유형의 인증을 수행한다.
ProviderManager
는 AuthenticationProvider
가 인증을 수행할 수 없는 경우
상위의 AuthenticationProvider
를 설정하여 구성이 가능하다.
상위 AuthenticationProvider
는 ProviderManager
의 인스턴스이다.
ProviderManager
에 여러 AuthenticationProvider
를 주입할 수 있다.
AuthenticationProvider
들은 저마다의 특정 유형 인증을 수행하게 되어있다.
예를 들어, DaoAuthenticationProvider
는 이름/암호 기반의 인증을 사용하고,
JwtAuthenticationProvider
는 Jwt 토큰 인증을 사용한다.
이 클래스는 사용자의 자격 증명을 인증하기 위한 기본 필터이다.
이 인증이 되기전에 AuthenticationEntryPoint
를 사용하여 HTTP 요청을 한다.
Authentication
으로 인증에 대한 정보들을 쭉 가져온다.
AuthenticationManager
가 그 인증 정보들을 받아 여러 검증들을 수행한다.
성공하면 Success 기본 호출은 AuthenticationSuccessHandler
, 실패하면 Failure로 가서 AuthenticationFailureHandler
호출됨