포스트

Proxy (Forward vs Reverse)

프록시 서버의 두 가지 방식 — Forward Proxy와 Reverse Proxy가 무엇을 가리는지

Proxy (Forward vs Reverse)

프록시는 클라이언트와 서버 사이에서 대리로 통신을 수행하는 중계기. 어느 쪽을 가리느냐에 따라 Forward와 Reverse로 나뉜다.

한 줄 요약

구분누구를 가리나누가 위치를 아나
Forward Proxy클라이언트가 보이지 않는다클라이언트는 실제 서버 도메인을 안다
Reverse Proxy서버가 보이지 않는다클라이언트는 프록시 도메인만 안다

Forward Proxy

1
[클라이언트들] ──→ [Forward Proxy] ──→ [인터넷의 여러 서버]

클라이언트가 인터넷에 직접 나가지 않고 사내 프록시를 통해 나간다.

전형적 사용처

  • 회사 방화벽: 사외 접근 통제·로깅
  • 캐시 프록시(squid 등): 동일 요청 재사용
  • 우회: 차단된 사이트 접근

서버 입장에서는 모든 트래픽이 프록시 IP에서 오는 것처럼 보인다. 클라이언트의 실제 IP는 가려진다.

Reverse Proxy

1
[인터넷의 클라이언트들] ──→ [Reverse Proxy (nginx)] ──→ [내부 서버 A, B, C]

클라이언트는 프록시 도메인만 알고 그쪽으로 요청을 보낸다. 프록시가 내부 서버 중 적절한 곳에 라우팅한다.

전형적 사용처

  • 로드 밸런싱: 동일 서비스의 여러 인스턴스에 분산
  • 화면 라우팅: /api는 백엔드, /는 SPA로
  • SSL 종단: HTTPS 처리 한 군데에 집중
  • 캐시·압축: 정적 자원 캐시
  • 보안: 백엔드 IP·포트를 외부에 노출하지 않음

가장 간단한 nginx 리버스 프록시

1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

X-Forwarded-* 헤더는 백엔드가 원래 요청한 클라이언트 IP/스킴을 알게 해주는 컨벤션. Spring Boot 같은 프레임워크는 이걸 보고 request.getRemoteAddr()를 보정하므로 빼먹지 말 것.

한쪽으로만 쓰지 않는다

같은 nginx 인스턴스가 외부에는 reverse proxy이면서 사내망 쪽으로는 forward proxy 역할을 하기도 한다. “프록시 = 중계”라는 본질은 같고 방향만 다르다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.