oauth2Client() - Client Credentials

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ oauth2Login() ํ•„ํ„ฐ์— ์˜ํ•œ ์ž๋™ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  DefaultOAuth2AuthorizedClientManager ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Spring MVC์—์„œ ์ง์ ‘ ์ธ์ฆ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์„ฑ

  • DefaultOAuth2AuthorizedClientManager : OAuth2 ๊ถŒํ•œ ๋ถ€์—ฌ ํ๋ฆ„ ์ฒ˜๋ฆฌ

  • LoginController : DefaultOAuth2AuthorizedClientManager๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ

๋กœ๊ทธ์ธ ๊ตฌํ˜„ ์ˆœ์„œ

  1. DefaultOAuth2AuthorizedClientManager ๋นˆ ์ƒ์„ฑ ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ ์ดˆ๊นƒ๊ฐ’ ์ •์˜

  2. ๊ถŒํ•œ ๋ถ€์—ฌ ์œ ํ˜•์— ๋”ฐ๋ผ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง€๋„๋ก application.yml ์„ค์ • ์กฐ์ •

  3. /oauth2Login ์ฃผ์†Œ๋กœ ๊ถŒํ•œ ๋ถ€์—ฌ ํ๋ฆ„ ์š”์ฒญ

  4. DefaultOAuth2AuthorizedClientManager ์—๊ฒŒ ๊ถŒํ•œ ๋ถ€์—ฌ ์š”์ฒญ

  5. ๊ถŒํ•œ ๋ถ€์—ฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด OAuth2AuthenticationSuccessHandler๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ธ์ฆ ์ดํ›„ ์ž‘์—… ์ง„ํ–‰

    • DefaultOAuth2AuthorizedClientManager์˜ ์ตœ์ข… ๋ฐ˜ํ™˜๊ฐ’์ธ OAuth2AuthorizedClient๋ฅผ OAuth2AuthorizedClientRepository์— ์ €์žฅ

  6. OAuth2AuthorizedClient ์—์„œ AccessToken์„ ์ฐธ์กฐํ•˜์—ฌ /userinfo ์—”๋“œํฌ์ธํŠธ ์š”์ฒญ์œผ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

  7. ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์ธ์ฆ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ํ›„ SecurityContext์— ์ €์žฅํ•˜๊ณ  ์ธ์ฆ ์™„๋ฃŒ

  8. ์ธ์ฆ์ด ์„ฑ๊ณตํ•˜๋ฉด ์œ„ ๊ณผ์ •์„ ์ปค์Šคํ…€ ํ•„ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.

img_19.png

์˜ˆ์ œ ์ฝ”๋“œ

application.yml

spring:
  security:
    oauth2:
      client:
        registration: # ํด๋ผ์ด์–ธํŠธ ์„ค์ •
          keycloak:
            client-id: oauth2-client-app
            client-secret: 9KNAzAnHOBURT3vQHuJFkVqz468KJalY
            client-name: oauth2-client-app
            authorization-grant-type: client_credentials
            client-authentication-method: client_secret_basic
            provider: keycloak

        provider: # ๊ณต๊ธ‰์ž ์„ค์ •
          keycloak:
            authorization-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/auth # OAuth 2.0 ๊ถŒํ•œ ์ฝ”๋“œ ๋ถ€์—ฌ ์—”๋“œํฌ์ธํŠธ
            token-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/token        # OAuth 2.0 ํ† ํฐ ์—”๋“œํฌ์ธํŠธ
            issuer-uri: http://localhost:8080/realms/oauth2                                     # ์„œ๋น„์Šค ๊ณต๊ธ‰์ž ์œ„์น˜
            user-info-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/userinfo # OAuth 2.0 UserInfo ์—”๋“œํฌ์ธํŠธ
            jwk-set-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/certs      # OAuth 2.0 JwkSetUri ์—”๋“œํฌ์ธํŠธ
            user-name-attribute: sub                                                            # OAuth 2.0 ์‚ฌ์šฉ์ž๋ช…์„ ์ถ”์ถœํ•˜๋Š” ํด๋ ˆ์ž„๋ช…

์ปจํŠธ๋กค๋Ÿฌ

@RestController
@RequiredArgsConstructor
public class LoginController {
    
   private final OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager;

   @GetMapping("/credentials")
   public OAuth2AuthorizedClient credentials() {
      Authentication authentication = SecurityContextHolder.getContextHolderStrategy().getContext().getAuthentication();

      OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
              .withClientRegistrationId("keycloak")
              .principal(authentication) //anonymous
              .build();

      OAuth2AuthorizedClient authorizedClient = oAuth2AuthorizedClientManager.authorize(authorizeRequest);
      return authorizedClient;
   }
}
  • ํด๋ผ์ด์–ธํŠธ ์ž๊ฒฉ ์ฆ๋ช… ์Šน์ธ ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ ์ •๋ณด๋งŒ ์ธ๊ฐ€ ์„œ๋ฒ„์— ๋ณด๋‚ด๋ฉด ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • OAuth2AuthorizedClient๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์–ป์–ด ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. (์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์–ป๊ณ  SecurityContext์— ์ €์žฅํ•˜๋Š” ๋“ฑ)

๊ณผ์ • ๋””๋ฒ„๊น…

1. ์ปจํŠธ๋กค๋Ÿฌ

img_37.png

2. DefaultOAuth2AuthorizedClientManager

  • ์ด๋ฏธ ์ธ์ฆ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • ํ˜„์žฌ๋Š” ์ฒ˜์Œ ์š”์ฒญ์ด๊ธฐ ๋•Œ๋ฌธ์— clientRegistration ์ •๋ณด๋ฅผ ๋‹ด์€ OAuth2AuthorizationContext๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

img_38.png
  • ์ตœ์ข… ์ƒ์„ฑ๋œ OAuth2AuthorizationContext๋กœ authorizedClientProvider์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

img_26.png

3. DelegatingOAuth2AuthorizedClientProvider

  • OAuth2AuthorizedClientProviderBuilder์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ OAuth2AuthorizedClientProvider์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.

img_39.png

4. ClientCredentialsOAuth2AuthorizedClientProvider

  • ๊ถŒํ•œ ๋ถ€์—ฌ ํƒ€์ž…, ์ด๋ฏธ authorizedClient๊ฐ€ ์กด์žฌํ•˜๊ณ  AccessToken์ด ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

img_40.png
  • ์ฒซ ์š”์ฒญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋А ๊ฒƒ๋„ ํ•ด๋‹น๋˜์ง€ ์•Š์•„ ์ธ๊ฐ€ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•œ๋‹ค.

  • DefaultClientCredentialsTokenResponseClient์—๊ฒŒ ์ธ๊ฐ€ ์„œ๋ฒ„ ํ†ต์‹ ์„ ๋งก๊ธด ํ›„ ๋ฐ›์€ ๊ฒฐ๊ณผ๋กœ OAuth2AuthorizedClient๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

img_41.png

5. DefaultClientCredentialsTokenResponseClient

  • ์ธ๊ฐ€ ์„œ๋ฒ„์™€ ํ†ต์‹  ํ›„ OAuth2AccessTokenResponse๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

img_42.png

6. DefaultOAuth2AuthorizedClientManager

  • authorizationSuccessHandler๋ฅผ ์‹คํ–‰ํ•˜๊ณ  authorizedClient๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

img_43.png
img_44.png

์ด์ „ โ†ฉ๏ธ - OAuth 2.0 Client(oauth2Client) - DefaultOAuth2AuthorizedClientManager - Resource Owner Password ๊ถŒํ•œ ๋ถ€์—ฌ ๊ตฌํ˜„

๋ฉ”์ธ โซ

๋‹ค์Œ โ†ช๏ธ - OAuth 2.0 Client(oauth2Client) - DefaultOAuth2AuthorizedClientManager - Refresh Token ๊ถŒํ•œ ๋ถ€์—ฌ ๊ตฌํ˜„

Last updated