[Spring Security] 폼 기반 인증
🔐 스프링 시큐리티
🌊 폼 기반 인증 흐름
스프링 시큐리티에서 폼 기반 인증은 주로 UsernamePasswordAuthenticationFilter를 통해 처리된다. UsernamePasswordAuthenticationFilter는 AbstractAuthenticationProcessingFilter를 상속받아 구현되었으며, 기본적인 인증 흐름을 따른다.
사용자이름과 비밀번호를 이용한 인증 과정
1. 사용자가 로그인 정보를 제출하면, UsernamePasswordAuthenticationFilter가 HttpServletRequest에서 사용자이름과 비밀번호를 추출해 UsernamePasswordAuthenticationToken(Authentication의 한 종류)을 생성한다.
2. 생성된 UsernamePasswordAuthenticationToken은 AuthenticationManager에 전달되어 실제 인증 작업이 이루어진다.
3. 인증이 실패 시:
SecurityContextHolder의 내용이 지워진다.RememberMeServices.loginFail이 호출된다.(Remember me 기능이 설정된 경우에만 동작)AuthenticationFailureHandler가 호출된다.
4. 인증이 성공 시:
SessionAuthenticationStrategy에 새로운 로그인 정보가 전달된다.SecurityContextHolder에Authentication이 설정된다.RememberMeServices.loginSuccess가 호출된다.(Remember me 기능이 설정된 경우에만 동작)ApplicationEventPublisher가InteractiveAuthenticationSuccessEvent를 발행한다.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