본문 바로가기

Spring security

스프링 시큐리티 기본 API 및 Filter 이해 - Form Login 인증 필터 : UsernamePasswordAuthenticationFilter

스프링 시큐리티 기본 API 및 Filter 이해 - Form Login 인증 필터 : UsernamePasswordAuthenticationFilter

인프런 정수원님의 “스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security"를 보고 작성한 글입니다.

로그인 폼을 통해서 요청일 들어왔을때 인증과 인가가 어떻게 동작하는지 설명합니다.

  1. UsernamePasswordAuthenticationFilter라는 필터가 수행됩니다. 이후
  2. AntPathRequestMatcher(/login) 를 수행하며 인자로 들어오는 경로가 맞는지 확인합니다.
    1. 만약 아니라면 다음 필터로 넘어갑니다.
    2. 스프링 3부터는 requestMatchers가 그 역할을 수행합니다.
  3. 로그인 폼으로부터 username이랑 Password가 들어온것을 추출합니다.
  4. 이를 AuthenticationManager에게 인증을 요청하며 AuthenticationProvider에게 사용자 인증을 위임합니다.
    1. 만약 인증에 실패하면 AuthenticationException을 발생시키며 필터의 처음으로 돌아갑니다.
  5. 인증성공시 User와 인증된 정보를 SecurityContext에 저장합니다. 이때 session에도 같이 저장됩니다.
  6. SuccessHandler를 호출하며 수행합니다.

추가

SpringSecurity 구조도

  • AuthenticationFilter에서 AntPathRequestMatcher(/login) deprecated requestMatchers(/login) 으로 요청 url에 대한 판단을 하고 만약 url이 올바를 경우 Authentication 객체를 만들고 요청에 담겨져 온 Usename과 Password를 추출해서 객체에 넣어준다. 이후 이 객체를 AuthenticationManager에 건네준다.
  • 실질적으로 인증을 하는 것은 AuthenticationProvider이다.
  • 만약 AuthenticationProvider가 인증에 성공하면 Authentication 객체를 새로 생성하고 유저에 대한 정보 (Username + Password, 인증정보)를 만들어서 AuthenticationManager에게 return 한다.
  • AuthenticationManager는 반환받은 Authentication 객체를 AuthenticationFilter에 반환한다.
  • 이후 필터는 AuthenticationFilter는 전달받은 Authentication 객체를 Security Context에 저장한다.