나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Language/Java

Proxy를 통한 Restful API 호출 by Java

devidea 2019. 12. 9. 12:01
최근에 방화벽으로 외부 인터넷과 연결이 되지 않은 서버의 데이터를 외부로 전송할 케이스가 생겼다. 그래서 특정 서버와의 연결만 허용하는 Proxy 서버를 하나 두어서 처리하고자 했다.
간단한 내용에 대해서 글로 정리한 이유는 Proxy 호출을 할 때 인증 방법과 Java에서 Proxy 설정을 어떻게 하는지 찾아본 내용을 기록하기 위함이다.

정리할 내용은 크게 2가지 이다.
1. Java Proxy 설정
2. Proxy 인증

1. Java Proxy 설정
Proxy 설정을 시스템 전체 설정으로 하지 않고, Java Application 단위로 설정하려고 할 때 어떻게 하는지 찾았다.
오라클 자바 문서 중에 Java Networking and Proxies에 관련 내용이 기술되어 있다.

먼저 시스템 properties로 설정할 수 있다.
  • VM을 실행할 때 command line 옵션을 준다.
  • System.setProperty(String, String) 메소드 설정한다.

HTTP 프로토콜에 대해서 특별히 설정할 수 있는 옵션이 존재한다.
  • http.proxyHost : proxy 서버의 호스트 네임
  • http.proxyPort : proxy 서버의 포트
  • http.nonProxyHost : proxy 설정을 제외할 호스트 리스트 ("|" 구분, "*" 사용가능)

http.proxy{Host, Port}를 설정하면 Java application 안에서 호출하는 HTTP 요청을 모두 Proxy 서버를 거쳐가게 한다.


2. Proxy 인증
처음에 curl을 통해 proxy 테스트를 했을 때는 다음과 같이 export 설정을 하면 적용이 되었다.

그런데 앞서 설명드린 http.proxyHost에 인증 정보를 포함해서 설정하면 제대로 동작하지 않는다.
그래서 Proxy 인증에 대해서 찾아봤다.

Proxy-Authorization HTTP header를 통해 인증 정보를 같이 보내면 됐다.
MDN HTTP 문서에는 Syntax를 아래와 같이 설명하고 있다.
Proxy-Authorization: <type> <credentials>

여기에서 type은 인증 타입인데 Basic 인증을 사용하였다.
credentials은 user:password를 base64로 인코딩한 값이다.

HTTP Header를 설정한 이후 동작하는 방식은 아래 그림을 보면 이해하기가 쉽다.



인증을 필요로 하는 Proxy 서버는 Proxy-Authorization Header의 값을 토대로 자격이 유효한지 체크한다.
자격을 검증하는 것은 로컬 데이터베이스이던 LDAP이던 Proxy 구현에 따라 달라진다.

중요한 부분은 인증이 유효하지 않을 때에는 407 코드를 리턴한다.
407 Proxy Authorization Required 이다. 인증 실패와 관련해서 401이 잘 알려져 있는데 Proxy 인증의 경우 407이라는 별도 코드가 존재한다.

인증이 유효했을 때에는 Proxy-Authorization Header를 담아서 Proxy 계층에 요청을 다시 전달한다.


참고 문서


반응형

'Language > Java' 카테고리의 다른 글

[multi thread] Semaphore  (0) 2020.06.02
[Java9] Collections, Streams  (0) 2020.03.13
[Java8] yyyyMMddHHmmssSSS LocalDateTime parse 오류  (0) 2019.07.11
[Java9] CompletableFuture 지연 & 시간초과 개선  (0) 2019.01.28
[Java8] sorted groupBy  (0) 2019.01.11