인프런 커뮤니티 질문&답변

leese님의 프로필 이미지
leese

작성한 질문수

스프링 시큐리티 OAuth2

ClientRegistrationRepository 이해 및 활용

ClientRegistrationRepository 커스터마이즈

작성

·

341

0

ClientRegistrationRepository 를 구성하는 방법으로

client_id, secret 을 properties 나 빈으로 만들어 준비하는 방식으로 많이 예제가 있는데 Resource Owner 와 Client 가 동일해 client_credentials 방식으로 인가를 진행하고 싶을 경우 어떻게 customizing 할 수 있을까요?

고객사마다 가입해 client_id, secret 을 발급받는 상황에서는 미리 properties 나 bean 으로 하드 코딩 해둘 수 없을 것 같습니다.

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

client_credentials 방식으로 인가를 진행하는 부분은

섹션 8. OAuth 2.0 Client - oauth2Client() >
DefaultOAuth2AuthorizedClientManager - Client Credentials 권한 부여 구현하기

를 참고하시면 됩니다.

그리고 클라이언트를 구성하는 방식은 현재 스프링 시큐리티에서 설정파일이나 빈을 통해서 구성할 수 있도록 지원하고 있습니다. 이 부분을 하드 코딩이 아닌 동적으로 구성하기 위해서는 별도의 커스트 마이징이 필요한데 빈으로 구성하는 방식을 DB 등과 연동해서 구현하는 식으로 해야 할 수도 있습니다.

저도 동적으로 구성하는 방식은 아직 해보지 않아서 구체적인 답변을 드리기가 어려운점 양해 바랍니다.

0

안녕하세요, 인프런 AI 인턴입니다.

ClientRegistrationRepository를 커스터마이징하여 동적으로 client_idclient_secret을 관리하고 싶으신 경우, 먼저 RegistrationClientRepository 빈을 직접 정의하여 사용하셔야 합니다. 이 빈을 사용하면 프로퍼티 파일이 아닌 데이터베이스 또는 다른 저장소에 있는 클라이언트 정보를 기반으로 동적으로 클라이언트를 등록할 수 있습니다.

예를 들면 RegisteredClientRepository 인터페이스를 구현하는 클래스를 작성하고, 이 클래스 내에서 필요에 따라 데이터베이스에서 클라이언트 정보를 조회하여 RegisteredClient 객체를 생성할 수 있습니다.

다음은 RegisteredClientRepository 인터페이스를 구현하는 예제 코드입니다.

import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;

public class CustomClientRegistrationRepository implements RegisteredClientRepository {
    // 데이터베이스 접근 로직을 담당할 서비스나 리포지토리
    
    @Override
    public void save(RegisteredClient registeredClient) {
        // 데이터베이스에 클라이언트 정보를 저장하는 로직
    }

    @Override
    public RegisteredClient findById(String id) {
        // 데이터베이스에서 id에 해당하는 클라이언트 정보를 조회하여
        // RegisteredClient 객체를 생성하여 반환하는 로직
    }

    @Override
    public RegisteredClient findByClientId(String clientId) {
        // 데이터베이스에서 clientId에 해당하는 클라이언트 정보를 조회하여
        // RegisteredClient 객체를 생성하여 반환하는 로직
    }
}

구현 클래스에는 실제 데이터베이스와 연동하는 로직을 포함하여 findByClientId 메서드를 통해 특정 클라이언트 ID의 구성을 검색할 수 있으며, 클라이언트 정보를 저장하는 등의 기능을 구현합니다.

그리고 스프링 컨테이너에 이 빈을 등록하게 되면 이를 통해 클라이언트 등록 정보를 동적으로 관리할 수 있게 됩니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OAuth2ServerConfig {
    
    @Bean
    public RegisteredClientRepository registeredClientRepository() {
        return new CustomClientRegistrationRepository();
    }
}

이렇게 커스텀 RegisteredClientRepository를 스프링 컨텍스트에 등록하면, 스프링 시큐리티는 이를 사용하여 OAuth2 클라이언트를 동적으로 관리하게 됩니다.

고객사별로 client_idclient_secret을 발급받는 경우, 발급 과정에서 생성한 클라이언트 정보를 이 커스텀 RegisteredClientRepository를 통해 등록하고 관리하면 됩니다. 이렇게 함으로써, 프로퍼티 파일이나 하드코딩된 빈 대신에 동적으로 클라이언트를 관리하는 것이 가능합니다.

자세한 사항은 Spring Boot Reference Documentation 부분을 참고하시기 바랍니다.

leese님의 프로필 이미지
leese

작성한 질문수

질문하기