토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

번역을 완료하지 않은 문서입니다. 언제든지 내용을 수정할 수 있습니다.

스프링 시큐리티 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차:


이 문서에서 설명하는 내용은 리액티브 환경을 기준으로 설명한다. 서블릿 환경은 서블릿 환경에서 WebClient 통합하기 섹션을 참고해라.

스프링 프레임워크는 기본적으로 bearer 토큰 설정을 지원한다.

webClient.get()
    .headers(h -> h.setBearerAuth(token))
    ...

스프링 시큐리티는 이 기능을 기반으로 아래와 같은 기능을 추가 지원한다:


28.1. WebClient OAuth2 Setup

가장 먼저 WebClient를 적절하게 설정해야 한다. 아래 코드는 완전한 리액티브 환경에서 WebClient를 설정하는 예시다:

@Bean
WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations,
        ServerOAuth2AuthorizedClientRepository authorizedClients) {
    ServerOAuth2AuthorizedClientExchangeFilterFunction oauth =
            new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients);
    // (optional) explicitly opt into using the oauth2Login to provide an access token implicitly
    // oauth.setDefaultOAuth2AuthorizedClient(true);
    // (optional) set a default ClientRegistration.registrationId
    // oauth.setDefaultClientRegistrationId("client-registration-id");
    return WebClient.builder()
            .filter(oauth)
            .build();
}

28.2. Implicit OAuth2AuthorizedClient

위 설정에서 defaultOAuth2AuthorizedClienttrue로 설정했다면, oauth2Login(i.e. OIDC)으로 인증한 현재 사용자의 인증 정보를 사용해서 자동으로 액세스 토큰을 공급한다. 또는 defaultClientRegistrationId를 유효한 ClientRegistration id로 설정했다면, 클라이언트 등록 정보를 사용해서 액세스 토큰을 공급한다. 이 방식은 편리하긴 하지만, 모든 엔드포인트에서 액세스 토큰이 필요한 게 아니라면 위험한 방법이다 (액세스 토큰이 필요 없는 엔드포인트에 액세스 토큰을 전송할 수 있다).

Mono<String> body = this.webClient
        .get()
        .uri(this.uri)
        .retrieve()
        .bodyToMono(String.class);

28.3. Explicit OAuth2AuthorizedClient

필요할 때만 요청 속성에 OAuth2AuthorizedClient를 명시하는 것도 가능하다. 아래 예제에선 스프링 웹플럭스나 스프링 MVC의 메소드 인자 리졸버로 OAuth2AuthorizedClient를 리졸브한다. 물론 OAuth2AuthorizedClient를 리졸브하는 방식이 중요한 건 아니다.

@GetMapping("/explicit")
Mono<String> explicit(@RegisteredOAuth2AuthorizedClient("client-id") OAuth2AuthorizedClient authorizedClient) {
    return this.webClient
            .get()
            .uri(this.uri)
            .attributes(oauth2AuthorizedClient(authorizedClient))
            .retrieve()
            .bodyToMono(String.class);
}

28.4. clientRegistrationId

아니면 요청 속성에 clientRegistrationId를 지정하는 것도 가능한데, 이렇게 하면 WebClientOAuth2AuthorizedClient를 찾아 바인딩한다. 해당 클라이언트를 찾을 수 없다면 자동으로 하나를 선택한다.

Mono<String> body = this.webClient
        .get()
        .uri(this.uri)
        .attributes(clientRegistrationId("client-id"))
        .retrieve()
        .bodyToMono(String.class);

전체 목차는 여기에 있습니다.

<< >>