리버스 프록시(Reverse Proxy)의 개념과 Nginx를 활용한 SSL/TLS 보안 적용 실습 정보를 공유합니다.
웹 서비스를 직접 구축하다 보면 백엔드 애플리케이션(Node.js, Spring Boot, Django 등)을 외부 인터넷에 그대로 노출하는 일이 얼마나 위험한지 깨닫게 됩니다. 보안 점검을 받거나 서비스 규모를 늘릴 때 빠지지 않고 등장하는 핵심 개념이 바로 ‘리버스 프록시(Reverse Proxy)’입니다.
리버스 프록시가 무엇인지, 흔히 혼동하는 포워드 프록시와 어떻게 다른지 살펴보고, Nginx와 Certbot(Let’s Encrypt)을 써서 무료 SSL 인증서 기반의 암호화 보안 프록시 환경을 구축하는 방법을 차근차근 정리했습니다.
1. 리버스 프록시 vs 포워드 프록시: 개념 확실히 잡기
‘프록시(Proxy)’는 말 그대로 대리인 역할을 뜻합니다. 그런데 누구를 대신해주느냐에 따라 방향이 완전히 달라집니다.
- 포워드 프록시(Forward Proxy) – 클라이언트를 보호:
내 컴퓨터(클라이언트)가 인터넷에 있는 서버에 접근할 때 중간에 대리인을 거쳐 가는 방식입니다. 회사 내부망에서 특정 사이트 접속을 막거나, 내 실제 IP를 숨기고 외부 인터넷에 요청을 보낼 때 쓰입니다. 핵심은 ‘서버는 내가 누군지 모른다’는 점입니다. - 리버스 프록시(Reverse Proxy) – 서버를 보호:
반대로 사용자가 웹사이트에 접속할 때, 진짜 백엔드 서버로 바로 들어가는 것이 아니라 앞단에 서 있는 대리인(Nginx 등)을 먼저 거치게 만드는 방식입니다. 외부 클라이언트는 실제 내부 서버의 구조나 IP를 알 수 없습니다. 핵심은 ‘클라이언트는 자기가 프록시와 대화하는지, 진짜 서버와 대화하는지 모른다’는 점입니다.
리버스 프록시를 쓰는 이유
- 보안 강화: 내부 애플리케이션 서버의 IP와 포트(예: 3000, 8080)를 숨깁니다.
- 부하 분산(Load Balancing): 하나의 프록시가 요청을 받아 여러 대의 백엔드 서버로 나누어 보내줄 수 있습니다.
- SSL 암호화 전담: 암호화(HTTPS) 처리를 프록시가 혼자 다 맡아서 하고, 내부 서버와는 가볍고 빠른 HTTP 통신을 유지해 백엔드 서버의 부담을 줄여줍니다.
2. Nginx를 활용한 리버스 프록시 기본 설정
사용자가 80번(HTTP) 포트로 들어왔을 때, 내부에서 돌고 있는 3000번 포트의 Node.js 앱으로 요청을 몰래 전달해 주는 기본 설정입니다.
Nginx 설정 파일(/etc/nginx/sites-available/default 또는 별도 conf 파일)을 열어 다음과 같이 작성합니다.
Nginx
server {
listen 80;
server_name mydomain.com; # 본인의 도메인 주소
location / {
# 내부 애플리케이션 서버 주소로 요청 전달
proxy_pass http://127.0.0.1:3000;
# 진짜 클라이언트의 IP 정보를 백엔드 서버로 전달하기 위한 헤더 설정
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;
}
}
설정 후 sudo nginx -t로 오타 검사를 하고 sudo systemctl reload nginx를 실행하면, 외부에서 [http://mydomain.com](http://mydomain.com)으로 들어와도 내부 3000번 포트의 화면이 깔끔하게 뜨게 됩니다.
3. Let’s Encrypt와 Certbot으로 무료 SSL(HTTPS) 적용 및 자동 갱신
요즘 웹사이트에서 HTTPS(SSL/TLS) 적용은 선택이 아닌 필수입니다. Let’s Encrypt를 이용하면 비용 한 푼 들이지 않고 90일짜리 정식 SSL 인증서를 발급받아 적용할 수 있습니다.
① Certbot 설치하기
우분투(Ubuntu) 기준, Nginx용 Certbot 플러그인을 설치해 줍니다.
Bash
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
② SSL 인증서 자동 발급 및 Nginx 설정 자동화
Certbot의 가장 강력한 점은 명령어 단 한 줄로 인증서 발급과 Nginx 설정 파일 변경을 알아서 다 해준다는 것입니다.
Bash
sudo certbot –nginx -d mydomain.com
실행하면 이메일 주소를 입력하라는 안내가 나오고, 이용 약관 동의 절차를 거칩니다. 과정 중간에 “HTTP로 들어온 요청을 HTTPS로 자동으로 리다이렉트할 것이냐” 물어보는데, 2번(Redirect)을 선택하는 것이 보안상 매우 유리합니다.
명령이 끝나면 Nginx 설정 파일에 SSL 관련 구문(listen 443 ssl;, 인증서 경로 등)이 자동으로 추가되며, 외부에서 접속 시 초록색 보안 락 아이콘이 뜨는 HTTPS로 전환됩니다.
③ 인증서 자동 갱신 검증하기
Let’s Encrypt 인증서는 유효기간이 90일로 짧지만, Certbot을 설치하는 순간 리눅스 시스템 타이머(systemctl list-timers)에 자동 갱신 스케줄러가 등록됩니다.
만료 30일 전에 알아서 갱신되는데, 아래 명령어로 갱신 테스트가 잘 돌아가는지 미리 점검해 볼 수 있습니다.
Bash
sudo certbot renew –dry-run
Congratulations, all simulated renews succeeded라는 문구가 나오면 자동 갱신 세팅까지 완전히 끝난 것입니다.
리버스 프록시 구조를 만들어 두면 나중에 백엔드 서버를 다른 머신으로 옮기거나 수평 확장(Scale-out)을 할 때도 외부 접속 주소를 건드릴 필요 없이 Nginx의 proxy_pass 주소만 살짝 바꿔주면 됩니다.
서비스 보안 향상과 유연한 시스템 구조 개편을 위해, Nginx 기반의 HTTPS 리버스 프록시 환경을 꼭 구축해 보시길 권장합니다.