Node의 HTTP를 프록시로 라우팅하는 요청 라인
연결 엔드포인트, 절대 대상, Host 헤더를 분리해 Node의 코어 클라이언트로 평범한 HTTP 프록시 요청을 만듭니다.
포워드 프록시를 통과하는 일반 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 교환 자체를 제어하거나 이해해야 하는 경우에는 이 작은 코어 클라이언트 예제를 남겨 두세요.