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

OAuth2 로그인 구현 - Access Token 교환하기

webmaster 2023. 1. 17. 01:15
728x90

OAuth2LoginAuthenticationFilter

OAuth2LoginAuthenticationFilter

  • 인가서버로부터 리다이렉트 되면서 전달된 code를 인가서버의 Access Token으로 교환하고 Access Token 이 저장된 OAuth2LoginAuthenticationTokenAuthenticationManager에 위임하여 UserInfo 정보를 요청해서 최종 사용자에 로그인한다.
  • OAuth2AuthorizedClientRepository를 사용하여 OAuth2AuthorizedClient 를 저장한다.
  • 인증에 성공하면 OAuth2AuthenticationToken 이 생성되고 SecurityContext에 저장되어 인증 처리를 완료한다
  • 요청 매핑 Url : RequestMatcher : /login/oauth2/code/*

OAuth2LoginAuthenticationProvider

OAuth2LoginAuthenticationProvider

  • 인가서버로부터 리다이렉트 된 이후 프로세스를 처리하며  Access Token으로 교환하고 이 토큰을 사용하여 UserInfo 처리를 담당한다
  • Scope에 openid 가 포함되어 있으면(OICD 프로토콜로 인증을 받겠다 의미) OidcAuthorizationCodeAuthenticationProvider를 호출하고 아니면 OAuth2AuthorizationCodeAuthenticationProvider 를 호출하도록 제어한다

OAuth2AuthorizationCodeAuthenticationProvider(일반 인가 서버에서 사용하는 Provider)

OAuth2AuthorizationCodeAuthenticationProvider

  • 권한 코드 부여 흐름을 처리하는 AuthenticationProvider
  • 인가서버에 Authorization Code와 AccessToken의 교환을 담당하는 클래스

OidcAuthorizationCodeAuthenticationProvider(OICD 프로토콜로 인증을 받는 Provider)

OidcAuthorizationCodeAuthenticationProvider

  • OpenID Connect Core 1.0 권한 코드 부여 흐름을 처리하는 AuthenticationProvider이며 요청 Scope에 openid 가 존재할 경우 실행된다

DefaultAuthorizationCodeTokenResponseClient

DefaultAuthorizationCodeTokenResponseClient

  • 인가서버의 token 엔드 포인트로 통신을 담당하며 AccessToken을 받은 후 OAuth2AccessTokenResponse 에 저장하고 반환한다
  • 내부적으로 RestTemplate를 가지고 있어 네트워크 통신을 해서 AccessToken을 가지고 온다.

구조

전체적인 구조

  • provider 같은 경우 2가지 가 존재한다(OAuth2AuthorizationCodeAuthenticationProvider, OidcAuthorizationCodeAuthenticationProvider)
  • OpenID Connection을 통해 인증을 하냐 하지 않느냐에 따라 크게 2가지로 분류되는 것을 알 수 있다.

Access Token 요청 과정

Access Token 요청 과정

  • 1단계에서 code를 발급받고, 이후의 과정부터 설명한다.
  • OAuth2LoginAuthenticationFilter에서 login/oauth2/code/*로 들어오는 정보를 받기 때문에 리다이렉트가 되면 해당 필터를 타게 된다.
  • HttpSessionOAuth2AuthorizationRequestRepository 에서 세션에 저장된 OAuth2AuthorizationRequest 정보를 가지고 와, OAuth2AuthorizationResponse(1단계 이후 가지고 온 정보)를 OAuth2AuthorizationExchange 클레스에 저장한다.
  • OAuth2AuthorizationExchange에 저장된 값을 OAuth2LoginAuthenticationToken 으로 가지고 와, ProviderManager로 전달한다.
  • ProviderManager는 OAuth2LoginAuthenticationProvider를 찾아 토큰을 전달하고, (OAuth2AuthorizationCodeAuthenticationProvider/ OidcAuthorizationCodeAuthenticationProvider)에 전달한다 
    • 현재는 OAuth2AuthorizationCodeAuthenticationProvider 기준으로 설명하겠다.
  • DefaultAuthorizationCodeTokenResponseClient에 전달하여 RestTemplate를 통해 얻은 값을 OAuth2AuthorizationCodeAuthenticationToken에 담는다.
  • DefaultOAuth2UserService에서 OAuth2UserRequest정보를 저장하고, 나중에 인가 서버의 UserInfo 엔드포인트로 전송할 파라미터를 저장한다.

RequestEntity<OAuth2AuthorizationRequest> - 통신 전

RequestEntity<OAuth2AuthorizationRequest>

  • 토큰 엔드포인트
  • 클라이언트 인증을 위한 파라미터로 ClientAuthenticationMethod 는 Basic 이며 Base64(Client ID : Client Secret ) 으로 인코딩되어 있다
  • access token 과 교환하기 위한 파라미터이다

ResponseEntity<OAuth2AccessTokenResponse> - 통신 후

ResponseEntity<OAuth2AccessTokenResponse>

 

 

728x90