프록시와 VPN
프록시(Proxy)는 대리인이라는 뜻 그대로, 클라이언트와 서버 사이에서 요청을 중개하는 서버입니다. 어떤 방향에서 중개하느냐에 따라 포워드 프록시와 리버스 프록시로 나뉘며, 각각 전혀 다른 목적으로 사용됩니다.
포워드 프록시 vs 리버스 프록시
포워드 프록시는 클라이언트 측에서 사용자A/B/C 요청을 대리하고, 리버스 프록시는 서버 측에서 SSL 종단·캐싱·라우팅 후 백엔드 S1~S3으로 전달합니다.
포워드 프록시
포워드 프록시(Forward Proxy)는 클라이언트 측에 위치하여 클라이언트의 요청을 대신 보냅니다. 서버는 프록시의 IP 주소만 볼 수 있고, 실제 클라이언트의 IP를 알 수 없습니다.
기업에서 직원들의 인터넷 접속을 관리하는 용도로 많이 사용합니다. 회사 프록시가 특정 사이트 접근을 차단하거나, 직원들의 웹 사용 기록을 모니터링합니다. 학교나 도서관의 인터넷 필터링도 포워드 프록시입니다.
개발 환경에서도 포워드 프록시를 만납니다. 회사 네트워크에서 npm install이 안 되는 경우, 프록시 설정이 원인인 경우가 많습니다.
# 환경 변수 설정
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는 가장 널리 사용되는 리버스 프록시이자 웹 서버입니다.
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-IP와 X-Forwarded-For 헤더는 원래 클라이언트의 IP 주소를 백엔드에 전달하기 위한 것입니다. 프록시를 거치면 백엔드가 보는 IP는 프록시의 IP이므로, 이 헤더로 실제 클라이언트 IP를 전달합니다.
VPN
VPN(Virtual Private Network)은 공용 인터넷을 통해 가상의 사설 네트워크를 구성합니다.
VPN 없이 평문 트래픽은 도청 가능하지만, VPN 사용 시 암호화 터널과 캡슐화로 외부에서는 VPN 서버와의 연결만 보입니다.
VPN의 핵심은 터널링(Tunneling)입니다. 원래의 패킷을 암호화한 후, 새로운 패킷으로 감싸서 전송합니다. 외부에서 보면 VPN 서버와의 단일 연결만 보이고, 그 안에서 어떤 통신이 이루어지는지 알 수 없습니다.
| 프로토콜 | 계층 | 암호화 | 성능 | 특징 |
|---|---|---|---|---|
| IPsec | L3 | IKEv2 | 좋음 | AWS VPN, site-to-site |
| OpenVPN | L4 (TLS) | TLS | 보통 | 오픈소스, 유연 |
| WireGuard | L3 | ChaCha20 | 매우 좋음 | 코드 4000줄, 커널 통합 |
| L2TP/IPsec | L2+L3 | IPsec | 보통 | 레거시, 잘 안 씀 |
개발자 실무에서 VPN은 주로 회사의 개발 서버, 데이터베이스, 내부 API에 외부에서 접근할 때 사용합니다. VPN에 연결하면 회사의 사설 IP 대역에 접근할 수 있게 됩니다.
다음 절에서는 클라우드와 컨테이너 환경의 네트워크를 다루겠습니다.