역량 UP!/Business

22) nonos(No No Stress) - AWS EC2에서 도메인 연결하고 HTTPS 전환하기

태하팍 2026. 4. 6. 14:52
반응형

AWS EC2에서 도메인 연결하고 HTTPS 전환하기 (Gabia + Let's Encrypt)

배경

기존 개인 NAS에서 서비스 되던 Web Service를 정전이 되면 사용이 불가하여 EC2로 이전하는 작업을 했었다.
NONOS(네이버 스마트스토어 주문관리)와 SEMO(B2B 정산관리) 두 개의 Spring Boot 애플리케이션을 AWS EC2에 배포!
동일한 서버에 포트만 달리 배포하여 해당 문제점을 타파하고자 함.
SaaS전략으로 도메인을 연결해서 깔끔하게 사용하고자 함.
단, 하나의 도메인을 사서 분리하고자 함.(내돈내산!!)

문제:

  • http://xx.xxx.xxx.xxx:8090 - NONOS
  • http://xx.xxx.xxx.xxx:8080 - SEMO

이런 식으로 IP:PORT 번호까지 붙여서 접속해야 했고, HTTPS도 적용되지 않아 보안상 문제가 있었다.

목표:

  • https://nonos.kr - NONOS
  • https://semo.nonos.kr - SEMO

도메인으로 깔끔하게 접근하고, HTTPS로 보안 강화하기.


1. 도메인 구입 및 DNS 설정

1.1 Gabia에서 도메인 구입

nonos.kr 도메인을 Gabia에서 구입했다.
여러 도메인을 찾아봤는데 Whois는 가격이 비쌈. 다른 외국도메인은 도메인명이 맘에 들지 않음!

 

1.2 DNS A 레코드 설정

Gabia DNS 관리 페이지에서 다음 레코드들을 추가:

타입 호스트 TTL
A @ xx.xxx.xxx.xxx 600
A semo xxx.xxx.xxx.xx 600

핵심 포인트:

  • @ 레코드: 루트 도메인(nonos.kr)을 가리킴
  • semo 레코드: 서브도메인(semo.nonos.kr)을 가리킴
  • 같은 EC2 IP를 가리키지만, Nginx에서 포트 분기 처리

주의사항:

  • DNS A 레코드에는 포트 번호를 넣을 수 없음
  • 포트 라우팅은 Nginx 리버스 프록시로 처리해야 함

2. EC2 보안그룹 설정

AWS 콘솔 → EC2 → 보안그룹에서 인바운드 규칙 확인:

타입 프로토콜 포트 범위 소스
HTTP TCP 80 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0
SSH TCP 22 0.0.0.0/0
Custom TCP TCP 8080 0.0.0.0/0
Custom TCP TCP 8090 0.0.0.0/0

참고: 8080, 8090은 Nginx 설정 후에는 불필요하지만, 디버깅용으로 남겨둠.


3. Nginx 리버스 프록시 설정

3.1 Nginx 설치

sudo yum install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

3.2 NONOS 설정 파일 생성

/etc/nginx/conf.d/nonos.conf:

server {
    listen 80;
    server_name nonos.kr;

    location / {
        proxy_pass http://localhost:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

3.3 SEMO 설정 파일 생성

/etc/nginx/conf.d/semo.conf:

server {
    listen 80;
    server_name semo.nonos.kr;

    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;
    }
}

3.4 Nginx 설정 검증 및 재시작

sudo nginx -t
sudo systemctl reload nginx

이 시점에서 테스트:

  • http://nonos.kr → 8090 포트로 프록시
  • http://semo.nonos.kr → 8080 포트로 프록시

4. Let's Encrypt SSL 인증서 발급

4.0 Let's Encrypt

✅ 비용: 무료
✅ 갱신: 자동 (90일마다)
✅ 신뢰도: 브라우저 모두 인정
✅ 용도: 개인, 스타트업, 중소기업 대부분
✅ 제약: DV(Domain Validation)만 가능

4.1 Certbot 설치

sudo yum install certbot python3-certbot-nginx -y

4.2 SSL 인증서 자동 발급

sudo certbot --nginx -d nonos.kr -d semo.nonos.kr

설치 과정:

  1. 이메일 입력 (인증서 만료 알림용)
  2. 약관 동의: Y
  3. 뉴스레터 구독: N
  4. 자동으로 Nginx 설정 업데이트됨

Certbot이 자동으로 처리하는 것:

  • SSL 인증서 발급
  • Nginx 설정에 HTTPS 블록 추가
  • HTTP → HTTPS 리다이렉트 설정
  • 자동 갱신 cron job 등록 (90일마다)

4.3 최종 Nginx 설정 (자동 생성됨)

/etc/nginx/conf.d/nonos.conf:

server {
    listen 443 ssl;
    server_name nonos.kr;

    location / {
        proxy_pass http://localhost:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    ssl_certificate /etc/letsencrypt/live/nonos.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nonos.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name nonos.kr;
    return 301 https://$host$request_uri;
}

5. 트러블슈팅

문제 1: nonos.kr은 안 되고 www.nonos.kr만 작동

증상:

  • www.nonos.kr 접속 가능
  • nonos.kr 접속 불가

원인:

  • Gabia DNS에서 www A 레코드는 추가했지만
  • @ (루트 도메인) 레코드를 추가 안 함

해결:

타입: A
호스트: @
값: xx.xxx.xxx.xxx

문제 2: DNS 전파 지연

증상:

$ nslookup nonos.kr
*** Can't find nonos.kr: No answer

원인:

  • DNS 레코드 추가 후 전파 시간 필요 (TTL 600초 = 10분)

해결:

  • 서브도메인(semo.nonos.kr)이 먼저 전파 확인됨
  • 루트 도메인도 10-20분 후 정상 전파

확인 방법:

nslookup nonos.kr
nslookup semo.nonos.kr

문제 3: 브라우저에서 자동으로 HTTPS로 리다이렉트

증상:

  • SSL 설정 전인데 브라우저가 HTTPS로 접속 시도
  • 연결 실패

원인:

  • 브라우저 HSTS(HTTP Strict Transport Security) 캐시
  • 이전에 HTTPS로 접속한 기록이 있으면 강제 리다이렉트

해결:

  • SSL 인증서 설치로 근본 해결
  • 또는 브라우저 HSTS 캐시 삭제 (chrome://net-internals/#hsts)

6. 최종 결과

접속 테스트

# DNS 확인
$ nslookup nonos.kr
Name:    nonos.kr
Address: xxx.xxx.xxx.xx

$ nslookup semo.nonos.kr
Name:    semo.nonos.kr
Address: xxx.xxx.xxx.xx

# HTTPS 접속 확인
$ curl -I https://nonos.kr
HTTP/2 200 
server: nginx/1.24.0

$ curl -I https://semo.nonos.kr
HTTP/2 200 
server: nginx/1.24.0

브라우저 접속

  • https://nonos.kr → NONOS 애플리케이션
  • https://semo.nonos.kr → SEMO 애플리케이션
  • ✅ HTTP로 접속해도 자동으로 HTTPS로 리다이렉트

7. 추가 작업 (TODO)

7.1 네이버 API 콜백 URL 변경

네이버 개발자센터 → 내 애플리케이션 → NONOS:

변경 전: http://xxx.xxx.xxxx.xxx:8090/callback
변경 후: https://nonos.kr/callback

7.2 GitHub Secrets 환경변수 업데이트

# 변경 전
CALLBACK_URL=http://xxx.xxx.xxx.xxxx:8090/callback

# 변경 후
CALLBACK_URL=https://nonos.kr/callback

7.3 SSL 인증서 자동 갱신 확인

# 테스트 (실제 갱신 안 함)
sudo certbot renew --dry-run

# Cron job 확인 (자동 등록됨)
sudo systemctl list-timers | grep certbot

정리

배운 점

  1. DNS A 레코드는 IP만 지정 가능
    • 포트 번호는 Nginx 리버스 프록시로 처리
    • 서브도메인도 같은 IP를 가리킬 수 있음
  2. Let's Encrypt Certbot의 자동화
    • --nginx 옵션으로 설정 파일 자동 수정
    • HTTP → HTTPS 리다이렉트 자동 설정
    • 자동 갱신까지 한 번에 처리
  3. DNS 전파 시간 고려
    • TTL 600초면 10분 정도 대기
    • 서브도메인과 루트 도메인 전파 속도가 다를 수 있음
  4. HTTPS 전환은 일괄 처리가 좋음
    • HTTP/HTTPS 혼용하면 콜백 URL 관리 복잡
    • 처음부터 HTTPS 강제 리다이렉트 설정

소요 시간

  • 도메인 구입 및 DNS 설정: 10분
  • Nginx 설정: 15분
  • SSL 인증서 발급: 5분
  • DNS 전파 대기 및 트러블슈팅: 20분
  • 총 약 50분

참고 자료

반응형