본문으로 건너뛰기
Advertisement

18.4 Nginx 리버스 프록시 및 SSL/TLS 인증서 발급

EC2에서 직접 스프링 부트를 0.0.0.0:443으로 노출하는 것보다, Nginx를 앞단에 두고 SSL을 처리하는 것이 훨씬 안전하고 효율적입니다.

1. Nginx 설정 파일 작성

# /etc/nginx/sites-available/myapp

server {
listen 80;
server_name myapp.com www.myapp.com;

# HTTP → HTTPS 강제 리다이렉트
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name myapp.com www.myapp.com;

# Let's Encrypt 인증서 (Certbot이 자동으로 채워줌)
ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem;

# 권장 SSL 보안 설정
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

# 스프링 부트로 트래픽 전달 (리버스 프록시 핵심)
location / {
proxy_pass http://localhost:8080; # 내부 스프링으로 포워드
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;
}
}

2. Let's Encrypt 무료 SSL 인증서 발급 (Certbot)

# Certbot 설치
sudo apt install certbot python3-certbot-nginx -y

# 인증서 발급 (도메인 검증 및 Nginx 설정 자동 업데이트)
sudo certbot --nginx -d myapp.com -d www.myapp.com

# Certbot은 자동으로 90일마다 인증서를 갱신합니다 (cron 등록됨)
# 갱신 테스트:
sudo certbot renew --dry-run

3. 스프링에서 HTTPS 뒤에 있는 원본 IP 얻기

Nginx 리버스 프록시를 거치면 스프링 서버에서는 모든 요청의 IP가 127.0.0.1(로컬)로 보입니다. 실제 클라이언트 IP 정보는 X-Forwarded-For 헤더에 담겨 오므로 스프링 설정을 추가해야 합니다.

server:
forward-headers-strategy: native # X-Forwarded-* 헤더를 신뢰하도록 설정

이 설정 없이 IP 기반 접근 제한이나 보안 로깅을 구현하면 모든 요청이 동일한 IP에서 온 것으로 잘못 기록됩니다.

Advertisement