스프링 시큐리티 basic authentication 설정을 스프링 시큐리티에서 어떻게 설정해 나가는지 과정을 살펴보고자 한다.
- disable() : 해당 AbstractHttpConfigurer 를 비활성화 시키는 기능을 제공하며 builder() 메서드를 통해
HttpSecurityBuilder
를 반환한다.
HttpSecurityBuilder
: 시큐리티 설정을 관리하는 builder 인터페이스
- AbstractHttpConfigurer abstract class 의 구현체이며,
Basic Authentication
을 지원하는 설정을 담당하는 구현체이다.
- SecurityConfigure interface 의 override 메서드이다.
- BasicAuthentication 관련된 MediaTypeRequestMatcher, DefaultEntryPoint, DefaultLogoutHandler 기본 설정을 초기화한다.
- SecurityConfigure interface 의 override 메서드이다.
- BasicAuthenticationFilter 설정 (e.g. AuthenticationManager, AuthenticationDetailsSource, RememberMeServices)
- init(), configure() : SecurityConfigurer 에 선언된 설정들을 초기화, 설정하는 메서드를 호출한다.
- 해당 메서드는 SecurityFilterChain bean 을 생성하면 해당 설정들이 세팅된다.
- e.g. defaultSecurityFilterChain (SecurityFilterChainConfiguration) : 해당 설정은 사용자가 정의하면 해당 설정은 덮어쓰기 된다.(back-off)
[4] Basic Authentication
(1) WWW-Authenticate
WWW-Authenticate
header (response) : 사용자 이름과 비밀번호를 제공하라는 의미로 401 status code 와 함께 요청을 반려하는 헤더. 서버에는 각 다른 비밀번호가 있는 영역들이 있을 것이므로 헤더에 해당 영역을 설명한다.
- 예시 : WWW-Authenticate : Basic realm="localhost"
(2) 요청 흐름
- 서버는 클라이언트에게 401 (Unauthorized) status code 를 응답하며, 최소한 한 번의 시도에 포함된 WWW-Authenticate (en-US) 응답 헤더로 권한을 부여하는 방법에 대한 정보를 제공한다.
- 서버와 인증을 하기를 원하는 클라이언트는 Authorization 요청 헤더 필드에 인증 정보를 포함함으로써 인증을 수행할 수 있다.
- 클라이언트는 대개 사용자에게 비밀번호 프롬프트를 표시할 것이고 정확한 Authorization 헤더를 포함하는 요청을 만들 것입니다.
[5] Basic Authentication in spring security
(1) 요청 흐름
- /private URL 에 미인증 요청(unauthenticated request) 하면,
AuthorizationFilter
에서 AccessDeniedException
예외를 던진다.
- 미인증 이후
ExceptionTraslationFilter
는 인증을 시작한다.
- AuthenticationEntryPoint 의 구현체인 BasicAuthenticationEntryPoint 는 WWW-Authenticate header 를 반환한다.
WWW-Authenticate
header 를 전달받은 client 는 username, password 를 포함하여 요청을 재시도한다.
(2) 인증 과정
BasicAuthenticationFilter
는 HttpServletRequest
에서 username, password 를 추출해 UsernamePasswordAuthenticationToken
을 생성한다.
- AuthenticationManager 에 토큰을 넘겨 인증을 한다.
- fail
- SecurityContextHolder 를 비운다.(clear out)
- RememberMeServices.loginFail 을 호출한다. (만약 설정되지 않았을 경우, 미동작)
- AuthenticationEntryPoint을 호출해 WWW-Authenticate 헤더를 다시 전달한다.
- success
- SecurityContextHoler 에 인증 객체를 보낸다.
- RememberMeServices.loginSuccess 을 호출한다.
- BasicAuthenticationFilter 의 FilterChain.doFilter(request,response) 을 호출의 이후 로직을 진행시킨다.
(3) 설정 방법
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
http
.httpBasic(withDefaults());
return http.build();
}