스프링 시큐리티 OAuth2/OAuth2LoginConfigurer 초기화 이해

OAuth2 로그인 구현 - Authorization Code 요청하기

webmaster 2023. 1. 17. 00:37
728x90

OAuth2AuthorizationRequestRedirectFilter

OAuth2AuthorizationRequestRedirectFilter

  • 클라이언트는 사용자의 브라우저를 통해 인가 서버의 권한 부여 엔드포인트로 리다이렉션하여 권한 코드 부여 흐름을 시작한다.
  • 요청 매핑 Url
    • AuthorizationRequestMatcher : /oauth2/authorization/{registrationId}*
    • AuthorizationEndpointConfig.authorizationRequestBaseUri 통해 재정의될 수 있다

DefaultOAuth2AuthorizationRequestResolver

DefaultOAuth2AuthorizationRequestResolver

  • 웹 요청에 대하여 OAuth2AuthorizationRequest 객체를 최종 완성한다
  • /oauth2/authorization/{registrationId}와 일치하는지 확인해서 일치하면 registrationId를 추출하고 이를 사용해서 ClientRegistration을 가져와 OAuth2AuthorizationRequest 를 빌드한다.

OAuth2AuthorizationRequest

OAuth2AuthorizationRequest

  • 토큰 엔드포인트 요청 파라미터를 담은 객체로서 인가 응답을 연계하고 검증할 때 사용한다

OAuth2AuthorizationRequestRepository

  • 인가 요청을 시작한 시점부터 인가 요청을 받는 시점까지 (리다이렉트) OAuth2AuthorizationRequest 를 유지해 준다

Code를 받아오고 리다이렉트 되는 과정

 

Code를 받아오고 리다이렉트 되는 과정

  • Request를 보낸다 -> oauth2/authorization/{registrationId}
  • OAuth2AuthorizationRequestRedirectFilter 가 요청을 받게 되고 내부적으로  DefaultOAuth2AuthorizationRequestResolver를 사용해 처리한다.
    • /oauth2/authorization/{registrationId} RequestMatcher를 이용하여, request 값과 비교하며, 일치하면 진행하고 실패 시 진행하지 않는다.
  • 일치할 경우, /login/oauth2/code/{registrationId}를 통해 OAuth2AuthorizationRequest 객체를 만들고 이를HttpSessionOAuth2AuthorizationRequestRepository에 저장한다.
    • 인가서버로부터 리다이렉트 된 후 authorizationRequest 객체를 다시 참조하기 위함
       
    • 세션을 사용하지 않을 경우 쿠키에 저장해서 참조하도록  OAuth2AuthorizationRequestRepository 를 재정의 할 수 있다
    • 해당 값들을 통해 결국 sendRedirect 과정을 거쳐 리다이렉트 하게 된다.
  • 일치하지 않을 경우, OAuth2AuthorizationCodeGrantFilter에서 code와 state 값이 있는지를 확인하고, 부정확하면, FilterSecurityInterceptor에서 ExceptionTranslationFilter에서 등록된 LoginUrlAuthenticationEntryPoint를 호출하고 AuthenticationEntryPoint 에 설정된 Url로 이동한다 -> 다시 인증을 받도록 유도한다.
    • Authorization Code 방식일 때만 이렇게 동작한다

 

 

 

728x90