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에 저장
    • 이벤트 게시
    • 성공 핸들러 실행
  • 다른 필터들은 이후 인증된 사용자 기반으로 동작함 (인가, 로그 기록 등)