코드로 보는 스프링 시큐리티 basic authentication

cooper·2023년 10월 2일
0
post-thumbnail

스프링 시큐리티 basic authentication 설정을 스프링 시큐리티에서 어떻게 설정해 나가는지 과정을 살펴보고자 한다.

[1] AbstractHttpConfigurer

(1) AbstractHttpConfigurer

  1. disable() : 해당 AbstractHttpConfigurer 를 비활성화 시키는 기능을 제공하며 builder() 메서드를 통해 HttpSecurityBuilder 를 반환한다.
    • HttpSecurityBuilder : 시큐리티 설정을 관리하는 builder 인터페이스

[2] HttpBasicConfigurer

  1. AbstractHttpConfigurer abstract class 의 구현체이며, Basic Authentication 을 지원하는 설정을 담당하는 구현체이다.

(1) HttpBasicConfigurer.init()

  1. SecurityConfigure interface 의 override 메서드이다.
  2. BasicAuthentication 관련된 MediaTypeRequestMatcher, DefaultEntryPoint, DefaultLogoutHandler 기본 설정을 초기화한다.

(2) HttpBasicConfigurer.configure()

  1. SecurityConfigure interface 의 override 메서드이다.
  2. BasicAuthenticationFilter 설정 (e.g. AuthenticationManager, AuthenticationDetailsSource, RememberMeServices)

[3] AbstractConfiguredSecurityBuilder

(1) AbstractConfiguredSecurityBuilder.dobuild()

  1. init(), configure() : SecurityConfigurer 에 선언된 설정들을 초기화, 설정하는 메서드를 호출한다.
    • 해당 메서드는 SecurityFilterChain bean 을 생성하면 해당 설정들이 세팅된다.
      • e.g. defaultSecurityFilterChain (SecurityFilterChainConfiguration) : 해당 설정은 사용자가 정의하면 해당 설정은 덮어쓰기 된다.(back-off)

[4] Basic Authentication

(1) WWW-Authenticate

  1. WWW-Authenticate header (response) : 사용자 이름과 비밀번호를 제공하라는 의미로 401 status code 와 함께 요청을 반려하는 헤더. 서버에는 각 다른 비밀번호가 있는 영역들이 있을 것이므로 헤더에 해당 영역을 설명한다.
    • 예시 : WWW-Authenticate : Basic realm="localhost"

(2) 요청 흐름

  1. 서버는 클라이언트에게 401 (Unauthorized) status code 를 응답하며, 최소한 한 번의 시도에 포함된 WWW-Authenticate (en-US) 응답 헤더로 권한을 부여하는 방법에 대한 정보를 제공한다.
  2. 서버와 인증을 하기를 원하는 클라이언트는 Authorization 요청 헤더 필드에 인증 정보를 포함함으로써 인증을 수행할 수 있다.
  3. 클라이언트는 대개 사용자에게 비밀번호 프롬프트를 표시할 것이고 정확한 Authorization 헤더를 포함하는 요청을 만들 것입니다.

[5] Basic Authentication in spring security

(1) 요청 흐름

  1. /private URL 에 미인증 요청(unauthenticated request) 하면, AuthorizationFilter 에서 AccessDeniedException 예외를 던진다.
  2. 미인증 이후 ExceptionTraslationFilter 는 인증을 시작한다.
    • AuthenticationEntryPoint 의 구현체인 BasicAuthenticationEntryPoint 는 WWW-Authenticate header 를 반환한다.
  3. WWW-Authenticate header 를 전달받은 client 는 username, password 를 포함하여 요청을 재시도한다.

(2) 인증 과정

  1. BasicAuthenticationFilterHttpServletRequest 에서 username, password 를 추출해 UsernamePasswordAuthenticationToken
    을 생성한다.
  2. 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();
}
profile
막연함을 명료함으로 만드는 공간 😃

0개의 댓글