스프링 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다.
Authentication(인증): 현재 유저가 누구인지 확인 (ex. 로그인)
Authorization(인가): 현재 유저가 어떠한 자원에 접근할 수 있는 권한을 확인
현재 접근한 주체의 정보와 권한을 담는 인터페이스이다.
SecurityContextHolder에 저장되며 SecurityContextHolder 내부에 있는 SecurityContext를 통해 접근이 가능하다.
public interface Authentication extends Principal, Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
Object getCredentials();
Object getDetails();
Object getPrincipal();
boolean isAuthenticated();
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스로 principal이 User의 ID, credentials가 PASSWORD의 역할을 한다. 첫 번째 생성자는 AuthenticationManager에게 넘겨줄 인증 전 객체를 생성하고 두 번째 생성자는 인증이 완료된 객체를 생성한다.
Authentication 객체를 만들고 처리하는 interface
실제 인증은 AuthenticationProvider에서 이루어진다.
구현체인 ProviderManger를 통해 여러 가지 AuthenticationProvider들을 순회하며 인증을 시도한다.
인증 전의 Authentication객체를 받아 인증을 처리하는 역할을 한다.
AuthenticationProvider 인터페이스를 구현한 CustomProvider를 작성해 AuthenticationManager에 등록해 사용이 가능하다
UserDetails 객체를 DB에서 찾아 반환하는 역할을 한다.
UserDetailsService를 구현한 클래스는 DB에서 User정보를 찾아 반환하는 로직을 구현한다.
UserDetails 객체는 사용자의 권한에 대한 정보를 담고있는 객체로Authentication객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용된다.
getAuthorities() 메소드를 통해 사용자의 권한을 조회한다.
참고
Authentication / Authorization 차이점
출처: https://inpa.tistory.com/entry/CS-👨💻-Authentication-vs-Authorization-차이-엄청-쉽게-설명#! [Inpa Dev 👨💻:티스토리]
[이론편] 스프링 시큐리티란 ?
출처: https://velog.io/@soyeon207/SpringBoot-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0%EB%9E%80
[SpringBoot] Spring Security란?
출처: https://mangkyu.tistory.com/76 [MangKyu's Diary:티스토리]