개발/Nginx

Nginx 리버스 프록시, 왜 써야 할까요?

hanks 2026. 2. 21. 14:24
Nginx 리버스 프록시 설정에 대해 알아보고, 설정 시 고려해야 할 보안 사항과 Web Cache Deception 공격 방어법을 살펴봅니다.

Nginx 리버스 프록시, 왜 써야 할까요?

① 리버스 프록시가 필요한 이유

Nginx는 웹 서버, 로드 밸런서, 그리고 리버스 프록시로 많이 사용되는데요. 특히 리버스 프록시는 외부 요청을 받아 내부 서버로 전달해주는 역할을 합니다. 왜 이런 구조가 필요할까요?

  • 보안 강화: 클라이언트가 직접 내부 서버에 접근하는 것을 막아, 내부 서버의 IP 주소나 구조를 숨길 수 있습니다.
  • 로드 밸런싱: 여러 대의 서버에 트래픽을 분산시켜 서버 과부하를 방지하고, 서비스 가용성을 높일 수 있습니다.
  • 캐싱: 정적 콘텐츠를 캐싱하여 서버 응답 속도를 향상시키고, 트래픽을 줄일 수 있습니다.

아이티언에서 공공 클라우드 네이티브 전환을 위한 Nginx 기술 지원 서비스를 출시했다는 소식이 있네요. 클라우드 환경에서 Nginx를 활용하는 사례가 점점 늘어나는 것 같아요.

---

Nginx 리버스 프록시 설정, 이렇게 해보세요!

① 기본적인 Nginx 설정

Nginx 설정을 시작하기 전에, nginx.conf 파일을 열어서 수정해야 합니다. 보통 /etc/nginx/nginx.conf 또는 /usr/local/nginx/conf/nginx.conf에 위치해 있어요.

`nginx

http {

server {

listen 80;

server_name example.com;

location / {

proxy_pass http://backend_server;

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;

}

}

}

  • listen 80: 80번 포트로 들어오는 요청을 받습니다.
  • server_name example.com: example.com 도메인으로 접속하는 요청을 처리합니다.
  • location /: 모든 요청을 / 경로로 프록시합니다.
  • proxy_pass http://backend_server: backend_server로 요청을 전달합니다. 이 때, backend_server는 내부 서버의 IP 주소 또는 도메인 이름으로 설정해야 합니다.
  • proxy_set_header: 클라이언트의 정보를 내부 서버로 전달하기 위한 설정입니다. Host, X-Real-IP, X-Forwarded-For, X-Forwarded-Proto 헤더를 설정하여 클라이언트의 호스트, IP 주소, 프록시 정보, 프로토콜 정보를 전달합니다.

② 로드 밸런싱 설정

여러 대의 서버에 트래픽을 분산시키려면, upstream 블록을 사용해야 합니다.

`nginx

http {

upstream backend_servers {

server backend1.example.com;

server backend2.example.com;

server backend3.example.com;

}

server {

listen 80;

server_name example.com;

location / {

proxy_pass http://backend_servers;

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;

}

}

}

  • upstream backend_servers: backend_servers라는 이름으로 서버 그룹을 정의합니다.
  • server backend1.example.com: backend1.example.com 서버를 그룹에 추가합니다. 여러 대의 서버를 추가하여 로드 밸런싱을 구성할 수 있습니다.
  • proxy_pass http://backend_servers: backend_servers 그룹으로 요청을 전달합니다. Nginx는 이 그룹 내의 서버들에 트래픽을 분산시켜 줍니다.

③ SSL/TLS 설정

HTTPS를 사용하려면 SSL/TLS 인증서를 설정해야 합니다. Let's Encrypt를 사용하면 무료로 인증서를 발급받을 수 있어요.

`nginx

server {

listen 443 ssl;

server_name example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

location / {

proxy_pass http://backend_server;

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 https; # HTTPS를 명시적으로 설정

}

}

  • listen 443 ssl: 443번 포트로 들어오는 HTTPS 요청을 받습니다.
  • ssl_certificate: SSL 인증서 파일 경로를 지정합니다.
  • ssl_certificate_key: SSL 인증서 개인 키 파일 경로를 지정합니다.
  • X-Forwarded-Proto https: 내부 서버에 HTTPS 프로토콜을 사용하고 있음을 알려줍니다.

---

보안, 놓치지 마세요!

① Web Cache Deception 공격 방어

Web Cache Deception (WCD) 공격은 공격자가 캐시 서버를 속여 개인 정보가 담긴 페이지를 캐싱하도록 만드는 공격 기법입니다. 이글루코퍼레이션에서 WCD 공격 기법에 대한 글을 냈더라고요.

WCD 공격은 사용자가 요청한 페이지가 캐싱되도록 유도하여, 다른 사용자가 해당 페이지에 접근했을 때 개인 정보가 노출될 수 있도록 하는 공격입니다.

방어 방법

  • 정적 파일 경로 확인: Nginx 설정에서 정적 파일 경로를 명확하게 정의하고, 존재하지 않는 경로에 대한 요청은 차단해야 합니다.
  • 캐시 설정 검토: 불필요한 캐시 설정을 제거하고, 개인 정보가 포함된 페이지는 캐싱하지 않도록 설정해야 합니다.
  • 정기적인 보안 점검: Nginx 설정 및 웹 애플리케이션에 대한 정기적인 보안 점검을 통해 취약점을 발견하고 수정해야 합니다.

② 기타 보안 설정

  • 최신 버전 유지: Nginx를 최신 버전으로 유지하여 보안 패치를 적용해야 합니다.
  • 불필요한 모듈 비활성화: 사용하지 않는 모듈은 비활성화하여 공격 표면을 줄여야 합니다.
  • 접근 제어: IP 주소 기반 접근 제어를 통해 불필요한 접근을 차단해야 합니다.

---

마무리

Nginx 리버스 프록시는 웹 서비스의 성능과 보안을 향상시키는 데 매우 유용한 도구입니다. 기본적인 설정부터 로드 밸런싱, SSL/TLS 설정, 그리고 보안 설정까지 꼼꼼하게 관리하면 더욱 안전하고 효율적인 웹 서비스를 운영할 수 있을 거예요. 특히 Web Cache Deception 공격은 생각보다 흔하게 발생할 수 있으니, 미리 대비하는 것이 중요합니다.

체크리스트

  • [ ] Nginx 최신 버전 유지
  • [ ] SSL/TLS 인증서 설정
  • [ ] Web Cache Deception 공격 방어 설정
  • [ ] 불필요한 모듈 비활성화
  • [ ] IP 주소 기반 접근 제어 설정

출처:

  • [정글]프로젝트가 끝난 후 보완한 것 - 브런치 ([https://news.google.com/rss/articles/CBMiREFVX3lxTE5YRkZSdFZiQ0pUOFFTRDB5QWlJQWlnbjc0dFNVRnpNM0JvZlg3QkY3eDJsc0dLRWN2OWc0ejdiSEhYdlE3?oc=5](https://news.google.com/rss/articles/CBMiREFVX3lxTE5YRkZSdFZiQ0pUOFFTRDB5QWlJQWlnbjc0dFNVRnpNM0JvZlg3QkY3eDJsc0dLRWN2OWc0ejdiSEhYdlE3?oc=5))
  • Web Cache Deception 공격 기법 - 이글루코퍼레이션 ([https://news.google.com/rss/articles/CBMipgFBVV95cUxNWW1hZFBKeGM2RG5ZMEh3S3BzRlBoc2dLalVSRWNvRUFiazhRWkw3b1RkWFFlRHdPWnRKNHVKLUotTTZCTzA4MWNxNGpUdjIyM2NtSkhBSDJCM2VuT1dBM3E0YWVSc3dqTHNJbVhvNzhYcFZYcnRVSnlDbTdsQkJGNjZqMWRsUEQ4QkpZUUhGc1V5b0UyeWx5WEp2eWh0MzQtcXcwaFJB?oc=5](https://news.google.com/rss/articles/CBMipgFBVV95cUxNWW1hZFBKeGM2RG5ZMEh3S3BzRlBoc2dLalVSRWNvRUFiazhRWkw3b1RkWFFlRHdPWnRKNHVKLUotTTZCTzA4MWNxNGpUdjIyM2NtSkhBSDJCM2VuT1dBM3E0YWVSc3dqTHNJbVhvNzhYcFZYcnRVSnlDbTdsQkJGNjZqMWRsUEQ4QkpZUUhGc1V5b0UyeWx5WEp2eWh0MzQtcXcwaFJB?oc=5))
  • "공공 클라우드 네이티브 전환 지원" 아이티언, NGINX 서비스 출시 - 디지털데일리 ([https://news.google.com/rss/articles/CBMiZEFVX3lxTE9tTWdObmltSUhrMG5nS0ZNRV82dWNyUldGX0ZJSXA3NDJSeEhKNW85RDJobWpMRDdOVURBamdiSk1hYjdwZWNkeVY1VlUxck9nRGUyempCMjdub0JTOXdOYlFnQ2w?oc=5](https://news.google.com/rss/articles/CBMiZEFVX3lxTE9tTWdObmltSUhrMG5nS0ZNRV82dWNyUldGX0ZJSXA3NDJSeEhKNW85RDJobWpMRDdOVURBamdiSk1hYjdwZWNkeVY1VlUxck9nRGUyempCMjdub0JTOXdOYlFnQ2w?oc=5))
  • 아이티언, NGINX Plus 통해 DL그룹 주요 계열사 IT 인프라 Cloud 전환 완료 - 아이티비즈 ([https://news.google.com/rss/articles/CBMiZ0FVX3lxTE5MZElDOFJ4U2tPWENRLU9uWmFmcmdBZV9yZDVIcmFUSUZmRG5IeWkxc0lfQ2V1RC1xWVI3S1dCMlVHTU4xalIzWUUwLU03MEwzNmZ6dnVlMTNzM3pFaVd0c2xFZ3VFQzg?oc=5](https://news.google.com/rss/articles/CBMiZ0FVX3lxTE5MZElDOFJ4U2tPWENRLU9uWmFmcmdBZV9yZDVIcmFUSUZmRG5IeWkxc0lfQ2V1RC1xWVI3S1dCMlVHTU4xalIzWUUwLU03MEwzNmZ6dnVlMTNzM3pFaVd0c2xFZ3VFQzg?oc=5))
  • 아이티언, 공공 클라우드 네이티브 전환 위한 NGINX 기술 지원 서비스 출시 - 데일리시큐 ([https://news.google.com/rss/articles/CBMibEFVX3lxTE1DLTBCenJsODdUa2ZONjVUWFhGUTdCTzBVRTNiNC1QMjZSRm5YSFYzel93cUQyalFENVNSTGZlQkxyelRQWkN6UGNTajV1dHZpQTZlRDVMMkRwbGhTUzZWUHl1R3dISTRMRkhjaw?oc=5](https://news.google.com/rss/articles/CBMibEFVX3lxTE1DLTBCenJsODdUa2ZONjVUWFhGUTdCTzBVRTNiNC1QMjZSRm5YSFYzel93cUQyalFENVNSTGZlQkxyelRQWkN6UGNTajV1dHZpQTZlRDVMMkRwbGhTUzZWUHl1R3dISTRMRkhjaw?oc=5))