ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Security] UsernamePasswordAuthenticationFilter의 내부 동작 과정을 알아보자
    스프링 2022. 8. 3. 16:19

    UsernamePasswordAuthenticationFilter 란?

    UsernamePasswordAuthenticationFilter는 Form 데이터 기반의 로그인 처리 필터입니다.

     

    설정한 로그인 url로 오는 요청을 감시하며, 로그인 url이 맞다면 그 요청을 필터가 낚아채서

    Form 데이터 형식으로 전달받은 username과 password 정보가 실제 유저정보와 일치하는지 확인합니다.

     

    정보가 맞다면 Authentication 객체를 담을 SecurityContext를 생성하고 SecurityContextHolder에 저장합니다.

     

     


     

    UsernamePasswordAuthenticationFilter 동작과정

     

    1. UsernamePasswordAuthenticationFilter

    로그인 URL이 날라오면 제일 먼저 UsernamePasswordAuthenticationFilter의 attemptAuthentication 메서드가 실행됩니다.

    username과 password정보를 담아 UsernamePasswordAuthenticationToken을 생성합니다.

     

    생성한 토큰은 getAuthenticationManager()을 통해 얻은 ProviderManager 객체의 authentication() 메서드 파라미터에 넘깁니다.

     

     

    2. ProviderManager(AuthenticationManager)

    파라미터로 전달받은 UsernamePasswordAuthenticationToken을 다시AbstractUserDetailsAuthenticationProvider 객체의

    authentication() 메서드에 전달합니다.

     

     

    3. AbstractUserDetailsAuthenticationProvider (AuthenticationProvider)

    retrieveUser() 메서드는 UserDetails 객체를 리턴해줍니다.

    파라미터로 전달받은 토큰과 토큰을 파싱해서 얻은 username을 retrieveUser() 메서드에 넣어서 호출합니다.

     

     

    4. DaoAuthenticationProvider (AbstractUserDetailsAuthenticationProvider)

    이 메서드에서 우리가 UserDetailService 클래스에서 오버라이딩한 loadUserByUsername이 실행됩니다.

    우리가 처리한 로직에 따라 유저를 인증한 후 UserDetails 객체를 리턴합니다.

     

     

    5. AbstractUserDetailsAuthenticationProvider (AuthenticationProvider)

    retrieveUser() 메서드를 통해 UserDetails 객체를 받으면 check() 메서드를 통해 이상이 없는지 검사합니다.

    createSuccessAuthtication() 메서드에서 UsernamePasswordAuthenticationToken 생성한 다음 그 토큰을 리턴합니다.

     

     

    5-1. check()

    UserDetails 객체 체크

    UserDetails 객체가 락이 걸려있는지 만료가 되어있는지 등 검사합니다.

     

     

    5-2. createSuccessAuthtication

    principal과 authentication의 Credentials, 유저의 권한정보를 생성자에 담아 UsernamePasswordAuthenticationToken를 생성합니다.

     

     

    6.  successfulAuthentication

    UsernamePasswordAuthenticationFilter의 attemptAuthentication 메서드를 통해 로그인 시도 후

    이상이 없다면 successfulAuthentication 메서드가 실행된다.

     

    이 메서드에서는 생성한 Authentication 객체를 담을 SecurityContext를 생성한다.

    그리고 SecurityContextHolder에 SecurityContext 저장한 다음 로그인 성공 핸들러를 호출하여 마무리한다.

Designed by Tistory.