icon

안동민 개발노트

13장 : 실무 네트워크 인프라

프록시와 VPN


프록시(Proxy)는 대리인이라는 뜻 그대로, 클라이언트와 서버 사이에서 요청을 중개하는 서버입니다. 어떤 방향에서 중개하느냐에 따라 포워드 프록시와 리버스 프록시로 나뉘며, 각각 전혀 다른 목적으로 사용됩니다.


포워드 프록시 vs 리버스 프록시

Excalidraw 씬을 불러오는 중입니다.

포워드 프록시는 클라이언트 측에서 사용자A/B/C 요청을 대리하고, 리버스 프록시는 서버 측에서 SSL 종단·캐싱·라우팅 후 백엔드 S1~S3으로 전달합니다.


포워드 프록시

포워드 프록시(Forward Proxy)클라이언트 측에 위치하여 클라이언트의 요청을 대신 보냅니다. 서버는 프록시의 IP 주소만 볼 수 있고, 실제 클라이언트의 IP를 알 수 없습니다.

기업에서 직원들의 인터넷 접속을 관리하는 용도로 많이 사용합니다. 회사 프록시가 특정 사이트 접근을 차단하거나, 직원들의 웹 사용 기록을 모니터링합니다. 학교나 도서관의 인터넷 필터링도 포워드 프록시입니다.

개발 환경에서도 포워드 프록시를 만납니다. 회사 네트워크에서 npm install이 안 되는 경우, 프록시 설정이 원인인 경우가 많습니다.

proxy_config.sh
# 환경 변수 설정
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=http://proxy.company.com:8080
export NO_PROXY=localhost,127.0.0.1,.company.com

# npm 프록시 설정
npm config set proxy http://proxy.company.com:8080
npm config set https-proxy http://proxy.company.com:8080

# git 프록시 설정
git config --global http.proxy http://proxy.company.com:8080

리버스 프록시

리버스 프록시(Reverse Proxy)서버 측에 위치하여 클라이언트의 요청을 받아 적절한 백엔드 서버로 전달합니다. 클라이언트는 리버스 프록시와만 통신하고, 뒤에 어떤 서버가 있는지 알 수 없습니다.

이전 절의 로드 밸런서가 사실 리버스 프록시의 한 형태입니다. 그 외에도 다양한 역할을 합니다.

기능설명효과
SSL 종단TLS를 프록시에서 처리인증서 관리 일원화
캐싱정적 파일, API 응답 캐시백엔드 부하 감소
압축gzip/brotli 압축대역폭 절약
보안백엔드 IP 은닉, WAF공격 표면 축소
속도 제한요청 수 제한(Rate Limit)DDoS 완화

Nginx를 리버스 프록시로 사용하기

Nginx는 가장 널리 사용되는 리버스 프록시이자 웹 서버입니다.

nginx.conf
upstream backend {
    least_conn;                         # 최소 연결 알고리즘
    server 127.0.0.1:3001 weight=3;     # 가중치 3
    server 127.0.0.1:3002 weight=1;     # 가중치 1
    server 127.0.0.1:3003 backup;       # 백업 서버
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;  # HTTP → HTTPS 리다이렉트
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;

    # 정적 파일 직접 서빙 (백엔드 거치지 않음)
    location /static/ {
        root /var/www;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # API는 백엔드로 프록시
    location /api/ {
        proxy_pass http://backend;
        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;

        # 타임아웃 설정
        proxy_connect_timeout 5s;
        proxy_read_timeout 30s;
    }

    # WebSocket 지원
    location /ws/ {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

X-Real-IPX-Forwarded-For 헤더는 원래 클라이언트의 IP 주소를 백엔드에 전달하기 위한 것입니다. 프록시를 거치면 백엔드가 보는 IP는 프록시의 IP이므로, 이 헤더로 실제 클라이언트 IP를 전달합니다.


VPN

VPN(Virtual Private Network)은 공용 인터넷을 통해 가상의 사설 네트워크를 구성합니다.

Excalidraw 씬을 불러오는 중입니다.

VPN 없이 평문 트래픽은 도청 가능하지만, VPN 사용 시 암호화 터널과 캡슐화로 외부에서는 VPN 서버와의 연결만 보입니다.

VPN의 핵심은 터널링(Tunneling)입니다. 원래의 패킷을 암호화한 후, 새로운 패킷으로 감싸서 전송합니다. 외부에서 보면 VPN 서버와의 단일 연결만 보이고, 그 안에서 어떤 통신이 이루어지는지 알 수 없습니다.

프로토콜계층암호화성능특징
IPsecL3IKEv2좋음AWS VPN, site-to-site
OpenVPNL4 (TLS)TLS보통오픈소스, 유연
WireGuardL3ChaCha20매우 좋음코드 4000줄, 커널 통합
L2TP/IPsecL2+L3IPsec보통레거시, 잘 안 씀

개발자 실무에서 VPN은 주로 회사의 개발 서버, 데이터베이스, 내부 API에 외부에서 접근할 때 사용합니다. VPN에 연결하면 회사의 사설 IP 대역에 접근할 수 있게 됩니다.

다음 절에서는 클라우드와 컨테이너 환경의 네트워크를 다루겠습니다.

목차