스프링 시큐리티 OAuth2/OAuth 2.0 Client Fundamentals

ClientRegistrationRepository 이해 및 활용

webmaster 2023. 1. 15. 14:41
728x90

의존성 주입 예시(registrationId로 참조 가능)

  • ClientRegistrationRepository는 OAuth 2.0 & OpenID Connect 1.0의 ClientRegistration 저장소 역할을 한다.
  • 클라이언트 등록 정보는 궁극적으로 인가 서버가 저장하고 관리하는데 이 레포지토리는 인가 서버에 일차적으로 저장된 클라이언트 등록 정보의 일부를 검색하는 기능을 제공한다.
  • 스프링 부트 2.X 자동 설정은 spring.security.oauth2.client.registration.[registrationId] 하위 프로퍼티를 ClientRegistration 인스턴스에 바인딩하며, 각 ClientRegistration 객체를 ClientRegistrationRepository 안에 구성한다.
  • ClientRegistrationRepository의 디폴트 구현체는 InMemoryClientRegistrationRepository 다.
  • 자동 설정을 사용하면 ClientRegistrationRepository 도 ApplicationContext 내 @Bean으로 등록하므로 필요하다면 원하는 곳에 의존성을 주입할 수 있다.

 빈 등록하기

빈 설정하기

  • yml로도 설정이 가능하다.

Test

@Configuration
public class OAuth2ClientConfig {

  @Bean
  public ClientRegistrationRepository clientRegistrationRepository() {
    return new InMemoryClientRegistrationRepository(keycloakClientRegistration());
  }

  private ClientRegistration keycloakClientRegistration() {
    //ClientRegistration 을 만드는 유틸성 클래스
    return ClientRegistrations
        .fromIssuerLocation("http://localhost:8080/realms/oauth2")
        .registrationId("keycloak")
        .clientId("oauth2-client-app")
        .clientSecret("xSlqD456gfAeLZO93BLbTwQys0NEc8KL")
        .redirectUri("http://localhost:8081/login/oauth2/code/keycloak")
        .build();
  }
}

Index

@RestController
public class IndexController {

  @Autowired
  private ClientRegistrationRepository clientRegistrationRepository;

  @GetMapping("/")
  public String index(){
    ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId("keycloak");
    String clientId = clientRegistration.getClientId();
    System.out.println("clientId = " + clientId);

    String redirectUri = clientRegistration.getRedirectUri();
    System.out.println("redirectUri = " + redirectUri);

    return "index";
  }

}
  • 빈으로 등록한 ClientRegistrationRepository를 컨트롤러에서 확인할 수 있다
728x90