Spring Security
🧡 스프링 시큐리티의 동작 구조
ApplicationFilterChain
을 의미한다.DelegatingFilterProxy
를 사용한다.DelegatingFilterProxy
는 서블릿 컨테이너의 생명주기와 스프링 애플리케이션 컨텍스트(ApplicationContext
) 사이에서 다리 역할을 수행하는 필터 구현체이다.FilterChainProxy
)를 내부에 가지고 있다. 필터체인 프록시는 스프링 부트 자동 설정에 의해 자동 생성된다.SecurityFilterChain
)을 통해 많은 보안 필터를 사용할 수 있다.별도의 설정이 없다면 스프링 시큐리티에서는 아래와 같이 SecurityFilterChain
에서 사용하는 필터 중 UsernamePasswordAuthenteicationFilter
를 통해 인증을 처리한다.
위 그림의 인증 수행 과정은 다음과 같다.
SecurityFilterhain
으로 작업이 위임되고 그중 UsernamePasswordAuthenticationFilter
(위 그림에서 AuthenticationFilter
에 해당)에서 인증을 처리한다.AuthenticationFilter
는 요청 객체(HttpServletRequest
)에서 username
과 password
를 추출해서 토큰을 생성한다.AuthenticationManager
에게 토큰을 전달한다. AuthenticationManager
는 인터페이스이며, 일반적으로 사용되는 구현체는 ProviderManager
이다.ProviderManager
는 인증을 위해 AuthenticationProvider
로 토큰을 전달한다.AuthenticationProvider
는 토큰의 정보를 UserDetailsService
에 전달한다.UserDetailsService
는 전달받은 정보를 통해 데이터베이스에서 일치하는 사용자를 찾아 UserDetails
객체를 생성한다.UserDetails
객체는 AuthenticationProvider
로 전달되며, 해당 Provider
에서 인증을 수행하고 성공하게 되면 ProviderManager
로 권한을 담은 토큰을 전달한다.ProviderManager
는 검증된 토큰을 AuthenticationFilter
로 전달한다.AuthenticationFilter
는 검증된 토큰을 SecuritycontextHolder
에 있는 SecurityContext
에 저장한다.JWT
https://velog.io/@sunlake123/JWT
🧡
UserDetails
와UserDetailsService
구현
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getUsername();
String getPassword();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
getAuthorities()
: 계정이 가지고 있는 권한 목록을 리턴.getPassword()
: 계정의 비밀번호를 리턴.getUsername()
: 계정의 이름을 리턴한다. 일반적으로 아이디를 리턴.isAccountNonExpired()
: 계정이 만료됐는지 리턴. true
는 만료되지 않았다는 의미.isAccountNonLocked()
: 계정이 잠겨있는지 리턴. true
는 잠기지 않았다는 의미.isCredentialsNonExpired()
: 비밀번호가 만료됐는지 리턴한다. true
는 만료되지 않았다는 의미.isEnabled()
: 계정이 활성화돼 있는지 리턴한다. true
는 활성화 상태를 의미.