loadUser()
를 이용하여 OAuth2User
객체를 생성한다.OAuth2UserRequest
를 RequestEntity
로 바꾼다.RequestEntity
로 인가서버에 요청하고 이걸 ResponseEntity
로 응답받아 OAuth2User
객체로 반환한다.요청 Uri는 /userinfo
이다.
DefaultOAuth2UserService
에서 UserInfo 요청하면RequestEntity
가 요청을 보내고DefaultOAuth2User
객체로 만들고 이걸OAuth2LoginAuthneticationToken
에 담는다. OAuth2AuthenticationToken
을 생성하고 저장한다.그리고 이 과정에서 OAuth2AuthorizedClient
를 만들어 accessToken, refreshToken등을 저장하며 이걸 AuthenticatedPrincipalOAuth2AuthorizedClientRepository
에 저장하고 이걸 사용할 수 있게 해두었다.
따라서 SecurityContext에 저장된 OAuth2AuthenticationToken
과 OAuth2AuthorizedClient
두개의 정보를 이용해서 서블릿 환경에서 사용 가능하다.
OidcUserService
에서 똑같이 loadUser()
가 있다. 전에 설명한대로 DefaultOAuth2UserService
를 가지고 있어서 필요시 통신을 해 정보를 가져온다.OidcUser
타입 객체이다요청 Uri는 위와 같이 /userinfo
이다
위와 비슷하나 Oidc를 사용한다.
1. 따라서 OidcAuthorizationCodeAuthenticationProvider
가 scope를 확인하고 OIDC이면 OIDC 요청을 보낸다.
2. 받은 정보를 JwtDecoder
가 검증, 해석하여 OidcIdToken
을 생성하고 이걸 OidcUserRequest
로 바꿔 OidcUserService
에 넘긴다
3. OidcUserService
에서는 OIDC사양에 부합하는 Scope가 있으면 추가적인 정보를 받아서 인증을 시행하고. 아니면 OIDC 정보를 활용하여 인증을 진행한다.(RequestEntity사용)