[Spring Security] 폼 기반 인증

🔐 스프링 시큐리티

  1. 기본 용어
  2. 아키텍처
  3. 인증 아키텍처
  4. 인증 영속성
  5. 예외 처리
  6. 폼 기반 인증
  7. 기억하기 인증
  8. 인증 간 요청 저장
  9. 인가 아키텍처
  10. 요청 수준 인가 & 메소드 수준 인가

🌊 폼 기반 인증 흐름

스프링 시큐리티에서 폼 기반 인증은 주로 UsernamePasswordAuthenticationFilter를 통해 처리된다. UsernamePasswordAuthenticationFilter는 AbstractAuthenticationProcessingFilter를 상속받아 구현되었으며, 기본적인 인증 흐름을 따른다.

Authenticating Username and Password사용자이름과 비밀번호를 이용한 인증 과정

1. 사용자가 로그인 정보를 제출하면, UsernamePasswordAuthenticationFilter가 HttpServletRequest에서 사용자이름과 비밀번호를 추출해 UsernamePasswordAuthenticationToken(Authentication의 한 종류)을 생성한다.

2. 생성된 UsernamePasswordAuthenticationToken은 AuthenticationManager에 전달되어 실제 인증 작업이 이루어진다.

3. 인증이 실패 시:

  1. SecurityContextHolder의 내용이 지워진다.
  2. RememberMeServices.loginFail이 호출된다.(Remember me 기능이 설정된 경우에만 동작)
  3. AuthenticationFailureHandler가 호출된다.

4. 인증이 성공 시:

  1. SessionAuthenticationStrategy에 새로운 로그인 정보가 전달된다.
  2. SecurityContextHolder에 Authentication이 설정된다.
  3. RememberMeServices.loginSuccess가 호출된다.(Remember me 기능이 설정된 경우에만 동작)
  4. ApplicationEventPublisher가 InteractiveAuthenticationSuccessEvent를 발행한다.
  5. AuthenticationSuccessHandler가 호출된다. 보통 이 핸들러는 SimpleUrlAuthenticationSuccessHandler의 인스턴스로, 로그인 전에 사용자가 접근하려 했던 페이지로 리다이렉트 한다.

🧑‍💻 커스텀 설정

스프링 시큐리티는 사용자 이름과 비밀번호를 통한 폼 기반 인증을 기본적으로 지원한다. 이 방식은 별도의 설정 없이도 활성화되어 있으며, 기본 로그인 페이지를 제공한다.

그러나 서블릿 기반의 설정을 직접 제공할 경우(SecurityFilterChain을 @Bean으로 정의) 폼 기반 로그인을 명시적으로 설정해야 한다.

1
2
3
4
5
public SecurityFilterChain filterChain(HttpSecurity http) {
	http
		.formLogin(withDefaults());
	// ...
}

대부분의 애플리케이션은 커스텀 로그인 폼을 요구하는데, 아래는 커스텀 로그인 폼을 설정하는 방법을 보여준다.

1
2
3
4
5
6
7
8
public SecurityFilterChain filterChain(HttpSecurity http) {
	http
		.formLogin(form -> form
			.loginPage("/login")
			.permitAll()
		);
	// ...
}

참고

Leave a comment