대체 생활: Google Data API 클라이언트 라이브러리에 프록시 서버 사용

Jeff Fisher, Google 데이터 API팀
2007년 6월

소개: 프록시를 사용해야 하는 이유

프록시 서버는 여러 외부 클라이언트(일반적으로 외부 리소스)를 대신하여 요청을 보내는 컴퓨터(또는 컴퓨터의 서비스)입니다. HTTP 프록시는 Google 웹 서비스의 공개 API에 액세스하는 데 사용되는 프로토콜이므로 HTTP 프록시 서버와 관련된 도움말입니다. 더 나아가 비공개 사용자 데이터나 비밀번호와 같은 민감한 정보가 포함된 HTTP 요청을 보낼 때 HTTPS 또는 SSL 프록시도 관심 있습니다. 오늘날 많은 대기업은 HTTP 프록시를 사용하여 직원이 인터넷에서 볼 수 있는 웹사이트 또는 정보를 관리합니다. 공공 도서관과 학교도 이러한 목적으로 프록시를 구현하는 것으로 알려져 있습니다. 웹 콘텐츠에 익명으로 액세스하는 데 사용할 수 있는 여러 공개 프록시 서버도 있습니다.

프록시 서버를 사용할 때 발생할 수 있는 문제는 사용 중인 소프트웨어와 소프트웨어의 구성 방법에 따라 다릅니다. 프록시 식별 및 인증에 필요한 것 이외의 방법으로 클라이언트의 요청이나 서버의 응답을 변경하지 않는 경우 프록시는 '투명'한 것으로 간주됩니다. 그러나 많은 프록시 서버는 개발자가 알아야 하는 방식으로 요청 또는 응답을 변경합니다. 특히 특정 프록시는 응답의 콘텐츠 유형을 변경하거나 리소스를 호스팅하는 외부 서버로 전송되지 않도록 HTTP 연결 유지 헤더를 제거합니다.

그렇다면 개발자가 HTTP 또는 SSL 프록시를 사용해야 하는 이유는 무엇일까요? 일반적으로 여기에는 두 가지 이유가 있습니다. 일부 기업 인프라에서 필요하거나 개발자가 웹 서비스를 사용하는 애플리케이션을 디버그하려고 하기 때문입니다. 첫 번째 이유는 개발자가 작업 중인 네트워크 규칙이 외부 웹사이트에 대한 프록시가 아닌 웹 또는 SSL 연결을 금지하는 경우 전혀 피할 수 없는 것입니다. 후자는 Google 웹 서비스 처리 시 문제를 해결하려는 개발자가 지원 포럼에 자주 신고합니다. 이러한 정확한 상황에 맞게 설계된 FiddlerCharles와 같은 특수 목적의 '디버깅' 프록시도 있습니다. 프록시 서버 사용에 관한 자세한 내용은 온프레이스: API 개발자를 위한 도구 도움말을 참고하세요.

일부 애플리케이션의 경우 프록시 서버 지원을 추가하기 어려울 수 있습니다. 다행히 Google Data API용 클라이언트 라이브러리는 대부분 코드를 약간 수정한 후 HTTP 프록시 서버에서 작동하도록 만들 수 있습니다. 이 문서는 애플리케이션의 웹 요청에 프록시 서버를 사용하려는 개발자를 위한 시작점으로 기능합니다.

자바

Sun에서 시스템 속성을 사용하여 연결 설정을 관리하므로 자바 클라이언트 라이브러리에 HTTP 프록시를 쉽게 사용할 수 있습니다.

예를 들어 회사 프록시 서버가 3128 포트의 'my.proxy.domain.com'에서 실행 중인 경우 Google Calendar, Google Sheets 등의 서비스 객체를 만들기 전에 코드에 다음을 추가할 수 있습니다.

System.setProperty("http.proxyHost", "my.proxy.domain.com");
System.setProperty("http.proxyPort", "3128");

또는 서블릿 환경을 시작할 때 명령줄에서 이 작업을 수행할 수도 있습니다.

java -Dhttp.proxyHost=my.proxy.domain.com -Dhttp.proxyPort=3128

최신 버전의 JSSE 패키지를 사용하면 SSL 프록시로도 확장할 수 있습니다. 이전 예시의 동일한 프록시 서버가 포트 3129에서 SSL 프록시를 실행했다면 필요한 코드는 다음과 같습니다.

System.setProperty("https.proxyHost", "my.proxy.domain.com");
System.setProperty("https.proxyPort", "3129");

HTTP 프록시를 사용할 때와 같은 방법으로 명령줄에서 이 작업을 수행할 수도 있습니다.

프록시 서버를 사용하려면 사용자 인증 정보를 제공해야 하는 경우도 있습니다. 일반적으로 다음과 같이 HTTP 헤더에 포함된 base64 해시를 사용하여 제출됩니다.

String encoded = new String(Base64.encodeBase64(new String("username:password").getBytes()));
String base64encodedCredentials = "Basic " + encoded;
myService.getRequestFactory().setPrivateHeader("Proxy-Authorization", base64encodedCredentials);

위의 코드는 필요한 base64 인코딩을 수행하기 위해 Apache Commons Codec 패키지를 사용합니다. 위 코드를 실행하려면 org.apache.commons.codec.binary.Base64 클래스를 가져와야 합니다.

.NET

.NET 클라이언트 라이브러리와 함께 HTTP 프록시를 사용하는 것은 자바 클라이언트만큼 간단하지는 않지만 특정 제품의 서비스 객체를 만들 때 비슷한 방식으로 할 수 있습니다.

예를 들어 프록시를 사용하여 Google Calendar 서비스와 상호작용할 수 있습니다.

using System.Net;

CalendarService service = new CalendarService("CalendarSampleApp");
query.Uri = new Uri(calendarURI);
GDataRequestFactory requestFactory = (GDataRequestFactory) service.RequestFactory;
IWebProxy iProxy = WebRequest.DefaultWebProxy;
WebProxy myProxy = new WebProxy(iProxy.GetProxy(query.Uri));
// potentially, setup credentials on the proxy here
myProxy.Credentials = CredentialCache.DefaultCredentials;
myProxy.UseDefaultCredentials = true;
requestFactory.Proxy = myProxy;

이렇게 하면 인터넷 연결 설정에서 필요한 프록시를 감지할 수 있습니다. 이는 .NET 라이브러리의 좋은 기능입니다. 프록시를 신뢰할 수 없는 경우 코드를 다음과 같이 변경하여 설정할 수도 있습니다.

using System.Net;

CalendarService service = new CalendarService("CalendarSampleApp");
GDataRequestFactory requestFactory = (GDataRequestFactory) service.RequestFactory;
WebProxy myProxy = new WebProxy("http://my.proxy.example.com:3128/",true);
// potentially, setup credentials on the proxy here
myProxy.Credentials = CredentialCache.DefaultCredentials;
myProxy.UseDefaultCredentials = true;
requestFactory.Proxy = myProxy;

마무리

이 도움말에서는 Google Data API 클라이언트 라이브러리 중 일부를 HTTP 프록시 서버에서 사용하는 방법을 설명했습니다. 네트워크 정책에 따라 프록시 서버를 사용하는 개발자는 이러한 라이브러리를 계속 사용할 수 있습니다. 또한 프록시 서버를 사용하여 프록시 서버에서 Google 웹 서비스를 오가는 HTTP 요청 및 응답의 콘텐츠를 기록하도록 하여 코드를 디버그할 수 있습니다. 프록시 서버와 고급 클라이언트 사용 사례에서는 이 튜토리얼에서 다루지 않습니다. 추가 지원이 필요한 개발자는 아래에 링크된 공개 지원 그룹에 참여하는 것이 좋습니다.

이 문서에 사용된 클라이언트 라이브러리에 대한 자세한 내용은 다음 페이지를 참조하세요.

기타 리소스: