Spring-Security
폼 인증 필터 / UsernamePasswordAuthenticationFilter
neal89
2025. 5. 20. 10:49
formLogin():
스프링 시큐리티가 기본으로 제공하는 로그인 페이지를 사용.
클라이언트는 웹 폼을 통해서 이름과 비밀번호를 넣고, 시큐리티는 httpservletrequest에서 값을 읽어온다.
formLogin() APi 종류
각 핸들러를 구현하면, defaultSuccessurl, failureurl 보다 우선시 된다.
loginProcessingUrl("/loginProc")
defaultSuccessUrl("/",[alwaysUse])
failureUrl("/failed")
usernameParameter("username")
passwordParameter("password")
failureHandler(AuthenticationFailureHandler) //,인증,실패,시,사용할,AuthenticationFailureHandler를,지정
successHandler(AuthenticationSuccessHandler) //,인증,성공,시,사용할,AuthenticationSuccessHandler를,지정
permitAll()
✔️ 개요
UsernamePasswordAuthenticationFilter
- UsernamePasswordAuthenticationFilter는 로그인 인증을 처리하는 필터이며,
AbstractAuthenticationProcessingFilter를 상속해서 구현되어 있음. - 주로 사용자 이름(username) 과 비밀번호(password) 를 활용한 인증에 사용됨.
- /login 요청을 받아서, 사용자 정보를 기반으로 인증을 시도함.
✔️ 구조 요약
AbstractAuthenticationProcessingFilter (상위 추상 필터)
↓ attemptAuthentication()
⟵⟵⟵⟵⟵⟵⟵⟵⟵ ↓ ⟶⟶⟶⟶⟶⟶⟶⟶⟶⟶⟶⟶⟶⟶
↓ ↓
UsernamePasswordAuthenticationFilter (기본 필터) CustomAuthenticationFilter (필요 시 커스터마이징 가능)
✔️ 흐름도 요약
1. 클라이언트가 POST로 /login 요청
2. UsernamePasswordAuthenticationFilter가 요청을 가로챔
- RequestMatcher로 경로가 맞는지 확인 --> 만약 맞지 않으면? chain.doFilter 호출.
- UsernamePasswordAuthenticationToken 생성
- AuthenticationManager에 토큰을 넘기고, 인증 위임
3. 인증 성공 시:
- UsernamePasswordAuthenticationToken 다시 생성하고, user정보를 넣어준다.
- SessionAuthenticationStrategy ==> 새로운 로그인을 알리고 세션 관련 작업 수행
- SecurityContextHolder에 인증 정보( UsernamePasswordAuthenticationToken) 저장, httpSession에 securityContext 저장됨.
- RememberMeServices.loginSuccess() 호출 (remember-me 사용 시)
- ApplicationEventPublisher가 인증 성공 이벤트를 발행함
- AuthenticationSuccessHandler가 호출됨
4. 인증 실패 시:
- SecurityContextHolder 초기화
- RememberMeServices.loginFail() 호출
- AuthenticationFailureHandler가 호출됨
❓ 질문: 인증 성공 이벤트는 왜 하나의 필터만 통과해도 발생하나요?
==> Spring Security에는 수많은 필터들이 FilterChainProxy에 등록되어 있고 순서대로 동작해.
하지만 인증(Authentication)을 수행하는 필터는 보통 하나야. 그 역할을 맡는 대표적인 필터가 UsernamePasswordAuthenticationFilter 라는 거야.
즉:
- 인증은 여러 필터가 아니라 하나의 필터가 담당해.
- 이 필터가 AuthenticationManager를 통해 인증에 성공한 경우에만 이벤트를 게시하고 성공 핸들러를 호출함.
- 그 이후의 필터들은 인증이 완료된 상태의 SecurityContext를 기반으로 접근 권한을 체크하거나 로그 등 부가적인 작업을 수행함.
따라서 **"하나의 필터만 성공해도 이벤트를 게시한다"**는 게 맞고,
그 이유는 인증이라는 책임은 그 필터 하나에 집중돼 있기 때문이야.
🔁 요약
- 인증은 Spring Security 필터 체인 중 하나의 필터(보통 UsernamePasswordAuthenticationFilter)만 수행함.
- 이 필터가 성공하면:
- SecurityContext에 저장
- 이벤트 게시
- 성공 핸들러 실행
- 다른 필터들은 이후 인증된 사용자 기반으로 동작함 (인가, 로그 기록 등)