다음을 통해 공유


WinHTTP의 AutoProxy 문제

WinHTTP 자동 프록시 기능을 사용할 때 다음과 같은 중요한 문제를 고려합니다.

현재 하나의 프록시 서버만 지원됩니다.

WinHTTP는 현재 둘 이상의 프록시 서버를 지정하는 프록시 구성을 지원하지 않습니다. WinHttpGetProxyForUrl이 프록시 서버 목록을 포함하는 WINHTTP_PROXY_INFO 구조를 반환하는 경우 애플리케이션은 WINHTTP_OPTION_PROXY 옵션을 사용하여 요청 핸들에서 설정합니다. WinHTTP는 목록의 첫 번째 프록시 서버만 사용합니다. 해당 프록시 서버에 액세스할 수 없는 경우 WinHTTP는 목록의 다른 프록시 서버로 장애 조치하지 않습니다. 목록의 다음 프록시 서버에서 WINHTTP_OPTION_PROXY 옵션을 다시 설정하고 요청을 다시 보내 이 경우를 처리하는 것은 애플리케이션의 맡입니다.

보안 위험 완화

프록시 자동 구성 파일을 처리하려면 다운로드한 스크립트 코드를 실행해야 합니다. 고려해야 할 몇 가지 보안 문제: PAC 파일이 있는 서버가 손상된 경우 PAC 스크립트 코드가 악의적일 수 있습니다. 따라서 WinHTTP는 다음과 같은 예방 조치를 사용하여 클라이언트를 보호합니다.

  1. 스크립트 코드는 ActiveX 개체를 인스턴스화할 수 없습니다. 이렇게 하면 파일에 액세스하고 네트워크 I/O를 수행하는 기능과 같이 잠재적으로 위험한 기능이 많이 차단됩니다.

  2. **Windows Server 2003: **WinHttpGetProxyForUrl 은 권한이 낮은 로컬 서비스 기본 제공 사용자 계정으로 실행되는 외부 Out-of-process 서비스인 WinHTTP 웹 프록시 자동 검색 서비스에 전체 WPAD 처리를 위임합니다.

  3. WINDOWS XP SP2 및 Windows Server 2003: PAC 스크립트는 스크립트 실행이 종료된 후 60초 이상 실행할 수 없습니다.

  4. WINDOWS XP SP2 및 Windows Server 2003: WinHTTP는 1MB보다 큰 PAC 파일을 거부합니다. 일반적인 PAC 파일의 크기는 일반적으로 몇 킬로바이트 이하입니다.

WinHTTP는 Microsoft JScript 구성 요소를 사용하여 스크립트를 실행하기 때문에 PAC 스크립트 코드를 처리하려면 COM을 사용해야 합니다. WinHTTP가 외부의 Out-of-process 웹 프록시 자동 검색 서비스에 WPAD 프로토콜 처리를 위임할 수 없는 경우 WinHttpGetProxyForUrl은 호출 기간 동안 애플리케이션 프로세스 내에서 COM 런타임을 로드합니다. 애플리케이션 자체가 이미 COM을 사용하고 있는 경우 문제가 되지 않습니다.

성능 고려 사항

자동 검색 프로세스는 몇 초 정도 느릴 수 있습니다. WinHttpGetProxyForUrlWinHttpDetectAutoProxyConfigUrl 함수는 동기 함수를 차단하고 있습니다. 특정 자동 검색 메커니즘(예: DHCP)이 다른 메커니즘(예: DNS)보다 훨씬 느려질 수 있습니다. WINHTTP_AUTO_DETECT_TYPE_DHCPWINHTTP_AUTO_DETECT_TYPE_DNS_A 자동 검색 플래그가 모두 지정된 경우 WinHTTP는 WPAD 사양에 따라 DHCP를 먼저 사용합니다. DHCP 요청을 실행하여 PAC URL을 검색하지 않은 경우 WinHTTP는 잘 알려진 DNS 주소에서 PAC 파일을 찾으려고 시도합니다.

WinHttpGetProxyForUrl은 PAC 파일 및 자동 검색 결과를 캐싱하는 데 WinHTTP 세션 핸들 매개 변수를 사용합니다. 반복되는 PAC URL 검색 및 파일 다운로드를 방지하기 위해 가능한 경우 여러 WinHttpGetProxyForUrl 호출에 동일한 세션 핸들을 사용하는 것이 가장 좋습니다. PAC 파일은 메모리 내로만 캐시되며 애플리케이션이 세션 핸들을 닫을 때 삭제됩니다.

자동 프록시의 성능 영향 때문에 데스크톱 클라이언트 애플리케이션 또는 서비스만 이 기능을 사용하는 것이 좋습니다. 서버 기반 애플리케이션은 "ProxyCfg.exe" 유틸리티를 사용하여 서버 관리자를 사용해야 합니다.