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

OAuth2 로그인 구현 - UserInfo 엔드포인트 요청하기

webmaster 2023. 1. 22. 12:44
728x90

DefaultOAuth2UserService

  • public OAuth2User loadUser(OAuth2UserRequest userRequest)

OAuth2UserRequestEntityConverter

OAuth2UserRequestEntityConverter
  • OAuth2UserRequest 를 RequestEntity 로 컨버터 한다

RestOperations

  • RequestEntity 로 인가서버에 요청하고 ResponseEntity 로 응답받는다
  • OAuth2User 타입의 객체를 반환한다

흐름

  • 인가 서버에게 /userinfo 엔드 포인트로 요청을 하고, 이때 사용되는 서비스가 DefaultOAuth2UserService이다.
  • 인가 서버가 응답으로 ResponseEntity에 값을 가지고 변환작업(ResponseEntity -> DefaultOAuth2User)을 한다.
  • DefaultOAuth2User를 OAuth2LoginAuthenticationToken에 담아준뒤, 이를 전역으로 참조 가능하도록 SecurityContext에 저장한다.
  • OAuth2AUthorizedClient 같은 경우 인가 서버로부터 권한이 부여된 클라이언트 객체로 클라이언트를 엑세스 토큰에 연결하는 객체이다.

OidcUserService

OidcUserService

  • public OidcUser loadUser(OidcUserRequest userRequest)
  • 내부에 DefaultOAuth2UserService 가지고 있으며 OIDC 사양에 부합(Scope가 oidc에 부합)할 경우 OidcUserRequest 넘겨 주어 인가서버와 통신한다
  • OidcUser 타입의 객체를 반환한다
  • 요청 Uri : POST /userinfo

흐름

  • 인가 서버로 부터, 토큰을 받고 인증을 진행
  • OidcAuthrizationCodeAuthenticationProvider가 Scope에 openid가 존재하면, OpenIdConnect 로 인증 요청을 한다.
  • 응답 정보가 OAuth2AccessTokenResponse에 담기게 된다.
    • 이떄, OIDC 방식일 경우 additionalParameters를 추가적으로 받게된다(idToken)
    • 이 idToken 같은 경우는 이미 서명이 된 토큰으로 검증이 필요하다.
  • JwtDecoder를 통해 검증을 하고, 인증이 성공하면 JWT 객체를 생성하고, OidcToken을 생성한다.
  • OidcUserService가 accessToken에 포함된 Scope중에 OIDC 사양에 부합하는 Scope가 있는지 확인한다
    • PROFILE, EMAIL, ADDRESS, PHONE

  • post /userinfo를 통해 인증서버와 통신하고, 응답을 받은뒤, DefaultOAuth2User로 변환한다.
  • OidcUserInfo -> DefaultOidcUser로 변환하고, 이를 OAuth2AuthenticationToken에 담아 SecurityContext에 담아준다.
    • 전역으로 참조 가능하도록 한다.

 

728x90