
안녕하세요 오늘은 OAuth 2.0 Client 라이브러리를 설치 후 이루어지는 초기화 과정에 대해서 살펴보려고 합니다❗️
해당 과정에서는 OAuth2CLientProperties,ClientRegistration 그리고 InMemoryClientRegistraitonRepository 가 중요한 역할을 하며, 개발자가 application.yml 에 명시한 설정 값을 읽어와서 사용하기 위한 과정에 해당합니다.
먼저 해당 글은 OAuth 2.0 Client 라이브러리 설치로 시작합니다.
implementation "org.springframework.boot:spring-boot-starter-oauth2-client"
해당 라이브러리 설치를 통해 OAuth 2.0 인가 프레임워크에 정의된 클라이언트 역할을 지원받을 수 있으며, 직접 인가 서버의 권한 부여 유형(Grant Type) 에 따른 엔드 포인트와 직접 통신할 수 있는 API 을 제공합니다.
이번 포스팅에서는 카카오톡 소셜 로그인을 기반으로 진행할 예정입니다.

카카오 OAuth 소셜 로그인을 위해 필요한 설정 값은 위 그림과 같이 application-auth.yml 에 환경변수로 주입합니다.
이 후, 애플리케이션을 구동합니다 🛫
앞서 말한 것과 같이 OAuth 2.0 client 는 인가 서버 및 리소스 서버와 통신할 수 있는 방법을 제공하는데 이는 각 소셜 로그인 플랫폼의 API 개발 명세서에 자세히 기술되어 있습니다.
애플리케이션을 구동하게 되면, OAuth 2.0 Client 는 설정 파일에 존재하는 필요한 설정 값을 이용하여 OAuth2ClientProperties 객체를 생성합니다.

OAuth2ClientProperties 클래스는 @ConfigurationProperties 로 동작하며
Map 자료구조의 provider 와 registration 을 필드로 가집니다.
:[Spring] Spring 설정 파일에 있는 설정 값을 애플리케이션에서 활용하는 방법 (@Value,@ConfigurationProperties)

여기서 우리가 이해할 수 있는 것은 앞서 살펴보았던 application-auth.yml 의 설정 값이 해당 클래스의 필드와 잘 매칭된다는 것입니다.
또한 이 과정은 OAuth2ClientRegistrationConfiguration 클래스의 @EnableConfigurationProperties 에 의해 정상적으로 이루어집니다.

이렇게 생성된 OAuth2ClientProperties 클래스는 빈으로 등록되며 OAuthClientRegistrationConfiguration 클래스에 의해 List 타입의 ClientRegiration 으로 변환됩니다 ❗️
해당 클래스는 앞서 생성된 OAuth2ClientProperties 클래스를 기반으로 Provider(=소셜 로그인 플랫폼) 마다의 설정 값을 가지는 클래스입니다.

그림 처럼 registrationId 을 key 로 다양한 OAuth 관련 설정 필드를 가집니다.
registrationId 는 kakao ,naver 와 같은 OAuth 2.0 기반 서비스를 제공하는 플랫폼의 식별값입니다.
즉, OAuth2 서버 별로 ClientRegistration 객체가 생성됩니다.

해당 이미지는 ClientRegistration 의 구성을 나타냅니다.
ClientRegistration 의 대다수의 필드는 OAuth 2.0 Registration(=client) 가 등록하는 정보를 나타내며, ProviderDetails 및 UserInfoEndpoint 는 OAuth 2.0 Provider 의 정보를 나타냅니다.
앞서 살펴본 OAuth2ClientRegistrationRepositoryConfiguration 처럼asClientRegistration() 메소드를 통해 OAuth2ClientProperties 는 List 타입의 ClientRegistration 으로 변환됩니다.

이렇게 생성된 ClientRegistration 은 InMemoryClientRegistrationRepository 의 생성자로 사용되어 최종적으로 InMemoryClientRegistrationRepository 객체를 만듭니다.
InMemoryClientRegistrationRepository 는 생성된 OAuth 서버별 ClientRegistration 객체를 저장하는 클래스입니다.
ClientRegistrationRepository 인터페이스를 구현합니다.


이미지와 같이 Map 타입으로 ClientRegistration 객체를 보관하며 key 로는 registrationId(=kakao, naver..) 을 가집니다.
ClientRegistrationRepository 처럼 findByRegistrationId 메소드를 통해 해당하는 ClientRegistration 객체를 반환합니다.
이렇게 생성된 InMemoryClientRegistrationRepository 는 코드에서 빈으로 주입받아 사용되어집니다.

[OAuth + Spring Boot + JWT] 3. 스프링 시큐리티는 OAuth 로그인을 어떻게 처리할까? 스프링 시큐리티 구조
SpringSecurity - Kakao OAuth2 Client 사용하기
출처: https://galid1.tistory.com/582 [배움이 즐거운 개발자:티스토리]
[인프런] 정수원님의 스프링 시큐리티 OAuth 2