브라우저가 ID 공급자에 도달한 뒤 애플리케이션이 반환된 인가 코드를 교환할 때 로그인이 실패합니다. 그 교환은 애플리케이션 서버에서 나가는 요청이며 자체 HTTP 클라이언트를 가집니다.

Spring Security 6.5에서 사용할 수 있는 RestClient 기반 API의 경우, 인가 코드 토큰 응답 클라이언트에 프록시를 인식하는 요청 팩터리를 제공합니다:

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setProxy(new java.net.Proxy(
    java.net.Proxy.Type.HTTP,
    new java.net.InetSocketAddress("proxy.example", 8080)));
factory.setConnectTimeout(5000);
factory.setReadTimeout(15000);

RestClient tokenHttp = RestClient.builder()
    .requestFactory(factory)
    .messageConverters(converters -> {
        converters.clear();
        converters.add(new FormHttpMessageConverter());
        converters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
    })
    .defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
    .build();

RestClientAuthorizationCodeTokenResponseClient tokenClient =
    new RestClientAuthorizationCodeTokenResponseClient();
tokenClient.setRestClient(tokenHttp);

변환기와 오류 처리기 클래스는 Spring Security의 문서화된 토큰 요청 동작을 유지합니다. 관련 없는 JSON API에만 맞춰 구성된 일반 RestClient는 동등한 대체물이 아닙니다.

같은 tokenClient를 기존 보안 구성에 연결합니다:

http.oauth2Login(login -> login
    .tokenEndpoint(token -> token
        .accessTokenResponseClient(tokenClient)));

이는 이미 클라이언트 등록과 SecurityFilterChain을 갖춘 애플리케이션을 위한 구성 조각입니다. 인증 없는 HTTP 프록시를 선택합니다. 자격 증명이 필요한 프록시에는 선택한 전송의 해당 인증 구성이 필요합니다. 허용된 공개 경로에서 공개적으로 접근 가능한 HTTPS 토큰 엔드포인트의 경우 HTTP 프록시 목록의 HTTP 항목으로 그 계정 없는 프록시 주소를 채울 수 있습니다.

프록시 호스트를 포트 및 URL 스킴과 분리해 두십시오. ID 공급자의 토큰 URI는 목적지로 남겨 두십시오. 이 예제는 인증서 검증을 대체하지 않습니다.

이후 요청에는 자체 소유권 검사가 필요합니다. UserInfo 가져오기, 리프레시 토큰 교환, client_credentials 부여, 보호된 API 호출은 다른 클라이언트 객체를 사용할 수 있습니다. 해당 작업에도 경로가 필요하면 그에 맞는 지원 클라이언트를 구성하십시오. Spring Security 6.5의 리액티브 client_credentials 흐름의 경우 리액티브 토큰 클라이언트와 그 부여 제공자를 별도로 구성하십시오.

OAuth2RestTemplate과 AccessTokenProvider를 사용하는 레거시 예제는 이전 Spring Security OAuth 프로젝트에 속합니다. 코드를 적용하기 전에 설치된 애플리케이션이 사용하는 API를 선택하십시오. 그 객체들을 이 구성에 섞지 마십시오.

관련 글