리버스 프록시(Reverse Proxy)란?
리버스 프록시는 서버의 한 종류이다.
클라이언트의 요청을 직접 백엔드 서버로 전달하지 않고 중간에 위치한 서버가 요청을 대신 받아 내부의 웹 서버(애플리케이션 서버)로 전달하며, 서버의 응답 역시 다시 클라이언트에게 전달하는 중개자 역할을 한다.
대표적으로 Nginx, Apache, HAProxy 등이 리버스 프록시 서버로 널리 사용된다.
주요 특징과 역할
- 중개자 역할
- 클라이언트 ↔ 리버스 프록시 ↔ 내부의 실제 서버
- 보안 강화
- 실제 서버의 IP와 정보가 외부에 노출되지 않아 보안성이 높아짐
- SSL 인증서 관리, 접근 제어 등도 리버스 프록시 단계에서 처리 가능
- 로드 밸런싱 (부하 분산)
- 여러 대의 서버로 트래픽을 분산시켜 서버 부하를 줄이고, 서비스의 확장성과 안정성을 높일 수 있음
- 캐싱 및 성능 향상
- 자주 요청되는 데이터를 리버스 프록시에서 캐싱하여 빠르게 응답할 수 있음
- 정적 파일 서빙
- 이미지, JS, CSS 등 정적 파일을 빠르게 서비스할 수 있음
동작 방식
- 클라이언트가 리버스 프록시(nginx 등)에 요청을 보냄
- 리버스 프록시가 내부 서버(예: Spring Boot)에 요청을 전달
- 내부 서버가 응답을 생성해 리버스 프록시에 전달
- 리버스 프록시가 응답을 클라이언트에게 반환
이 과정에서 클라이언트는 실제 서버의 위치나 포트는 몰라도 되고, 항상 리버스 프록시만 호출하면 된다.
EC2에 Spring Boot 배포 시 Nginx의 필요성
Nginx 없이 배포할 수 있는가?
- Spring Boot는 자체 내장 톰캣(서블릿 컨테이너)을 가지고 있어, ec2에서 바로 실행(java -jar ...)하면 8080 포트 등에서 서비스 가능
- ec2 보안그룹에서 해당 포트(예: 8080)를 열어주면 외부에서 http://EC2_IP:8080으로 접속할 수 있음
Nginx를 쓰는 이유
Nginx는 필수는 아니지만, 여러 장점 때문에 실무에서 거의 표준처럼 사용된다.
- 80/443 포트로 서비스
웹사이트는 일반적을 포트 번호 없이(80/443) 접속한다. Nginx가 80/443 포트를 받아 내부적으로 8080 등으로 프록시해줄 수 있다. - HTTPS(SSL) 적용이 쉬움
Nginx에서 SSL 인증서 설정이 쉽고, Spring Boot는 HTTP로만 띄워도 된다. 인증서 갱신, 관리 등도 Nginx에서 일괄 처리 가능 - 리버스 프록시, 보안, 로드밸런싱, 무중단 배포
여러 서버로 분산, 무중단 배포, 보안 헤더 추가 등 다양한 기능을 제공 - 정적 파일 서빙
WAS에서 정적 파일까지 처리하면 부하가 커질 수 있으므로, 정적 파일(이미지, JS, CSS 등)은 Nginx에서 빠르게 서비스 할 수 있다.
더보기
웹 브라우저에서 사용자가 http://~.com 또는 https://~.com 포트번호 없이 접속하면, 브라우저는 기본적으로 아래와 같은 기본 포트(default port) 를 사용한다.
- HTTP: 포트 80
- HTTPS: 포트 443
즉, 사용자가 주소창에 포트를 직접 쓰지 않아도 브라우저는 자동으로 해당 포트를 붙여서 접속한다.
이러한 80,443 포트는 Privileged Ports라고 하여 루트 권한이 없는 일반 사용자 계정은 사용할 수 없다.
(Spring Boot는 기본적으로 8080 포트에서 서버를 띄운다.)
추가적으로 실무에서는 보안상의 이유로 Spring Boot 애플리케이션을 루트 권한으로 실행하는 것은 매우 위험하다.
Nginx는 다음과 같은 방식으로 동작한다 :
- Nginx는 루트 권한으로 시작되며 80/443 포트를 사용하여 클라이언트의 요청을 받는다.
- 이후 요청을 포트 8080에서 동작하는 Spring Boot 서버로 프록시(Proxy) 해준다.
- 이를 리버스 프록시(reverse proxy)라고 한다.
- 이 구조 덕분에:
- 사용자는 포트 번호 없이 자연스럽게 접속하고
- 서버는 8080 같은 안전한 포트에서 돌아가며
- 보안, 성능, 로드 밸런싱 등 다양한 이점을 함께 누릴 수 있다.
결론 및 요약
- Nginx 없이도 ec2에서 Spring Boot를 바로 배포할 수 있다.
- 단, 포트 번호를 붙여야 하고 SSL 등 고급 기능은 직접 구현해야됨
- Nginx는 선택 사항이지만, 운영 환경에서는 거의 필수적으로 사용된다.