[Spring Security] 폼 기반 인증

🔐 스프링 시큐리티

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

🌊 폼 기반 인증 흐름

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

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

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

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

3. 인증이 실패 시:

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

4. 인증이 성공 시:

  1. SessionAuthenticationStrategy에 새로운 로그인 정보가 전달된다.
  2. SecurityContextHolderAuthentication이 설정된다.
  3. RememberMeServices.loginSuccess가 호출된다.(Remember me 기능이 설정된 경우에만 동작)
  4. ApplicationEventPublisherInteractiveAuthenticationSuccessEvent를 발행한다.
  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