Spring Security는 Sping Application의 보안(인증, 인가)을 담당한다.
Spring Security는 Filter 기반으로 동작하기 때문에 Spring MVC와 분리되어 관리 및 동작한다.
Spring Security는 Session-Cookie방식으로 인증한다.
Spring Security Architecture를 검색하면 아래의 그림을 많이 볼 수 있다.
해당 그림의 흐름으로 Spring Security의 구조 및 흐름을 알아보자.
1. 사용자가 로그인 요청을 한다. ( Http Request 전달 )
2,3 . AuthenticationFilter에서 AuthenticationTocken을 생성
Spring Security는 Filter를 기반으로 동작하기 때문에 HttpRequest가 다양한 Security관련 Filter를 거치게 된다. 그중의 하나가 AuthenticationFilter이다.
현재 위의 그림의 예시는 UsernamePasswordAuthenticationFilter에 해당하는 것으로 보인다.
https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters
위의 링크는 Security관련 Filter의 정보이다.
UsernamePasswordAuthenticationToken은 Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스이다.
User의 ID가 Principal 역할을 하고, Password가 Credential의 역할을 한다.
4. AuthenticaionManager는 등록된 AuthenticaionProvider(들)을 조회하여 인증을 요구
AuthenticaionManager의 실제 구현체가 ProviderManager이고
ProviderManager는 AuthenticaionProvider(s) 들을 통해서 인증을 진행한다.
public class ProviderManager implements AuthenticationManager, MessageSourceAware, InitializingBean {
public List<AuthenticationProvider> getProviders() {
return this.providers;
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
for (AuthenticationProvider provider : getProviders()) {
try {
result = provider.authenticate(authentication);
// ...
}
}
}
}
5, 6, 7, 8, 9. AuthenticaionProvider는 UserDetailsService를 통해 사용자 정보 조회 및 인증완료된 Authenticaion 전달
10. 인증된 토큰을 SecurityContextHolder에 저장
로그인 이후에는 SecurtiyContextHolder를 통해서 Authentication정보를 조회해 올 수 있다.
모든 접근 주체는 Authentication가 생성된다. 이것은 SecurityContext에 보관되고 사용된다.
public interface Authentication extends Principal, Serializable {
Collection<? extends GrantedAuthority> getAuthorities(); //사용자의 권한 목록
Object getCredentials(); // 비밀번호
Object getDetails(); // 사용자 상세정보
Object getPrincipal(); // ID
boolean isAuthenticated(); //인증 여부
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
'Spring > etc' 카테고리의 다른 글
[Spring] Spring Boot Logging(SLF4J, Logback) (0) | 2021.12.13 |
---|---|
[Spring] Spring Security 로그인 사용자 정보 가져오는 방법 (0) | 2021.12.01 |
[Spring] @PreAuthorize, @PostAuthorize에서 Custom Security Expression 사용하기 (0) | 2021.11.27 |
[Spring] Spring Security Annotation (@PreAuthorize, @PostAuthorize, @Secure) (0) | 2021.11.24 |
[Spring] @WebMvcTest 작성 시 Spring Security 유의사항 (0) | 2021.09.29 |