도메인 및 SSL 설정 방법에 대해서 공유해보겠습니다!
💡참고
가비아에서 도메인 구매
AWS Route 53에서 서브 도메인 설정
🔐 Domain & SSL
1. Domain
a. 도메인 구매
- 가비아에서 howabout.shop 이라는 도메인 구매
- 구매 시 타사 네임서버 사용 옵션 선택
b. AWS Route 53에서 네임서버 정보 설정
- AWS Route 53에서 도메인의 호스팅 영역 생성
- 호스팅 정보 입력
- 도메인 이름 : howabout.shop 입력
- 타입 : Public hosted zone 선택
- 네임서버(NS) 레코드 확인
- 호스팅 영역을 생성하면 Route 53에서 기본적으로 네임서버(NS) 레코드와 SOA 레코드가 자동으로 생성
- 생성된 호스팅 영역의 NS 레코드에 나열된 네임서버 주소(보통 4개의 주소)를 확인
- 가비아 도메인 관리 페이지에서 네임서버 업데이트
- 가비아 웹사이트에 로그인하여 도메인 관리 페이지로 이동
- 네임서버 설정 변경 옵션 선택
- 타사 네임서버 사용을 선택한 후, Route 53에서 확인한 네임서버(NS) 주소를 각각 입력

c. Route 53에서 주 도메인 A 레코드 설정
- Route 53에서 호스팅 영역에 들어가 A 레코드를 생성
- howabout.shop을 도메인 이름으로 입력하고 값 필드에 EC2의 Public IP 또는 Elastic IP를 설정하여 주 도메인과 EC2를 연결
d. 서브 도메인 A 레코드 추가
- Route 53에서 호스팅 영역으로 이동
- AWS에 로그인한 후 Route 53 서비스로 이동
- 왼쪽 메뉴에서 Hosted Zones를 클릭하여 도메인 이름에 대한 호스팅 영역을 확인
- A 레코드 설정
- Record Name : 서브 도메인의 이름을 입력 ex) home
- Record Type : A(주소) 레코드를 선택
- Value : EC2 인스턴스의 Public IP 또는 Elastic IP 주소를 입력
- TTL (Time To Live) : 기본값으로 두거나 적절한 값을 설정
- Routing Policy : Simple Routing을 선택
- Evaluate Target Health : No 선택 (EC2 인스턴스가 정상적으로 작동하는지 확인하는 옵션, 기본적으로 EC2의 상태를 모니터링 하지 않도록 설정)
- A 레코드 생성
2. SSL 설정
a. Nginx 서버에 cerbot과 nginx 플러그인 설치
sudo apt update
sudo apt install certbot python3-certbot-nginx
b. Certbot으로 SSL 인증서 발급
sudo certbot --nginx -d home.howabout.shop
c. 설치 후 확인사항
- https://home.howabout.shop 접속 테스트
- 모든 경로에(엔드 포인트) 대한 HTTPS 동작 확인
- HTTP에서 HTTPS로 리다이렉션 확인
- SSL 인증서 정상 발급 여부 확인
- /etc/letsencrypt/live/home.howabout.shop/
d. 모든 인증서 목록 확인
sudo certbot certificates
3. Nginx 설정 파일
위에서 도메인 및 SSL 설정 방법을 공유해봤습니다!
설정을 모두 마치면 Nginx 설정 파일에도 변경되게 됩니다.
server {
listen 443 ssl; # managed by Certbot
server_name home.howabout.shop;
# FRONT
location / {
proxy_pass http://3.37.229.132:3000; # 리버스 프록시
proxy_set_header Host $host; # 원본 호스트 정보 전달
proxy_set_header X-Real-IP $remote_addr; # 실제 방문자 IP 전달
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시 거친 IP들의 목록
proxy_set_header X-Forwarded-Proto $scheme; # 프로토콜 정보(http/https) 전달
}
# BACK
location /api {
proxy_pass http://10.0.1.44: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;
}
# AI
location /ai {
proxy_pass http://10.0.2.211:8000;
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;
}
# SSL
# managed by Certbot
ssl_certificate /etc/letsencrypt/live/home.howabout.shop/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/home.howabout.shop/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
# HTTP -> HTTPS
# managed by Certbot
if ($host = home.howabout.shop) {
return 301 https://$host$request_uri;
}
# managed by Certbot
listen 80;
server_name home.howabout.shop;
return 404;
}
💡 코드 구조
클라이언트와 Nginx 사이는 보안을 위해 HTTPS를 유지하고, Nginx와 내부 서버 사이는 성능을 위해 HTTP를 사용하는 구조
🧑🏻💻 코드 설명
클라이언트가 HTTP로 접속할 경우 -> Nginx의 80 포트
-> 301 리다이렉션 -> HTTPS로 자동 전환
-> Nginx의 443 포트
-> 내부 서버와 HTTP 통신
밑의 코드는 Certbot에서 관리하는 코드인데 자세히 설명해보겠습니다!
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/home.howabout.shop/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/home.howabout.shop/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
- listen 443 ssl;
- 443 포트는 HTTPS의 기본 포트
- ssl 파라미터는 이 포트에서 SSL/TLS 암호화를 사용한다는 의미
- ssl_certificate /etc/letsencrypt/live/home.howabout.shop/fullchain.pem;
- SSL 인증서 파일의 경로
- fullchain.pem은 서버 인증서와 중간 인증서를 모두 포함
- 브라우저가 신뢰할 수 있는 인증서 체인을 형성
- ssl_certificate_key /etc/letsencrypt/live/home.howabout.shop/privkey.pem;
- SSL 인증서의 개인 키 파일 경로
- 절대로 공개되면 안되는 비밀 키
- 암호화된 연결을 설정하는데 사용
- include /etc/letsencrypt/options-ssl-nginx.conf;
- Let's Encrypt에서 제공하는 권장 SSL 설정 파일
- 보안 관련 최적화된 설정들이 포함 : SSL/TLS 버전, SSL 세션 캐시 설정, 암호화 스위트 설정
- ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
- Diffie-Hellman 키 교환에 사용되는 파라미터 파일
- 완벽한 순방향 비밀성을 제공
- 통신의 보안성을 높이는 역할
💡실제 보안 동작 과정
1. 클라이언트가 HTTPS로 접속 시도
2. 서버는 fullchain.pem의 인증서를 클라이언트에 전송
3. 클라이언트는 인증서의 유효성 검증
4. privkey.pem을 사용해 안전한 통신 채널 수립
5. dhparam을 통해 키 교환 수행
6. options-ssl-nginx.conf의 설정에 따라 안전한 암호화 통신 시작