티스토리 뷰

반응형

일반적인 환경에서 Proxy를 이용하는 경우는 잘 없습니다. 모뎀 쓰던 시절이면 몰라도, 초고속 인터넷이 사통발달 잘 뚫려서 Cache 목적으로 Proxy를 쓰는 일도 사라졌기에 요즘은 OS나 브라우져에서 Proxy를 쓰는 경우가 일반적인 경우에는 있을지 모르겠습니다.

 

하지만, 최근 프로젝트를 하면서 이상한 환경을 목격했습니다. 개발 장비에서 외부의 DBMS 연결을 하는데 직접 연결은 보안정책에 위배되니 인프라 담당에게 Proxy(?)를 만들어서 그걸 통해서 연결하라고 합니다. DBSaf**라는 보안 프로그램을 이용해서 접속하기까지 하는데 왜 저런 정책을 만들었는지 모르겠네요. (1번 사례라고 하겠습니다)

이 경우 말고, 80와 443(http/https)를 제외한 모든 포트를 막는 사이트도 존재합니다. 보안 정책상 그대로 따라줘야 하는게 맞습니다만, WebSocket이나 기타 이유로 인해서 저 두 포트를 이용하지 않는 사이트를 방문해야 할 일이 생겼을 경우 극도의 짜증이 나는건 어쩔 수 없었습니다.

 

그래서, 개인적으로 socks 5 기반의 proxy를 만들고 정말 필요할 때에만 거기에 연결해서 사용하곤 했습니다. 그렇게 하지 않고 http proxy를 제공해서(1번 사례) Spring Boot로 개발된 백엔드 프로그램에서 실행 시 특정 조건을 만족하면 System Properties 값을 setting하여 proxy를 거쳐서 나가는 것처럼 해놓아서 그렇게 구현한 경우도 있었습니다.

그런데, 이 경우 Spring이나 Spring Boot 자체적으로 연동이 된 DBMS 연결 등에선 별다른 설정 없이 설정이 적용되었습니다만(java.net.useSystemProxies 같은), Spring 6이나 Spring Boot 3에서부터는 RestTemplate나 RestClient와 같은 Http Client에서 Proxy 설정이 잘 안되는 것 같았습니다.

그래서 좀 찾아본 결과, 뭔가 누락이 된게 아닌가 싶었습니다. 대부분의 ClientHttpRequestFactory에서는 Proxy 설정을 직접 해줘야 하는 문제가 있는 것 같았습니다. 그나마 System Properties의 설정 정보를 불러오도록 제공하는건 HttpComponentsClientHttpRequestFactory 정도인 것 같았습니다. 보통은 Connection Pool을 이용하고 싶을 때 설정하는데, Proxy 설정에 있어서도 HttpClient(org.apache.hc.client5.http.classic.HttpClient)를 생성자 매개변수로 받아서 바로 처리할 수 있도록 제공되었습니다. HttpClient는 HttpClientBuilder를 통해 useSystemProperties()라는 메서드를 제공하기 때문에 수동으로 설정 정보를 읽어와서 Proxy 객체를 만들 필요가 없이 간단하게 설정을 할 수 있도록 제공해주고 있었습니다.

 

정리하자면, Spring Boot 3.2(Spring 6.1)부터 REST API 호출 시 우아하게 코드를 작성할 수 있는 RestClient를 Inject 해서 사용하기 위해 Bean으로 등록할 때 아래와 같이 작성하면 Spring Boot 등을 실행할 때 환경변수값으로 옵션만 제공해도 Proxy 설정을 읽어와 호출을 할 수 있습니다.

@Bean
public RestClient restClient() {

    HttpClient httpClient = HttpClientBuilder.create()
            .useSystemProperties()
            .build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);

    return RestClient.builder()
            .requestFactory(requestFactory)
            .build();

}

Spring Boot에서 명령줄로 실행할 때에는 아래와 같이 설정을 해주시면 됩니다. spring.profiles.active 같은 설정을 많이들 해보셨을 것이기에 특별한 설명은 하지 않겠습니다.

# 프로그램 실행 시 프록시 설정을 이용할 경우, 아래는 socks5
-DsocksProxyHost=localhost
-DsocksProxyPort=1080
# 시스템 프록시 정보를 읽어와 이용할 경우
-Djava.net.useSystemProxies=true

 

도움이 되셨길 바랍니다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함