HTTP/Guides/Proxy servers and tunneling

김동현·2026년 3월 22일

안녕하세요! 오늘 함께 살펴볼 MDN 문서는 웹 네트워크 환경에서 아주 중요한 역할을 하는 '프록시 서버와 터널링(Proxy servers and tunneling)'에 대한 내용입니다.

프론트엔드 개발을 하시다 보면 CORS 에러를 우회하기 위해 로컬 개발 서버(dev server)에 프록시를 설정하거나, 실무 환경에서 Nginx나 AWS 인프라와 같은 리버스 프록시를 마주할 일이 꼭 생기게 됩니다. 이번 기회에 프록시가 무엇인지, 어떤 종류가 있는지 확실히 이해해 두시면 앞으로의 실무에 큰 도움이 될 거예요. 자, 그럼 시작해 볼까요?


프록시 서버와 터널링 (Proxy servers and tunneling)

인터넷의 다양한 네트워크를 거쳐 탐색할 때, 프록시 서버(proxy servers)와 HTTP 터널(HTTP tunnels)은 월드 와이드 웹(World Wide Web)의 콘텐츠에 접근하는 것을 도와줍니다. 프록시는 사용자의 로컬 컴퓨터에 있을 수도 있고, 사용자의 컴퓨터와 인터넷상의 목적지 서버 사이 그 어느 곳에든 존재할 수 있습니다. 이 페이지에서는 프록시에 대한 몇 가지 기본 사항을 개략적으로 설명하고 몇 가지 설정 옵션을 소개합니다.

💡 강사의 팁: '프록시(Proxy)'라는 단어는 원래 '대리인'이라는 뜻을 가지고 있어요. 즉, 클라이언트(브라우저)와 서버가 직접 통신하는 대신, 중간에서 누군가가 요청을 대신 전달해 주고 응답을 받아다 주는 '중간자' 역할을 하는 서버라고 이해하시면 아주 쉽습니다!

프록시에는 두 가지 주요 유형이 있습니다: 포워드 프록시(forward proxies)(또는 터널, 게이트웨이라고도 함)와 리버스 프록시(reverse proxies)입니다. 리버스 프록시는 로드 밸런싱(부하 분산), 인증, 복호화 또는 캐싱을 위해 서버에 대한 접근을 제어하고 보호하는 데 사용됩니다.


이 문서의 내용 (In this article)


포워드 프록시 (Forward proxies)

포워드 프록시, 게이트웨이, 또는 그냥 단순하게 "프록시"라고 불리는 이것은 단일 클라이언트나 클라이언트 그룹에게 프록시 서비스를 제공합니다. 인터넷상에는 수십만 개의 공개된 포워드 프록시가 존재할 것입니다. 이들은 그룹이 사용하는 대역폭(bandwidth)을 줄이고 제어하기 위해 인터넷 서비스(DNS나 웹 페이지 등)를 저장하고 전달하는 역할을 합니다.

또한 포워드 프록시는 익명성을 제공하여, 사용자가 웹을 브라우징하거나 다른 인터넷 서비스를 사용할 때 자신의 IP 주소를 숨길 수 있도록 해줍니다. 예를 들어, Tor(토르) 프로젝트는 익명성을 보장하기 위해 여러 프록시를 거쳐 인터넷 트래픽을 라우팅(전달)합니다.

💡 강사의 팁: 포워드 프록시는 보통 '클라이언트(사용자)'를 감춰주는 역할을 합니다. 회사나 학교 네트워크에서 보안이나 트래픽 관리를 위해 특정 사이트(예: 게임 사이트) 접속을 차단할 때 바로 이 포워드 프록시를 거치도록 설정하는 경우가 많아요.


리버스 프록시 (Reverse proxies)

[Image of a reverse proxy load balancing web servers]

이름에서 알 수 있듯이, 리버스 프록시(역방향 프록시)는 포워드 프록시가 하는 일의 반대 역할을 수행합니다: 포워드 프록시가 클라이언트(요청하는 호스트)를 대신해서 행동한다면, 포워드 프록시가 클라이언트의 신원을 숨겨주는 반면 리버스 프록시는 서버의 신원을 숨겨줍니다. 리버스 프록시에는 여러 가지 사용 사례가 있는데, 그중 몇 가지는 다음과 같습니다:

  • 로드 밸런싱 (Load balancing): 들어오는 트래픽(부하)을 여러 대의 웹 서버로 분산시켜 줍니다.
  • 정적 콘텐츠 캐싱 (Cache static content): 사진이나 파일 같은 정적 콘텐츠를 캐싱하여, 실제 웹 서버의 부하를 덜어줍니다.
  • 압축 (Compression): 콘텐츠를 압축하고 최적화하여 로드 시간을 단축시켜 줍니다.

💡 강사의 팁: 프론트엔드 개발자에게 가장 친숙한 프록시가 바로 이 리버스 프록시입니다! 우리가 Next.js나 React 기반 앱을 개발할 때 next.config.jsrewrites 기능을 이용해 API 주소를 프록싱하여 CORS 에러를 해결하곤 하죠? 이때 브라우저(클라이언트) 입장에서는 실제 백엔드 서버의 주소는 모른 채, Next.js 서버(리버스 프록시 역할)와만 통신하게 됩니다. 이렇게 백엔드 서버를 감춰주고 보호하는 것이 핵심입니다.


프록시를 통한 클라이언트 정보 전달 (Forwarding client information through proxies)

프록시를 거치게 되면 요청이 마치 프록시의 IP 주소에서 발생한 것처럼 보이게 만들 수 있습니다. 이는 프록시가 클라이언트의 익명성을 제공할 때는 유용하지만, 다른 경우에는 원래 요청에서 출발한 정보가 유실된다는 뜻이기도 합니다. 원래 클라이언트의 진짜 IP 주소는 디버깅, 통계 수집, 또는 위치 기반 콘텐츠(location-dependent content)를 생성하는 데 자주 사용됩니다. 이 정보를 노출시키기 위해 일반적으로 다음과 같은 HTTP 헤더들을 사용합니다:

표준화된 헤더:

Forwarded
: 프록시 서버가 요청 경로에 개입할 때 변경되거나 손실되는, 클라이언트 쪽을 향하는 프록시 서버 측의 정보를 포함합니다.

또는 사실상의(de-facto) 표준 버전들:

X-Forwarded-For (비표준)
: HTTP 프록시나 로드 밸런서를 통해 웹 서버에 연결하는 클라이언트의 원래(최초) IP 주소를 식별합니다.

X-Forwarded-Host (비표준)
: 클라이언트가 프록시나 로드 밸런서에 연결하기 위해 사용했던 원래 요청 호스트(host)를 식별합니다.

X-Forwarded-Proto (비표준)
: 클라이언트가 프록시나 로드 밸런서에 연결할 때 사용했던 프로토콜(HTTP 또는 HTTPS)을 식별합니다.

💡 강사의 팁: 이 중에서 X-Forwarded-For (흔히 XFF라고 부릅니다) 헤더는 실무에서 정말 많이 쓰입니다. 백엔드 서버에서 "접속한 사용자의 IP를 남겨줘!"라고 할 때, 그냥 IP를 읽으면 프록시 서버의 IP만 찍히게 됩니다. 그래서 프론트엔드나 백엔드 로직에서 진짜 유저의 IP를 찾을 때는 이 XFF 헤더 값을 확인하는 것이 필수적입니다.

프록시에 연결하는 클라이언트에 대한 정보가 아니라, 프록시 자체에 대한 정보를 제공하기 위해서는 Via 헤더를 사용할 수 있습니다.

Via
: 포워드 프록시와 리버스 프록시 모두에 의해 추가되며, 요청 헤더와 응답 헤더 모두에 나타날 수 있습니다.


HTTP 터널링 (HTTP tunneling)

터널링은 데이터를 캡슐화(encapsulating)하여 공개 네트워크(public network)를 통해 사설 네트워크 데이터 및 프로토콜 정보를 전송하는 기술입니다. HTTP 터널링은 더 낮은 수준의 프로토콜(TCP)을 전송하기 위해 더 높은 수준의 프로토콜(HTTP)을 사용하는 것입니다.

HTTP 프로토콜은 CONNECT라는 요청 메서드를 명시하고 있습니다. 이 메서드는 요청된 리소스와 양방향 통신을 시작하며 터널을 여는 데 사용될 수 있습니다. 이것이 바로 HTTP 프록시 뒤에 있는 클라이언트가 TLS(즉, HTTPS, 포트 443)를 사용하여 웹사이트에 접근할 수 있는 원리입니다. 단, 모든 프록시 서버가 CONNECT 메서드를 지원하는 것은 아니며, 포트 443에만 제한적으로 허용하는 경우도 있다는 점을 유의하세요.

더 자세한 내용은 위키백과의 HTTP 터널 기사(HTTP tunnel article on Wikipedia)를 참조하시기 바랍니다.


프록시 자동 설정 (Proxy Auto-Configuration, PAC)

프록시 자동 설정(PAC) 파일은 웹 브라우저의 요청(HTTP, HTTPS, FTP)이 목적지로 직접 갈지 아니면 웹 프록시 서버로 전달될지를 결정하는 JavaScript 함수입니다. PAC 파일에 포함된 JavaScript 코드가 이 함수를 정의합니다.

자동 설정 파일은 .pac 파일 확장자를 가진 파일(예: proxy.pac)로 저장되어야 합니다.

그리고 MIME 타입은 application/x-ns-proxy-autoconfig로 설정해야 합니다.

이 파일은 FindProxyForURL이라는 함수 하나로 구성됩니다. 아래의 예제는 내부 DNS 서버가 내부 호스트 이름만 확인할 수 있도록 설정된 환경에서 작동하며, 목적은 이름 확인이 불가능한 외부 호스트에 대해서만 프록시를 사용하도록 하는 것입니다:

function FindProxyForURL(url, host) {
  if (isResolvable(host)) {
    return "DIRECT";
  }
  return "PROXY proxy.example.com:8080";
}

💡 강사의 팁: PAC 파일은 일반적인 프론트엔드 개발에서는 자주 볼 일이 없지만, 엔터프라이즈 환경(대기업, 은행 등 인트라넷이 복잡한 곳)에서 사내망과 외부망을 분리하여 접속하게 할 때 흔히 사용되는 방식이랍니다.


같이 보기 (See also)

profile
프론트에_가까운_풀스택_개발자

0개의 댓글