#Spring
1. Spring Security Architecture
1.1. 스프링 시큐리티의 구현
스프링 시큐리티는 Servlet Filters
를 기반으로 제공합니다. 그래서 간단히 Filters
에 대해 알고 시작하면 좋으나.. 약식으로 정리하겠습니다 :)
위 그림 처럼 Spring Security는 Filter 하나를 Proxy패턴으로 구현하여 그 기능을 추가해줍니다.
1.2 Authentication
- SecurityContextHolder
- SecurityContext
- Authentication
- GrantedAuthority
- AuthenticationManager
- ProviderManager
- AuthenticationProvider
- Request Credentials with AuthenticationEntryPoint
- AbstractAuthenticationProcessingFilter
1.2.1. SecurityContextHolder
SecurityContextHolder는 보안 주체의 세부 정보를 포함하여 응용프로그램의 현재 보안 컨텍스트에 대한 세부 정보가 저장된다.
1.2.2. SecurityContext
Authentication을 보관하는 역할을 하며, SecurityContext를 통해 Authentication 객체를 꺼내올 수 있다.
1.2.3. Authentication
현재 접근하는 주체의 정보와 권한을 담는 인터페이스다
public interface Authentication extends Principal, Serializable {
// 현재 사용자의 권한 목록을 가져옴
Collection<? extends GrantedAuthority> getAuthorities();
// credentials(주로 비밀번호)을 가져옴
Object getCredentials();
Object getDetails();
// Principal 객체를 가져옴.
Object getPrincipal();
// 인증 여부를 가져옴
boolean isAuthenticated();
// 인증 여부를 설정함
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
1.2.4. AuthenticationManager
인증에 대한 부분은 여기를 통해 처리하게 됨, 실질적으로는 여기에 등록된 AuthenticationProvider에 의해 처리된다.
인증이 성공하면 2번째 생성자를 이용해 인증이 성공한 (isAuthenticated = true) 객체를 생성해서 Context에 저장한다, 그리고 상태 유
지를 위해 세션에 보관한다.
인증이 실패한 경우에는 AuthenticationException을 발생시킨다.
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
}
1.2.5 ProviderManager
AuthenticationManager를 implements한 ProviderManager는 실제 인증 과정에 대한 로직을 가지고 있는
AuthenticationProvider를 List로 가지고 있으며 모든 Provider를 조회하며 인증 로직을 처리한다.
1.2.6 전체적인 Security의 흐름
REF
https://docs.spring.io/spring-security/reference/servlet/getting-started.html