Spring Security OAuth2 라이브러리는 Spring Boot의 자동 구성 기능을 활용하여 yml 파일에 작성된 OAuth 설정을 인식하고 처리한다. 이를 위해 5가지 핵심 구성 요소가 작동한다.
1️⃣ OAuth2ClientProperties & OAuth2ProviderProperties
OAuth2ClientProperties
yml 파일의 spring.security.oauth2.client 아래에 작성된 클라이언트 설정을 나타낸다.
OAuth2ProviderProperties
spring.security.oauth2.provider 아래에 작성된 공급자 설정을 나타낸다.
2️⃣ OAuth2ClientPropertiesRegistrationAdapter
OAuth2ClientProperties에서 각 클라이언트에 대한 설정을 읽어와 ClientRegistration(클라이언트 등록 정보) 객체를 생성한다.
private static ClientRegistration getClientRegistration(String registrationId,
OAuth2ClientProperties.Registration properties, Map<String, Provider> providers) {
Builder builder = getBuilderFromIssuerIfPossible(registrationId, properties.getProvider(), providers);
if (builder == null) {
builder = getBuilder(registrationId, properties.getProvider(), providers);
}
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
// 매핑 작업
return builder.build();
}
이렇게 생성된 ClientRegistration 객체는 OAuth 2.0 클라이언트를 구성하는 데 사용되며, 인증 서버와의 상호작용을 위해 필요한 정보를 제공한다.
예를 들어 registrationId로 "google"을 전달하면 OAuth2ClientProperties에서 "google" 클라이언트에 대한 설정을 찾아와 해당 클라이언트의 ClientRegistration 객체를 생성해 반환한다.
getClientRegistration 메서드 내부에서 호출된 getBuilderFromIssuerIfPossible() 메서드는 yml 설정 파일에 작성한 provider를 통해 ClientRegistration.Builder를 생성해 준다.
private static Builder getBuilderFromIssuerIfPossible(String registrationId, String configuredProviderId,
Map<String, Provider> providers) {
String providerId = (configuredProviderId != null) ? configuredProviderId : registrationId;
if (providers.containsKey(providerId)) {
Provider provider = providers.get(providerId);
String issuer = provider.getIssuerUri();
if (issuer != null) {
Builder builder = ClientRegistrations.fromIssuerLocation(issuer).registrationId(registrationId);
return getBuilder(builder, provider);
}
}
return null;
}
google과 같이 직접 작성하지 않은 provider는 null을 반환해 if문을 타고 getBuilder() 메서드를 실행하게 된다.
Spring SecurityOAuth2는 기본 공급자인 Google, Facebook, GitHub 등은 미리 정의된 설정 정보를 제공해 애플리케이션에서 간편하게 사용할 수 있도록 도와준다. CommonOAuth2Provider는 이러한 기본 공급자들의 설정 정보를 정의하고 관리하는 클래스이다.
따라서 google과는 달리 kakao나 naver의 정보는 Spring Security에서 기본 제공을 하지 않기 때문에 yml 파일에 적어줘야 한다.
3️⃣ ClientRegistrationRepository
OAuth2ClientPropertiesRegistrationAdapter에서 생성된 ClientRegistration 객체(애플리케이션에 등록된 클라이언트 정보)들을 저장하고 관리한다.
4️⃣ OAuth2AuthorizedClientRepository
OAuth에 성공적으로 인증된 사용자의 인증 정보(액세스 토큰과 관련 정보)를 저장해 관리한다.
✅ OAuth2AuthorizedClientService
OAuth2AuthorizedClientService는 Spring Security 5.3 버전부터 도입된 인터페이스로, OAuth2AuthorizedClientRepository의 역할을 확장하고 개선한 것이다.
해당 인터페이스를 사용하면 클라이언트 정보를 저장하는 특정 저장소에 의존하지 않고도 인증 정보를 관리할 수 있다.
또한 커스텀 저장소를 구현하여 데이터베이스나 외부 저장소와 연동할 수도 있다.
5️⃣ OAuth2LoginConfigurer & OAuth2ClientConfigurer
Spring Security에서 OAuth 2.0 인증을 처리하고 관리하는 데 사용된다.
ClientRegistrationRepository와 OAuth2AuthorizedClientRepository를 사용하여 클라이언트 등록과 인증 정보를 구성한다.
OAuth2LoginConfigurer
OAuth 2.0 인증 플로우를 구성하는 데 사용된다.
주로 웹 애플리케이션에서 사용자가 애플리케이션에 로그인할 때 OAuth 2.0을 사용하여 인증을 처리한다.
- oauth2Login()
: OAuth 2.0 로그인 구성 시작 - clientRegistrationRepository()
: 클라이언트 등록 정보 제공 - userInfoEndpoint()
: 사용자 정보를 가져오는 엔드포인트 구성 - defaultSuccessUrl()
: 로그인 성공 후 이동할 URL 설정 - 기타 OAuth 2.0 로그인 관련 설정 추가 가능
OAuth2ClientConfigurer
클라이언트 구성을 처리하는 데 사용된다.
주로 리소스 서버에서 OAuth 2.0 인증을 검증하는 데 사용된다.
- oauth2Client()
: OAuth 2.0 클라이언트 구성 시작 - clientRegistrationRepository()
: 클라이언트 등록 정보 제공 - authorizedClientRepository()
: 인증된 클라이언트의 정보를 저장하는 저장소 구성 - 기타 OAuth 2.0 클라이언트 관련 설정 추가 가능
'Back-end' 카테고리의 다른 글
[Java] 가비지 컬렉션(Garbage Collection: GC) (0) | 2023.06.04 |
---|---|
[Spring Boot] OAuth 2.0 를 이용한 소셜 로그인 구현 (0) | 2023.05.22 |
[Java] HashTable VS HashMap(Linked List / Red-Black Tree) (0) | 2023.05.04 |
[Spring Boot] @Transactional(rollbackFor=Exception.class) (0) | 2023.03.21 |
[git] git stash drop 복구 (0) | 2023.03.13 |