View

  이전 글에서 스프링 시큐리티가 인증을 위해 어떤 설계로 구성, 동작하는지 전반적인 아키텍처를 살펴보았다. 객체간의 호출 관계를 텍스트로만 보면 약간 이해가 어려울 수 있는데 공식 도큐먼트에서 설명하고있는 예제를 통해 더 쉽게 이해할 수 있다.

Form Login

  폼 로그인의 아이디, 비밀번호를 폼에 입력해서 인증받을 수 있는 가장 일반적인 경우이다.

임의의 url로 접근했을 때 로그인 페이지로 리다이렉션되기까지...

1. 클라이언트의 /private 요청

  클라이언트가 /private라는 api를 요청했다. 여기서 중요한점은 클라이언트는 인증과정에서 익명으로 판단된 것이다.

2. 접근 거부, AccessDeniedException

  익명 클라이언트의 /private 요청은 SecurityFilterChain에서 익명 클라이언트에게 제공할 수 없다는 판단을 하게되고 이는 AccessDeniedException을 발생시킨다.

3. /login 페이지로 리다이렉션

  AccessDeniedExceptionSpring Security - Architecture 에서 마지막에 언급했던, 스프링 시큐리티에서 두가지 메인 익셉션인 AuthenticationException, AccessDeniedException를 처리하는 필터인 ExceptionTranslationFilter로 전달되고, ExceptionTranslationFilterAuthenticationEntriyPoint에 설정된 페이지로 리다이렉션시키는 응답을 클라이언트에 전송된다. 기본 설정의 경우 LoginUrlAuthenticationEntryPoint가 인스턴스로 사용된다.

로그인 요청

1. 유저 정보를 인증하기 위한 필터

  클라이언트가 폼을 통해 username, password를 입력했다면 해당 요청은 스프링 시큐리티가 제공하는 기본 필터들 중 UsernamePasswordAuthenticationFilter가 인증을 담당하게 된다. UsernamePasswordAuthenticationFilter는 받은 HttpServletRequest 정보(username, password)를 조합해서 Authentication의 구현체인 UsernamePasswordAuthenticationToken을 생성한다.

2. AuthenticatinManager

  생성된 UsernamePasswordAuthenticationToken는 실제 인증 과정을 거치기 위해 AuthenticationManager로 전달된다.

3. 정보 인증에 실패했을 때

  인증 정보가 실패하면 앞서 저장했던 SecurityContextHolder의 내용이 비워지게 되고 AuthenticationFailureHandler에 의해 다음 액션이 정의된다.

4. 정보 인증에 성공했을 때

  인증 정보가 SecurityContextHolder에 저장되고 다양한 모듈들이 호출되는데, 세션 관련 작업을 위한 SessionAuthenticationStrategy, 로그인 성공 이벤트를 위한 AuthenticationSucessHandler가 호출되고 되고 AppliationEventPublisher에서 InteractiveAuthenticationSuccessEvent 발생시킨다.

Reference

Share Link
reply