Backend/SpringBoot

EC2 에 배포한 서버에 Https 적용하기

Dean83 2025. 9. 22. 14:45

크게 두가지 방법으로 구성 할 수 있다.

  • nginx 에서 https 를 적용 하고 처리하는 방법. 
  • AWS 서비스를 통해 적용하는 방법. 

둘 다 정리를 할 필요가 있어 보인다. 일단 둘 다, 도메인은 이미 구입 하고, route53 에 설정했다는 가정하에 적는다.

 

  • nginx 에서 처리 하는 방법
    • EC2 에서, 다음의 명령을 통해 nginx 설치
sudo apt update
sudo apt install nginx -y
  • lets encrypt를 이용해 인증서 발급
  • 만일 ec2가 우분투 라면 다음의 커멘드 실행
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
  • nginx 플러그인을 이용해 자동으로 설정
//실제 url을 적어야 한다.
sudo certbot --nginx -d example.com -d www.example.com
  • 이메일 등을 입력하여 인증서를 받는다. 이후 90일 마다 갱신을 해줘야 하므로, 다음의 커맨드를 입력한다. 
sudo crontab -e

 

   새벽 3시에 자동갱신하는 커맨드

0 3 * * * certbot renew --quiet



  • /etc/nginx/sites-available/springboot.conf 가 있거나, 설정파일이 있으면 확인해서 아래 설정과 대조하기. (없으면 만들어야함)
server {
    listen 80;
    server_name example.com www.example.com; #실제 도메인 이름 입력

    # http 요청을 https로 리다이렉트
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;  #실제 도메인 이름 입력

    # SSL 인증서 경로 (Let’s Encrypt 기준)
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 보안 옵션 (권장)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://127.0.0.1:8080;   # Spring Boot 서버
        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 ln -s /etc/nginx/sites-available/springboot.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

 

 

  • AWS 를 통해 설정하는 법
    • ACM 인증서 발급
      • Certificate Manager(ACM) 으로 접속하여, 공인 인증서 요청 클릭
      • 도메인 입력 하고, DNS 검증을 하여 발급 (도메인은 미리 구매하고 Route 53에 연결했어야 한다) 
    • EC2 설정
      • Target Groups -> Create target group 클릭
      • target type 는 인스턴스 혹은 ip를 입력.
      • protocol은 http 입력
      • 포트 80 (혹은 nginx 에서 설정한 포트번호) 입력
    • 로드밸런서 설정
      • EC2 -> Load balancers -> 로드밸런서 생성 (Application Load Balancer)
      • 나머지 설정은 인터넷 참조하여 하고, 443 리스너에서 ACM에서 발급한 인증서 선택
    • Route53 설정
      • 도메인을 연결한 것을 Application Load Balancer 로 보내도록 Alias 생성
    • nginx 설정
server {
    listen 80;                     # ALB는 HTTP로 내부 전달
    server_name _;                 # ALB가 호스트 헤더로 실제 도메인을 전달

    # real IP (ALB가 X-Forwarded-For 헤더로 클라이언트 IP 전달)
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    # set_real_ip_from을 VPC CIDR으로 제한해주면 안전합니다.
    # set_real_ip_from 10.0.0.0/16;

    location / {
        proxy_pass         http://127.0.0.1:8080;  # Spring Boot (or upstream)
        proxy_http_version 1.1;
        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 $http_x_forwarded_proto;
        proxy_set_header   X-Forwarded-Port $server_port;

        # 웹소켓 등 필요한 경우
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";

        proxy_connect_timeout 5s;
        proxy_send_timeout    60s;
        proxy_read_timeout    60s;
    }
}
  • 필요하다면, springboot yaml  에 다음 설정 추가
    • X-Forwarded 헤더를 이용하게 되므로 스프링부트에 추가 설정을 한다.
# 경우에 따라 사용
server.use-forward-headers=true

'Backend > SpringBoot' 카테고리의 다른 글

Custom Annotation (Custom validation)  (0) 2025.10.29
Json 형식으로 로깅 하기 + MDC  (0) 2025.10.29
Swagger 사용하기  (0) 2025.09.22
간단하게 API 테스트 하기 (파일명.http)  (0) 2025.09.19
REST -> RESTful 예제  (0) 2025.09.19