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- NONOShttp://xx.xxx.xxx.xxx:8080- SEMO
이런 식으로 IP:PORT 번호까지 붙여서 접속해야 했고, HTTPS도 적용되지 않아 보안상 문제가 있었다.
목표:
https://nonos.kr- NONOShttps://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
설치 과정:
- 이메일 입력 (인증서 만료 알림용)
- 약관 동의:
Y - 뉴스레터 구독:
N - 자동으로 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에서
wwwA 레코드는 추가했지만 @(루트 도메인) 레코드를 추가 안 함
해결:
타입: 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
정리
배운 점
- DNS A 레코드는 IP만 지정 가능
- 포트 번호는 Nginx 리버스 프록시로 처리
- 서브도메인도 같은 IP를 가리킬 수 있음
- Let's Encrypt Certbot의 자동화
--nginx옵션으로 설정 파일 자동 수정- HTTP → HTTPS 리다이렉트 자동 설정
- 자동 갱신까지 한 번에 처리
- DNS 전파 시간 고려
- TTL 600초면 10분 정도 대기
- 서브도메인과 루트 도메인 전파 속도가 다를 수 있음
- HTTPS 전환은 일괄 처리가 좋음
- HTTP/HTTPS 혼용하면 콜백 URL 관리 복잡
- 처음부터 HTTPS 강제 리다이렉트 설정
소요 시간
- 도메인 구입 및 DNS 설정: 10분
- Nginx 설정: 15분
- SSL 인증서 발급: 5분
- DNS 전파 대기 및 트러블슈팅: 20분
- 총 약 50분
참고 자료
'역량 UP! > Business' 카테고리의 다른 글
| 1) SonTack(=손글씨 택배) 프로젝트의 시작~ (0) | 2026.04.16 |
|---|---|
| Claude Code로 유튜브 강의 스타일 영상 만들기 (0) | 2026.04.10 |
| 7) aw_project_🏀 팀플 : 안드로이드의 PUSH가 이상하다! 🏀 (0) | 2026.03.31 |
| 6) SeMo(Settlement + Moa = 정산 모아) : 정산관리+대시보드+거래내역서 (0) | 2026.03.27 |
| 5) SeMo(Settlement + Moa = 정산 모아) : 발주, 송장, 상품, CS 관리 기능 추가 (0) | 2026.03.23 |