๐[์คํ๋ง ์ํ๋ฆฌํฐ OAuth2] oauth2Client()
1. OAuth2ClientConfigurer ์ด๊ธฐํ ๋ฐ ์ค์
2. OAuth2AuthorizationCodeGrantFilter โ Authorization Code Grant Support
โ๏ธ๊ฐ๋
- Authorization Code Grant ๋ฐฉ์์ผ๋ก ๊ถํ ๋ถ์ฌ ์์ฒญ์ ์ง์ํ๋ ํํฐ
- ์ธ๊ฐ์๋ฒ๋ก๋ถํฐ ๋ฆฌ๋ค์ด๋ ํธ ๋๋ฉด์ ์ ๋ฌ๋ code ๋ฅผ ์ธ๊ฐ์๋ฒ์ Access Token ์ผ๋ก ๊ตํํ๋ค.
- OAuth2AuthorizedClientRepository ๋ฅผ ์ฌ์ฉํ์ฌ OAuth2AuthorizedClient ๋ฅผ ์ ์ฅ ํ ํด๋ผ์ด์ธํธ์ Redirect Uri ๋ก ์ด๋ํ๋ค
-
- ์คํ ์กฐ๊ฑด
- ์์ฒญ ํ๋ผ๋ฏธํฐ์ code ์ state ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ
- OAuth2AuthorizationRequest ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋์ง ํ์ธ
3. OAuth2AuthorizedClient โ ๊ถํ๋ถ์ฌ ํด๋ผ์ด์ธํธ
โ๏ธ๊ฐ๋
- OAuth2AuthorizedClient ๋ ์ธ๊ฐ๋ฐ์ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ฏธํ๋ ํด๋์ค๋ค.
- ์ต์ข ์ฌ์ฉ์(๋ฆฌ์์ค ์์ ์)๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ฉด, ํด๋ผ์ด์ธํธ๋ฅผ ์ธ๊ฐ๋ ํด๋ผ์ด์ธํธ๋ก ๊ฐ์ฃผํ๋ค
- OAuth2AuthorizedClient ๋ AccessToken ๊ณผ RefreshToken ์ ClientRegistration (ํด๋ผ์ด์ธํธ)์ ๊ถํ์ ๋ถ์ฌํ ์ต์ข ์ฌ์ฉ์์ธ Principal๊ณผ ํจ๊ป ๋ฌถ์ด ์ค๋ค
- OAuth2AuthorizedClient ์ AccessToken ์ ์ฌ์ฉํด์ ๋ฆฌ์์ค ์๋ฒ์ ์์์ ์ ๊ทผ ํ ์ ์์ผ๋ฉฐ ์ธ๊ฐ์๋ฒ์์ ํต์ ์ผ๋ก ํ ํฐ์ ๊ฒ์ฆํ ์ ์๋ค
- OAuth2AuthorizedClient ์ ClientRegistration ๊ณผ AccessToken ์ ์ฌ์ฉํด์ UserInfo ์๋ ํฌ์ธํธ๋ก ์์ฒญํ ์ ์๋ค
-
-
OAuth2AuthorizedClientRepository
- OAuth2AuthorizedClientRepository ๋ ๋ค๋ฅธ ์น ์์ฒญ์ด ์๋ ๋์ผํ OAuth2AuthorizedClient ๋ฅผ ์ ์งํ๋ ์ญํ ์ ๋ด๋นํ๋ค.
- OAuth2AuthorizedClientService ์๊ฒ OAuth2AuthorizedClient ์ ์ ์ฅ, ์กฐํ, ์ญ์ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค
-
OAuth2AuthorizedClientService
- OAuth2AuthorizedClientService ๋ ์ดํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์ OAuth2AuthorizedClient ๋ฅผ ๊ด๋ฆฌ(์ ์ฅ, ์กฐํ, ์ญ์ )ํ๋ ์ผ์ด๋ค.
- ์น ์ดํ๋ฆฌ์ผ์ด์
์์ ํ์ฉ
- OAuth2AuthorizedClientRepository ๋ OAuth2AuthorizedClientService ๋ OAuth2AuthorizedClient ์์ OAuth2AccessToken ์ ์ฐพ์ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก ๋ณดํธ์ค์ธ ๋ฆฌ์์ค ์์ฒญ์ ์์ํ ๋ ์ฌ์ฉํ ์ ์๋ค
4. DefaultOAuth2AuthorizedClientManager โ ํด๋ผ์ด์ธํธ ์ธ๊ฐ ๊ด๋ฆฌ์
4-1). ๊ฐ๋
โ๏ธ๊ฐ๋
- OAuth2AuthorizedClient ๋ฅผ ์ ๋ฐ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ธํฐํ์ด์ค
- OAuth2AuthorizedClientProvider ๋ก OAuth 2.0 ํด๋ผ์ด์ธํธ์ ๊ถํ ๋ถ์ฌ
- Client Credentials Flow
- Resource Owner Password Flow
- Refresh Token Flow
- OAuth2AuthorizedClientService ๋ OAuth2AuthorizedClientRepository ์ OAuth2AuthorizedClient ์ ์ฅ์ ์์ํ ํ OAuth2AuthorizedClient ์ต์ข ๋ฐํ
- ์ฌ์ฉ์ ์ ์ OAuth2AuthorizationSuccessHandler ๋ฐ OAuth2AuthorizationFailureHandler ๋ฅผ ๊ตฌ์ฑํ์ฌ ์ฑ๊ณต/์คํจ ์ฒ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
- invalid_grant ์ค๋ฅ๋ก ์ธํด ๊ถํ ๋ถ์ฌ ์๋๊ฐ ์คํจํ๋ฉด ์ด์ ์ ์ ์ฅ๋ OAuth2AuthorizedClient๊ฐ OAuth2AuthorizedClientRepository ์์ ์ ๊ฑฐ๋๋ค
โ๏ธํน์ง
โ๏ธ๊ตฌ์กฐ
โ๏ธ์์ฑ
@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(ClientRegistrationRepository clientRegistrationRepository,
OAuth2AuthorizedClientRepository authorizedClientRepository) {
OAuth2AuthorizedClientProvider authorizedClientProvider =
OAuth2AuthorizedClientProviderBuilder.builder()
.authorizationCode()
.refreshToken()
.clientCredentials()
.password()
.build();
DefaultOAuth2AuthorizedClientManager authorizedClientManager =
new DefaultOAuth2AuthorizedClientManager(
clientRegistrationRepository, authorizedClientRepository);
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
return authorizedClientManager;
}
4-2). ์ธ๊ฐ์๋ฒ์ ์ฐ๋ํ์ฌ ๋ก๊ทธ์ธ ๊ตฌํ
4-2-1). ๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ฑ
โ๏ธ๊ฐ์
- ์คํ๋ง ์ํ๋ฆฌํฐ์ OAuth2Login ํํฐ์ ์ํ ์๋ ์ธ์ฆ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๊ณ DefaultOAuth2AuthorizedClientManager ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ Spring MVC ์์ ์ง์ ์ธ์ฆ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
@Bean
SecurityFilterChain oauth2SecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) -> requests.antMatchers("/","/oauth2Login","/client").permitAll().anyRequest().authenticated());
http
// .oauth2Login().and()
.oauth2Client();
http.logout().invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
.clearAuthentication(true);
return http.build();
}
โ๏ธ๊ธฐ๋ณธ ๊ตฌ์ฑ
- AppConfig โ DefaultOAuth2AuthorizedClientManager ๋น ์์ฑ ๋ฐ ์ค์ ์ด๊ธฐํ
- DefaultOAuth2AuthorizedClientManager โ OAuth2 ๊ถํ ๋ถ์ฌ ํ๋ฆ์ ์ฒ๋ฆฌ
- LoginController โ DefaultOAuth2AuthorizedClientManager ๋ฅผ ์ฌ์ฉํด์ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
- home.html โ ์ธ์ฆ๋ฐ์ ์ฌ์ฉ์๋ง ์ ๊ทผ๊ฐ๋ฅ
- Index.html, client.html โ ์๋ฌด๋ ์ ๊ทผ ๊ฐ๋ฅ
- application.yml - ๊ถํ ๋ถ์ฌ ์ ํ์ client_credentials, password, refresh ํ์ ์ผ๋ก ์ค์ ํ๋ค
โ๏ธ๋ก๊ทธ์ธ ๊ตฌํ ์์
- DefaultOAuth2AuthorizedClientManager ๋น ์์ฑ ๋ฐ ํ๋ผ๋ฏธํฐ ์ด๊ธฐ ๊ฐ๋ค์ ์ ์ํ๋ค
- ๊ถํ ๋ถ์ฌ ์ ํ์ ๋ฐ๋ผ ์์ฒญ์ด ์ด๋ฃจ์ด๋๋ก application.yml ์ค์ ์ ์กฐ์ ํ๋ค
- /oauth2Login ์ฃผ์๋ก ๊ถํ ๋ถ์ฌ ํ๋ฆ์ ์์ฒญํ๋ค
- DefaultOAuth2AuthorizedClientManager ์๊ฒ ๊ถํ ๋ถ์ฌ๋ฅผ ์์ฒญํ๋ค
- ๊ถํ ๋ถ์ฌ๊ฐ ์ฑ๊ณตํ๋ฉด OAuth2AuthorizationSuccessHandler ๋ฅผ ํธ์ถํ์ฌ ์ธ์ฆ ์ดํ ์์
์ ์งํํ๋ค
- DefaultOAuth2AuthorizedClientManager ์ ์ต์ข ๋ฐํ๊ฐ์ธ OAuth2AuthorizedClient ๋ฅผ OAuth2AuthorizedClientRepository ์ ์ ์ฅํ๋ค
- OAuth2AuthorizedClient ์์ Access Token ์ ์ฐธ์กฐํ์ฌ /userinfo ์๋ํฌ์ธํธ ์์ฒญ์ผ๋ก ์ต์ข ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค
- ์ฌ์ฉ์ ์ ๋ณด์ ๊ถํ์ ๊ฐ์ง๊ณ ์ธ์ฆ๊ฐ์ฒด๋ฅผ ๋ง๋ ํ SecurityContext ์ ์ ์ฅํ๊ณ ์ธ์ฆ์ ์๋ฃํ๋ค
- ์ธ์ฆ์ด ์ฑ๊ณตํ๋ฉด
- 1~8 ๋ฒ์ ๊ณผ์ ์ ์ปค์คํ ํํฐ๋ฅผ ๋ง๋ค์ด์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค
4-2-2). Client Credentials Flow
4-2-3). Resource Owner Password Flow
4-2-4). Refresh Token Flow
5. OAuth2 ์ปค์คํ ๋ก๊ทธ์ธ ํํฐ ๊ตฌํ
6. @RegisteredOAuth2AuthorizedClient
โ๏ธ@RegisteredOAuth2AuthorizedClient
- ํ๋ผ๋ฏธํฐ๋ฅผ OAuth2AuthorizedClient ํ์ ์ธ์๋ก ๋ฆฌ์กธ๋ธํด์ค๋ค
- OAuth2AuthorizedClientArgumentResolver ์์ ์์ฒญ์ ๊ฐ๋ก์ฑ์ด ์ ํ๋ณ๋ก ๊ถํ ๋ถ์ฌ ํ๋ฆ์ ์คํํ๋๋ก ํ๋ค
- ์ด ๋ฐฉ๋ฒ์ OAuth2AuthorizedClientManager ๋ OAuth2AuthorizedClientService ๋ก OAuth2AuthorizedClient ์ ์ ๊ทผํ๋ ๊ฒ๋ณด๋ค ํธ๋ฆฌํ๋ค
@GetMapping("/") public String index(@RegisteredOAuth2AuthorizedClient(โkeycloak") OAuth2AuthorizedClient authorizedClient) { OAuth2AccessToken accessToken = authorizedClient.getAccessToken(); return "index"; }
โก๏ธ @RegisteredOAuth2AuthorizedClient ๋ฅผ ์ ์ธํ๊ณ OAuth2AuthorizedClient ๋ฅผ ์ธ์๋ก ์ง์ ํ ๋ฉ์๋์ด๋ฉด OAuth2AuthorizedClientArgumentResolver ๊ฐ ์คํ๋๋ฉด์ OAuth2AuthorizedClientManager ๋ฅผ ํตํด ์ธ๊ฐ ์ฒ๋ฆฌํ๋ค
๋๊ธ๋จ๊ธฐ๊ธฐ