oauth2Client() - Client Credentials
์คํ๋ง ์ํ๋ฆฌํฐ์
oauth2Login()ํํฐ์ ์ํ ์๋ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๊ณDefaultOAuth2AuthorizedClientManagerํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ Spring MVC์์ ์ง์ ์ธ์ฆ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
๊ธฐ๋ณธ ๊ตฌ์ฑ
DefaultOAuth2AuthorizedClientManager: OAuth2 ๊ถํ ๋ถ์ฌ ํ๋ฆ ์ฒ๋ฆฌLoginController:DefaultOAuth2AuthorizedClientManager๋ฅผ ์ฌ์ฉํด์ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
๋ก๊ทธ์ธ ๊ตฌํ ์์
DefaultOAuth2AuthorizedClientManager๋น ์์ฑ ๋ฐ ํ๋ผ๋ฏธํฐ ์ด๊น๊ฐ ์ ์๊ถํ ๋ถ์ฌ ์ ํ์ ๋ฐ๋ผ ์์ฒญ์ด ์ด๋ฃจ์ด์ง๋๋ก
application.yml์ค์ ์กฐ์ /oauth2Login์ฃผ์๋ก ๊ถํ ๋ถ์ฌ ํ๋ฆ ์์ฒญDefaultOAuth2AuthorizedClientManager์๊ฒ ๊ถํ ๋ถ์ฌ ์์ฒญ๊ถํ ๋ถ์ฌ๊ฐ ์ฑ๊ณตํ๋ฉด
OAuth2AuthenticationSuccessHandler๋ฅผ ํธ์ถํ์ฌ ์ธ์ฆ ์ดํ ์์ ์งํDefaultOAuth2AuthorizedClientManager์ ์ต์ข ๋ฐํ๊ฐ์ธ OAuth2AuthorizedClient๋ฅผOAuth2AuthorizedClientRepository์ ์ ์ฅ
OAuth2AuthorizedClient ์์
AccessToken์ ์ฐธ์กฐํ์ฌ/userinfo์๋ํฌ์ธํธ ์์ฒญ์ผ๋ก ์ต์ข ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.์ฌ์ฉ์ ์ ๋ณด์ ๊ถํ์ ๊ฐ์ง๊ณ ์ธ์ฆ๊ฐ์ฒด๋ฅผ ๋ง๋ ํ
SecurityContext์ ์ ์ฅํ๊ณ ์ธ์ฆ ์๋ฃ์ธ์ฆ์ด ์ฑ๊ณตํ๋ฉด ์ ๊ณผ์ ์ ์ปค์คํ ํํฐ๋ฅผ ๋ง๋ค์ด ์ฒ๋ฆฌํ๋๋ก ํ๋ค.

์์ ์ฝ๋
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. ์ปจํธ๋กค๋ฌ

2. DefaultOAuth2AuthorizedClientManager
์ด๋ฏธ ์ธ์ฆ ๋ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋์ง ํ์ธํ๋ค.
ํ์ฌ๋ ์ฒ์ ์์ฒญ์ด๊ธฐ ๋๋ฌธ์
clientRegistration์ ๋ณด๋ฅผ ๋ด์OAuth2AuthorizationContext๋ฅผ ์์ฑํ๋ค.

์ต์ข ์์ฑ๋
OAuth2AuthorizationContext๋กauthorizedClientProvider์๊ฒ ์ ๋ฌํ๋ค.

3. DelegatingOAuth2AuthorizedClientProvider
OAuth2AuthorizedClientProviderBuilder์ ์ํด ์์ฑ๋ ๊ฐOAuth2AuthorizedClientProvider์๊ฒ ์์ฒญ์ ์์ํ๋ค.

4. ClientCredentialsOAuth2AuthorizedClientProvider
๊ถํ ๋ถ์ฌ ํ์ , ์ด๋ฏธ
authorizedClient๊ฐ ์กด์ฌํ๊ณAccessToken์ด ๋ง๋ฃ๋์ง ์์๋์ง ํ์ธํ๋ค.

์ฒซ ์์ฒญ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ๋ ํด๋น๋์ง ์์ ์ธ๊ฐ ์๋ฒ์ ํต์ ํ๋ค.
DefaultClientCredentialsTokenResponseClient์๊ฒ ์ธ๊ฐ ์๋ฒ ํต์ ์ ๋งก๊ธด ํ ๋ฐ์ ๊ฒฐ๊ณผ๋กOAuth2AuthorizedClient๋ฅผ ๋ฐํํ๋ค.

5. DefaultClientCredentialsTokenResponseClient
์ธ๊ฐ ์๋ฒ์ ํต์ ํ
OAuth2AccessTokenResponse๋ฅผ ๋ฐํํ๋ค.

6. DefaultOAuth2AuthorizedClientManager
authorizationSuccessHandler๋ฅผ ์คํํ๊ณauthorizedClient๋ฅผ ๋ฐํํ๋ค.


Last updated