DefaultOAuth2AuthorizedClientManager.authorize()가 OAuth2AuthorizedClientRepository에서 기존 OAuth2AuthorizedClient를 꺼내고, ClientRegistration, principal, contextAttributesMapper 결과를 OAuth2AuthorizationContext로 묶어 Provider에 위임한다.
매니저가 저장소에서 꺼낸 기존 OAuth2AuthorizedClient를 OAuth2AuthorizationContext로 묶어 RefreshTokenOAuth2AuthorizedClientProvider에 위임한다.
Provider는 클라이언트가 존재하는지와 refreshToken != null, accessToken 만료 세 조건이 모두 참일 때만 움직이고, 하나라도 빠지면 null을 반환해 기존 토큰을 그대로 쓰게 한다.
갱신 시 RestClientRefreshTokenTokenResponseClient가 grant_type=refresh_token으로 POST하고, 응답에 새 refresh token이 오면 교체·없으면 기존 것 유지해 4인자 OAuth2AuthorizedClient를 만든 뒤 OAuth2AuthorizedClientRefreshedEvent를 발행한다
스스로 최초 발급을 못 하는 연장 전용 Provider다. Authorization Code가 발급한 토큰을 DelegatingOAuth2AuthorizedClientProvider 체인 안에서 이어받아 수명만 늘린다.
DefaultOAuth2AuthorizedClientManager - Based Filter
애플리케이션이 WebClient(또는 RestClient)로 외부 API를 호출하면 필터/인터셉터가 요청을 가로채, attributes → defaultClientRegistrationId → SecurityContext의 OAuth2AuthenticationToken 순으로 registrationId와 principal을 결정한다.
결정된 값으로 OAuth2AuthorizedClientManager.authorize()를 호출한다. 앞서 본 Client Credentials·Refresh Token 흐름이 바로 이 안에서 돈다.
돌려받은 OAuth2AuthorizedClient의 액세스 토큰을 Authorization: Bearer 헤더로 붙여 실제 요청을 내보내고, 응답이 401·403이면 authorizationFailureHandler로 저장된 토큰을 지워 다음 요청에 재발급을 유도한다.
@RegisteredOAuth2AuthorizedClient
파라미터를 OAuth2AuthorizedClient 타입 인자로 리졸브해준다.
OAuth2AuthorizedClientArgumentResolver에서 요청을 가로채 유형별로 권한 부여 흐름을 실행하도록 한다.
OAuth2AuthorizedClientManager나 OAuth2AuthorizedClientService로 접근하는 것보다 편하다.