포워드 프록시를 통과하는 일반 HTTP 요청에서 Node는 프록시에 연결하고 요청 라인에 목적지 URL을 실어 보냅니다. 세 가지 값이 그 하나의 요청을 설명합니다.

값예
TCP 연결 엔드포인트proxy.example:8080
요청 대상http://example.com/news?q=proxy
Host 헤더example.com

이 Node 22 예제는 그 분리를 명확히 드러냅니다.

const http = require('node:http');
const destination = new URL('http://example.com/news?q=proxy');

const request = http.get({
  hostname: 'proxy.example',
  port: 8080,
  path: destination.href,
  headers: { Host: destination.host },
  signal: AbortSignal.timeout(15000),
}, (response) => {
  console.log(response.statusCode);
  response.on('error', console.error);
  response.resume();
});
request.on('error', console.error);

엔드포인트는 자리 표시자입니다. 공개 HTTP 테스트에는 HTTP 프록시 목록에서 후보를 골라 응답을 확인하세요. 이 예제는 상태를 출력한 뒤 응답을 비우지만, 애플리케이션은 대신 본문을 소비할 수 있습니다. 쿼리는 요청 대상의 일부로 남습니다.

완전한 URL이 그 자리에 속하는 이유

오리진 서버는 보통 /news?q=proxy 같은 대상을 받습니다. 포워드 프록시에는 목적지도 필요하므로 HTTP/1.1은 대상을 절대 형식으로 정의합니다.

GET http://example.com/news?q=proxy HTTP/1.1
Host: example.com

HTTP/1.1 규칙에 따르면 절대 형식을 받은 프록시는 전달할 때 URI의 권한을 사용하고, 일관되지 않은 수신 Host 필드를 교체합니다. 일관된 목적지 Host 헤더를 보내면 나가는 요청은 여전히 모호하지 않습니다. Node의 연결 호스트 이름은 중개자이므로 그 연결 주소에 기대지 말고 헤더를 의도적으로 설정하세요.

인증이 필요하면 프록시 자격 증명은 그 홉에 속합니다. Node의 auth 요청 옵션은 리소스용 Authorization 헤더를 만들 뿐이며 일반적인 프록시 로그인 옵션이 아닙니다. 교환이 더 복잡하면 프록시가 요구하는 스킴과 적절한 프록시 클라이언트를 사용하세요.

HTTPS는 터널을 더한다

이 예제는 평범한 HTTP 전달을 다룹니다. 일반적인 HTTP 프록시를 통한 HTTPS 연결은 먼저 CONNECT example.com:443을 요청한 다음, 수락된 터널 안에서 목적지로 TLS를 시작합니다. 예제 URL을 HTTPS로 바꾼다고 그 단계가 추가되지는 않습니다.

HTTPS나 혼합 워크로드에는 필요한 터널 지원을 갖춘 유지 관리되는 프록시 에이전트나 디스패처를 사용하세요. 호환되는 Node 버전에서는 ProxyAgent를 사용하는 Undici의 fetch가 한 가지 선택지입니다. 평범한 HTTP 교환 자체를 제어하거나 이해해야 하는 경우에는 이 작은 코어 클라이언트 예제를 남겨 두세요.

관련 글