5 ๋ถ„ ์†Œ์š”

1. OAuth2LoginConfigurer

1-1). OAuth2LoginConfigurer ์ดˆ๊ธฐํ™” ๋ฐ ์„ค์ •

์„ค์ • ํด๋ž˜์Šค ์ƒ์„ฑ

@Configuration(proxyBeanMethods = false)
public class CustomOAuth2ClientConfig {

	@Bean
	SecurityFilterChain oauth2SecurityFilterChain(HttpSecurity http) throws Exception {
		http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
		http.oauth2Login(Customizer.withDefaults());
		http.oauth2Client();
		return http.build();
	}
}
  • API ์„ค์ •
    • SecurityFilterChain ํƒ€์ž…์˜ ๋นˆ์„ ์ƒ์„ฑํ•ด์„œ ๋ณด์•ˆ ํ•„ํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค
    • HttpSecurity ์— ์žˆ๋Š” oauth2Login() ๊ณผ oauth2Client() API ๋ฅผ ์ •์˜ํ•˜๊ณ  ๋นŒ๋“œํ•œ๋‹ค

Image Image Image

2. OAuth2 ๋กœ๊ทธ์ธ ๊ตฌํ˜„

2-1). OAuth 2.0 Login Page ์ƒ์„ฑ

Image

2-2). Authorization Code ์š”์ฒญํ•˜๊ธฐ

์š”์ฒญ ๋งคํ•‘ Url

  • AuthorizationRequestMatcher : /oauth2/authorization/{registrationId}*
  • AuthorizationEndpointConfig. authorizationRequestBaseUri ๋ฅผ ํ†ตํ•ด ์žฌ์ •์˜๋  ์ˆ˜ ์žˆ๋‹ค

์ฃผ์š” ํด๋ž˜์Šค

  • OAuth2AuthorizationRequestRedirectFilter
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์ธ๊ฐ€ ์„œ๋ฒ„์˜ ๊ถŒํ•œ ๋ถ€์—ฌ ์—”๋“œํฌ์ธํŠธ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜์—ฌ ๊ถŒํ•œ ์ฝ”๋“œ ๋ถ€์—ฌ ํ๋ฆ„์„ ์‹œ์ž‘ํ•œ๋‹ค.
    • Image
  • DefaultOAuth2AuthorizationRequestResolver
    • ์›น ์š”์ฒญ์— ๋Œ€ํ•˜์—ฌ OAuth2AuthorizationRequest ๊ฐ์ฒด๋ฅผ ์ตœ์ข… ์™„์„ฑํ•œ๋‹ค
    • /oauth2/authorization/{registrationId} ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์„œ ์ผ์น˜ํ•˜๋ฉด registrationId๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ClientRegistration์„ ๊ฐ€์ ธ์™€ OAuth2AuthorizationRequest ๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.
    • Image
  • OAuth2AuthorizationRequest
    • ํ† ํฐ ์—”๋“œํฌ์ธํŠธ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋กœ์„œ ์ธ๊ฐ€ ์‘๋‹ต์„ ์—ฐ๊ณ„ํ•˜๊ณ  ๊ฒ€์ฆํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค
    • Image
  • OAuth2AuthorizationRequestRepository
    • ์ธ๊ฐ€ ์š”์ฒญ์„ ์‹œ์ž‘ํ•œ ์‹œ์ ๋ถ€ํ„ฐ ์ธ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๋Š” ์‹œ์ ๊นŒ์ง€ (๋ฆฌ๋‹ค์ด๋ ‰ํŠธ) OAuth2AuthorizationRequest ๋ฅผ ์œ ์ง€ํ•ด์ค€๋‹ค

Code๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๋Š” ๊ณผ์ •

Image

2-3). Access Token ๊ตํ™˜ํ•˜๊ธฐ

์š”์ฒญ ๋งคํ•‘ Url

  • RequestMatcher : /login/oauth2/code/*

์ฃผ์š” ํด๋ž˜์Šค

  • OAuth2LoginAuthenticationFilter
    • ์ธ๊ฐ€์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๋ฉด์„œ ์ „๋‹ฌ๋œ code ๋ฅผ ์ธ๊ฐ€์„œ๋ฒ„์˜ Access Token ์œผ๋กœ ๊ตํ™˜ํ•˜๊ณ  Access Token ์ด ์ €์žฅ๋œ OAuth2LoginAuthenticationToken์„ AuthenticationManager์— ์œ„์ž„ํ•˜์—ฌ UserInfo ์ •๋ณด๋ฅผ ์š”์ฒญํ•ด์„œ ์ตœ์ข… ์‚ฌ์šฉ์ž์— ๋กœ๊ทธ์ธํ•œ๋‹ค.
    • OAuth2AuthorizedClientRepository๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OAuth2AuthorizedClient ๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด OAuth2AuthenticationToken ์ด ์ƒ์„ฑ๋˜๊ณ  SecurityContext์— ์ €์žฅ๋˜์–ด ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•œ๋‹ค
    • Image
  • OAuth2LoginAuthenticationProvider
    • ์ธ๊ฐ€์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋œ ์ดํ›„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ Access Token ์œผ๋กœ ๊ตํ™˜ํ•˜๊ณ  ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ UserInfo ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค
    • Scope ์— openid ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด OidcAuthorizationCodeAuthenticationProvider ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์•„๋‹ˆ๋ฉด OAuth2AuthorizationCodeAuthenticationProvider๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์ œ์–ดํ•œ๋‹ค
    • Image
  • OAuth2AuthorizationCodeAuthenticationProvider
    • ๊ถŒํ•œ ์ฝ”๋“œ ๋ถ€์—ฌ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” AuthenticationProvider
    • ์ธ๊ฐ€์„œ๋ฒ„์— Authorization Code ์™€ AccessToken ์˜ ๊ตํ™˜์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค
    • Image
  • OidcAuthorizationCodeAuthenticationProvider
    • OpenID Connect Core 1.0 ๊ถŒํ•œ ์ฝ”๋“œ ๋ถ€์—ฌ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” AuthenticationProvider ์ด๋ฉฐ ์š”์ฒญ Scope ์— openid ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ์‹คํ–‰๋œ๋‹ค
    • Image
  • DefaultAuthorizationCodeTokenResponseClient
    • ์ธ๊ฐ€์„œ๋ฒ„์˜ token ์—”๋“œ ํฌ์ธํŠธ๋กœ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋ฉฐ AccessToken ์„ ๋ฐ›์€ ํ›„ OAuth2AccessTokenResponse ์— ์ €์žฅํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค
    • Image

๊ตฌ์กฐ

Image

ํ๋ฆ„

Image Image

2-4). Oauth 2.0 User ๋ชจ๋ธ ์†Œ๊ฐœ

2-4-1). OAuth2UserService

  • ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์„œ UserInfo ์—”๋“œํฌ์ธํŠธ ์š”์ฒญ์œผ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ (๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž) ์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋ฉฐ OAuth2User ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค
  • ๊ตฌํ˜„์ฒด๋กœ DefaultOAuth2UserService ์™€ OidcUserService ๊ฐ€ ์ œ๊ณต๋œ๋‹ค

  • DefaultOAuth2UserService

    • ํ‘œ์ค€ OAuth 2.0 Provider๋ฅผ ์ง€์›ํ•˜๋Š” OAuth2UserService ๊ตฌํ˜„์ฒด๋‹ค
    • OAuth2UserRequest ์— Access Token ์„ ๋‹ด์•„ ์ธ๊ฐ€์„œ๋ฒ„์™€ ํ†ต์‹  ํ›„ ์‚ฌ์šฉ์ž์˜ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค
    • ์ตœ์ข… OAuth2User ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • OidcUserService

    • OpenID Connect 1.0 Provider๋ฅผ ์ง€์›ํ•˜๋Š” OAuth2UserService ๊ตฌํ˜„์ฒด๋‹ค
    • OidcUserRequest ์— ์žˆ๋Š” ID Token ์„ ํ†ตํ•ด ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉฐ ํ•„์š”์‹œ DefaultOAuth2UserService ๋ฅผ ์‚ฌ์šฉํ•ด์„œ UserInfo ์—”๋“œํฌ์ธํŠธ์˜ ์‚ฌ์šฉ์ž ์†์„ฑ์„ ์š”์ฒญํ•œ๋‹ค
    • ์ตœ์ข… OidcUser ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • ํ๋ฆ„ Image
  • ๊ตฌ์กฐ Image
    • DefaultOAuth2UserService ์€ OAuth2User ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
    • OidcUserService ์€ OidcUser ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
    • OidcUserRequest ์˜ ์Šน์ธ๋œ ํ† ํฐ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” scope ๊ฐ’์ด accessibleScopes ์˜ ๊ฐ’ ๋“ค์ค‘ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ UserInfo ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ์š”์ฒญํ•œ๋‹ค

2-4-2). OAuth2User & OidcUser

  • ์‹œํ๋ฆฌํ‹ฐ๋Š” UserAttributes ๋ฐ ID Token Claims ์„ ์ง‘๊ณ„ & ๊ตฌ์„ฑํ•˜์—ฌ OAuth2User ์™€ OidcUser ํƒ€์ž…์˜ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค

  • OAuth2User

    • OAuth 2.0 Provider ์— ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ์ฃผ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค
    • ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์— ๋Œ€ํ•œ ์ •๋ณด์ธ Attributes ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ first name, middle name, last name, email, phone number, address ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค
    • ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋Š” DefaultOAuth2User ์ด๋ฉฐ ์ธ์ฆ ์ดํ›„ Authentication ์˜ principal ์†์„ฑ์— ์ €์žฅ๋œ๋‹ค
  • OidcUser

    • OAuth2User ๋ฅผ ์ƒ์†ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ OIDC Provider ์— ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ์ฃผ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค
    • ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์— ๋Œ€ํ•œ ์ •๋ณด์ธ Claims ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ OidcIdToken ๋ฐ OidcUserInfo ์—์„œ ์ง‘๊ณ„ ๋ฐ ๊ตฌ์„ฑ๋œ๋‹ค
    • ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋Š” DefaultOidcUser ์ด๋ฉฐ DefaultOAuth2User ๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ธ์ฆ ์ดํ›„ Authentication ์˜ principal ์†์„ฑ์— ์ €์žฅ๋œ๋‹ค
  • ํ๋ฆ„ Image
  • ๊ตฌ์กฐ Image
    • OAuth 2.0 ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ์ธ์ฆ๋ฐ›์€ ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ Principal ์—๋Š”OAuth2User ํ˜น์€ OidcUser ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ๋‹ค
    • ๊ถŒํ•œ ๋ถ€์—ฌ ์š”์ฒญ ์‹œ scope ํŒŒ๋ผ๋ฏธํ„ฐ์— openid ๋ฅผ ํฌํ•จํ–ˆ๋‹ค๋ฉด OidcUser ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ OidcUser ๋Š” OidcUserInfo ์™€ idToken ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ตœ์ข… ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ Claims ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค
    • OAuth2UserAuthority ๋Š” ์ธ๊ฐ€์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ํ•œ scope ์ •๋ณด๋ฅผ ์ง‘๊ณ„ํ•ด์„œ ๊ถŒํ•œ์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค
    • OidcUser ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ID ํ† ํฐ์ด ํ•„์š”ํ•œ๋ฐ ์ด ๋•Œ JSON ์›น ํ† ํฐ (JWT)์œผ๋กœ ๋œ ID ํ† ํฐ์€ JSON Web Signature (JWS)๋กœ ์„œ๋ช…์ด ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•œ ๊ฒ€์ฆ์ด ์„ฑ๊ณตํ•˜๋ฉด OidcUser ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•ด์•ผ ํ•œ๋‹ค.

2-5). Oauth 2.0 Provider UserInfo ์—”๋“œํฌ์ธํŠธ ์š”์ฒญํ•˜๊ธฐ

์š”์ฒญ Uri

  • POST /userinfo

์ฃผ์š” ํด๋ž˜์Šค

  • DefaultOAuth2UserService
    • public OAuth2User loadUser(OAuth2UserRequest userRequest)
  • OAuth2UserRequestEntityConverter
    • OAuth2UserRequest ๋ฅผ RequestEntity ๋กœ ์ปจ๋ฒ„ํ„ฐ ํ•œ๋‹ค
    • Image
  • RestOperations
    • RequestEntity ๋กœ ์ธ๊ฐ€์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ณ  ResponseEntity ๋กœ ์‘๋‹ต๋ฐ›๋Š”๋‹ค
    • OAuth2User ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

ํ๋ฆ„

Image

2-6). OpenID Connect Provider OidcUserInfo ์—”๋“œํฌ์ธํŠธ ์š”์ฒญํ•˜๊ธฐ

์š”์ฒญ Uri

  • POST /userinfo

์ฃผ์š” ํด๋ž˜์Šค

  • OidcUserService
    • public OidcUser loadUser(OidcUserRequest userRequest)
      • Image
    • ๋‚ด๋ถ€์— DefaultOAuth2UserService ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ OIDC ์‚ฌ์–‘์— ๋ถ€ํ•ฉํ•  ๊ฒฝ์šฐ OidcUserRequest ๋ฅผ ๋„˜๊ฒจ ์ฃผ์–ด ์ธ๊ฐ€์„œ๋ฒ„์™€ ํ†ต์‹ ํ•œ๋‹ค
    • OidcUser ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

ํ๋ฆ„

Image

Image

2-7). OpenID Connect ๋กœ๊ทธ์•„์›ƒ

๊ฐœ๋…

  • ํด๋ผ์ด์–ธํŠธ๋Š” ๋กœ๊ทธ์•„์›ƒ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋Œ€ํ•œ ์„ธ์…˜๊ณผ ์ฟ ํ‚ค๋ฅผ ์ง€์šด๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต ํ›„ OidcClientInitiatedLogoutSuccessHandler ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ OpenID Provider ์„ธ์…˜ ๋กœ๊ทธ์•„์›ƒ ์š”์ฒญํ•œ๋‹ค
  • OpenID Provider ๋กœ๊ทธ์•„์›ƒ์ด ์„ฑ๊ณตํ•˜๋ฉด ์ง€์ •๋œ ์œ„์น˜๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค
  • ์ธ๊ฐ€์„œ๋ฒ„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์‚ฌ์–‘์— ์žˆ๋Š” ๋กœ๊ทธ์•„์›ƒ ์—”๋“œ ํฌ์ธํŠธ๋Š” end_session_endpoint ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค
    • endSessionEndpoint = http://localhost:8080/realms/oauth2/protocol/openid-connect/logout

API ์„ค์ •

http
    .logout()
    .logoutSuccessHandler(oidcLogoutSuccessHandler())
    .invalidateHttpSession(true)
    .clearAuthentication(true)
    .deleteCookies("JSESSIONID");
private OidcClientInitiatedLogoutSuccessHandler oidcLogoutSuccessHandler() {
	OidcClientInitiatedLogoutSuccessHandler successHandler =
		new OidcClientInitiatedLogoutSuccessHandler(clientRegistrationRepository);
	successHandler.setPostLogoutRedirectUri("http://localhost:8081/login");
	return successHandler;
}

Image

2-8). Spring MVC ์ธ์ฆ ๊ฐ์ฒด ์ฐธ์กฐํ•˜๊ธฐ

Authentication

  • public void dashboard(Authentication authentication) {}
    • oauth2Login() ๋กœ ์ธ์ฆ์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด Authentication ์€ OAuth2AuthenticationToken ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค
    • principal ์—๋Š” OAuth2User ํƒ€์ž… ํ˜น์€ OidcUser ํƒ€์ž…์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์ €์žฅ ๋œ๋‹ค.
    • DefaultOAuth2User ๋Š” /userInfo ์—”๋“œํฌ์ธํŠธ ์š”์ฒญ์œผ๋กœ ๋ฐ›์€ User ํด๋ ˆ์ž„ ์ •๋ณด๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์ด๋‹ค
    • DefaultOidcUser ๋Š” OpenID Connect ์ธ์ฆ์„ ํ†ตํ•ด ID Token ๋ฐ ํด๋ ˆ์ž„ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๊ฐ์ฒด์ด๋‹ค

@AuthenticationPrincipal

  • public void dashboard(@AuthenticationPrincipal OAuth2User principal or OidcUser principal) {}
  • AuthenticationPrincipalArgumentResolver ํด๋ž˜์Šค์—์„œ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์–ด ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
    • Authentication ๋ฅผ SecurityContex ๋กœ๋ถ€ํ„ฐ ๊บผ๋‚ด์–ด ์™€์„œ Principal ์†์„ฑ์— OAuth2User ํ˜น์€ OidcUser ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค

3. API ์ปค์Šคํ…€ ์„ค์ •

3-1). Authorization BaseUrl & Redirection BaseUrl

http
	.oauth2Login(oauth2 -> oauth2
		.loginPage("/login")
		.loginProcessingUrl("/login/v1/oauth2/code/*")
		.authorizationEndpoint(authorizationEndpointConfig ->
			authorizationEndpointConfig.baseUri("/oauth2/v1/authorization"))
		.redirectionEndpoint(redirectionEndpointConfig ->
			redirectionEndpointConfig.baseUri("/login/v1/oauth2/code/*"))
	)
;
  • authorizationEndpoint().baseUrl(โ€œ/oauth2/v1/authorizationโ€) ์€ ๊ถŒํ•œ ๋ถ€์—ฌ ์š”์ฒญ BaseUri ๋ฅผ ์ปค์Šคํ…€ ํ•œ๋‹ค
    • 1๋‹จ๊ณ„ ๊ถŒํ•œ ๋ถ€์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” OAuth2AuthorizationRequestRedirectFilter ์—์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ๋งค์นญ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค
    • ์„ค์ •์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฐ’์ด ํด๋ผ์ด์–ธํŠธ์˜ ๋งํฌ ์ •๋ณด์™€ ์ผ์น˜ํ•˜๋„๋ก ๋งž์ถ”์–ด์•ผ ํ•œ๋‹ค
    • Image
  • redirectionEndpoint.baseUri(โ€œ/login/v1/oauth2/code/*โ€) ์€ ์ธ๊ฐ€ ์‘๋‹ต์˜ baseUri ๋ฅผ ์ปค์Šคํ…€ ํ•œ๋‹ค
    • Token ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” OAuth2LoginAuthenticationFilter ์—์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ๋งค์นญ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค
      • application.yml ์„ค์ • ํŒŒ์ผ์—์„œ registration ์†์„ฑ์˜ redirectUri ์„ค์ •์—๋„ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค
      • ์ธ๊ฐ€์„œ๋ฒ„์˜ redirectUri ์„ค์ •์—๋„ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค
    • loginProcessingUrl(โ€œ/login/v1/oauth2/code/*โ€) ๋ฅผ ์„ค์ •ํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜์ง€๋งŒ redirectionEndpoint.baseUri ๊ฐ€ ๋” ์šฐ์„ ์ด๋‹ค
    • Image

3-2). OAuth2AuthorizationRequestResolver

  • Authorization Code Grant ๋ฐฉ์‹์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ๊ฐ€์„œ๋ฒ„๋กœ ๊ถŒํ•œ๋ถ€์—ฌ ์š”์ฒญํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ํด๋ž˜์Šค
  • OAuth2AuthorizationRequestResolver ๋Š” OAuth 2.0 ์ธ๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ •์˜๋œ ํ‘œ์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ ์™ธ์— ๋‹ค๋ฅธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์‹์œผ๋กœ ์ธ๊ฐ€ ์š”์ฒญ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค
  • DefaultOAuth2AuthorizationRequestResolver ๊ฐ€ ๋””ํดํŠธ ๊ตฌํ˜„์ฒด๋กœ ์ œ๊ณต ๋˜๋ฉฐ Consumer ์†์„ฑ์— ์ปค์Šคํ…€ ํ•  ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•œ๋‹ค
@Bean
SecurityFilterChain oauth2SecurityFilterChain(HttpSecurity http) throws Exception {
	http.authorizeRequests((requests) -> requests.antMatchers("/home").permitAll()
		.anyRequest().authenticated());
	http.oauth2Login(authLogin ->
		authLogin.authorizationEndpoint(authEndpoint ->
			authEndpoint.authorizationRequestResolver(customOAuth2AuthenticationRequestResolver())));
	return http.build();
}

private OAuth2AuthorizationRequestResolver customOAuth2AuthenticationRequestResolver() {
	return new CustomOAuth2AuthorizationRequestResolver(clientRegistrationRepository, "/oauth2/authorization");
}

Image

Image

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ