
SecurityFilterChain 빈 등록 방식WebSecurityConfigurerAdapter 상속 구현 방식스프링 시큐리티는 스프링 기반 애플리케이션의 인증(Authentication)과 인가(Authorization)를 담당하는 프레임워크.
스프링 시큐리티는 다양한 인증 방식과 보안 기능을 제공하고 커스터마이징이 가능해서 다양한 요구사항을 충족시킬 수 있음.
스프링 시큐리티는 스프링 프레임워크에 대하여 인증, 권한 부여 등의 기능을 제공함.
특징

AuthenticationFilter
필터 체인에서 인증 요청을 처리하는 역할.인증(일반적으로 사용자 이름 및 비밀번호)을 요청하면 이 필터가 사용자를 인증함.UsernamePasswordAuthenticationToken
사용자 이름과 비밀번호를 포함하는 Authentication의 구체적인 구현체임.
일반적으로 폼 기반 로그인에서 사용됨.
public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationToken {
private static final long serialVersionUID = 620L;
private final Object principal;
private Object credentials;
public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
super((Collection)null);
this.principal = principal;
this.credentials = credentials;
this.setAuthenticated(false);
}
public UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
super(authorities);
this.principal = principal;
this.credentials = credentials;
super.setAuthenticated(true);
}
public static UsernamePasswordAuthenticationToken unauthenticated(Object principal, Object credentials) {
return new UsernamePasswordAuthenticationToken(principal, credentials);
}
public static UsernamePasswordAuthenticationToken authenticated(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
return new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
}
public Object getCredentials() {
return this.credentials;
}
public Object getPrincipal() {
return this.principal;
}
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
Assert.isTrue(!isAuthenticated, "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
super.setAuthenticated(false);
}
public void eraseCredentials() {
super.eraseCredentials();
this.credentials = null;
}
}
UsernamePasswordAuthenticationToken은 Authentication을 implements한 AbstractAuthenticationToken의 자식 클래스.
User의 ID는 Principal이 담당하고, Password는 Credential이 담당함.
UsernamePasswordAuthenticationToken의 첫 번째 생성자는 인증 전의 객체를 생성하고, 두번째 생성자는 인증이 완료된 객체를 생성.
AuthenticationManager
ProviderManager
AuthenticationProvider
UserDetailsService
UserDetails
User
SecurityContextHolder
SecurityContext
Authentication 클래스

로그인을 요청.↓Spring Security AuthenticationFilter로 전달됨.↓AuthenticationFilter는 UsernamePasswordAuthenticationToken을 생성한 뒤 사용자 이름과 비밀번호를 이 토큰에 포함시킴.↓토큰은 AuthenticationManager로 전달됨.AuthenticationManager는 ProviderManager를 포함하고 다양한 AuthenticationProvider를 관리함.↓AuthenticationManager는 등록된 AuthenticationProvider들을 돌아다니면서 토큰을 검증하는 시도를 함.↓↓Authentication 객체를 다시 AuthenticationFilter로 반환.↓AuthenticationFilter는 사용자의 Authentication 객체를 SecurityContextHolder에 저장함.↓@PreAuthorize, @PostAuthorize, @Secured 등과 같은 에노테이션을 사용해서 메서드 레벨에서 권한을 확인하고 사용자에게 액세스 권한이 있는지 확인함.↓UserDetails
스프링 시큐리티에서 사용자의 정보를 기반으로, 인증, 인가 기능을 제공하는 인터페이스.
현재 서비스에서 사용하고 있는 User 클래스에 implements(구현)해서 기존 클래스에 인증, 인가 관련 기능을 부여함.
해당 클래스 인스턴스를 기반으로 스프링 서버 내에서 인증, 인가 작업을 수행하는 것.
만약 실무에 사용하는 경우
getAuthorities() : 계정의 권한 목록을 리턴.
getPassword() : 계정의 비밀번호를 리턴.
getUsername() : 계정의 고유한 값을 리턴. (중복 없는 ID(username), PK)
isAccountNonExpired() : 계정의 만료 여부를 리턴.
isAccountNonLocked() : 계정의 잠김 여부를 리턴.
isEnabled() : 계정의 활성화 여부를 리턴.
UserDetailsService
Authentication
AuthenticationProvider
authenticate()
supports()
AuthenticationManager
SecurityContext
UsernamePasswordAuthenticationToken
GrandAuthority


But 스프링 빈(Bean)은 스프링 컨테이너에서 생성 및 관리하는 컴포넌트들이고,