그냥 EC2의 퍼블릭 IP 주소로 웹사이트에 접속하는 것이 간단하긴 하다.
하지만 현재의 주소 http://43.201.208.238 는 사용자에게 낯설 뿐만 아니라 http로 되어있어 로그인 같은 기능에 보안 경고가 뜬다.
그래서 본격적으로 도메인을 연결하고 HTTPS를 적용하는 작업에 들어갔다.
이 글은 그 모든 과정을 정리해본 기록이다.
1단계 – 도메인 연결 (Route 53 + 가비아)
왜 도메인이 필요?
- IP 주소는 외우기 힘들고 전문적이지 않은 인상을 준다.
- HTTPS 인증서 발급도 도메인을 기준으로 진행된다.
- 결국 사용자가 접속하는 주소는 https://devinterview.shop 같은 형태여야 한다.
도메인 연결 흐름
- 도메인 구매 (나는 가비아에서 devinterview.shop 구매했다)
- Route 53에서 호스팅 영역 생성
→ AWS가 내 도메인의 DNS를 관리할 수 있도록 설정한다.
→ 이 과정에서 NS(Name Server) 정보가 생성된다. - 가비아에 NS 설정 변경
→ 기존 NS 모두 삭제하고, Route 53에서 제공한 NS 4개를 입력한다. - Route 53에서 A 레코드 생성
→ devinterview.shop → EC2 퍼블릭 IP (43.201.208.238)에 연결했다.
nslookup devinterview.shop 명령어로 DNS 전파 상태 확인 가능
2단계 – HTTPS 적용 (Let’s Encrypt + Certbot)
HTTPS?
- 데이터가 암호화되어 안전하게 전달된다.
- 로그인, 결제 등 민감한 정보가 중간에서 탈취당하지 않도록 보호해준다.
- 브라우저에 🔒 표시가 뜨고, HTTP 경고도 사라진다.
Let’s Encrypt
- 무료로 SSL 인증서를 발급해주는 기관이다.
- 90일짜리 인증서를 발급해주며, 자동 갱신이 가능하다.
- 유료 인증서와 기능상 거의 차이 없다.
Certbot?
- Let's Encrypt와 연동되는 CLI 기반 인증서 발급 도구이다.
- --nginx 옵션을 쓰면 Nginx 설정까지 자동으로 수정해준다.
sudo certbot --nginx -d devinterview.shop -d www.devinterview.shop
실행하면 이메일 입력 → 약관 동의 → 자동 인증 → HTTPS 리디렉션 여부까지 처리된다.
인증서 위치: /etc/letsencrypt/live/devinterview.shop/
3단계 – 인증서 자동 갱신
왜 자동 갱신이 필요?
- Let’s Encrypt 인증서는 90일만 유효하다.
- 갱신 안 하면 웹사이트는 보안 경고 화면에 막혀버린다.
- 그래서 crontab으로 자동화가 필수이다.
sudo crontab -e
0 2 * * * certbot renew --post-hook "docker restart nginx"
- 매일 새벽 2시에 인증서 갱신 시도한다.
- 성공 시 nginx 컨테이너 자동 재시작 → 최신 인증서 적용한다.
4단계 – Docker 환경에서 인증서 연동
왜 도커 안에서는 인증서를 못 보나?
- 인증서는 EC2에서 발급된다.
- 하지만 nginx는 Docker 컨테이너 안에서 돌아간다.
→ 컨테이너 내부에서는 인증서 파일이 안 보인다.
docker-compose에서 볼륨 마운트
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- /etc/letsencrypt:/etc/letsencrypt
- /var/www/certbot:/var/www/certbot
→ 컨테이너 내부 /etc/letsencrypt 경로로 인증서 파일이 연결된다.
→ nginx.conf에서 이 경로를 그대로 사용할 수 있다.
Nginx에서 인증서 적용
server {
listen 443 ssl;
server_name devinterview.shop www.devinterview.shop;
ssl_certificate /etc/letsencrypt/live/devinterview.shop/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/devinterview.shop/privkey.pem;
location / {
proxy_pass http://frontend:3000;
...
}
location /api/ {
proxy_pass http://backend:8080;
...
}
}
추가 보안 설정
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
- 더 이상 안전하지 않은 SSLv3, TLSv1.0은 사용하지 않도록 차단한다.
- 안전한 암호화 알고리즘만 허용한다.
최종 요약
항목 | 요약 설명 |
도메인 연결 | Route 53의 NS를 도메인 업체(가비아)에 등록하고, A 레코드로 EC2 연결 |
HTTPS 인증서 발급 | Certbot을 사용해 Nginx + 도메인 기반 인증서 자동 발급 |
자동 갱신 설정 | crontab으로 certbot renew 설정 + nginx 재시작 |
Docker 연동 | 인증서 디렉토리를 nginx 컨테이너에 공유해서 https 적용 |
결론
도메인 연결과 HTTPS 적용은 서비스의 신뢰성, 보안성, 운영 자동화의 기반이 된다.
이번 프로젝트를 통해 도메인 + 인증서 + nginx + Docker가 연결되는 구조를 제대로 이해할 수 있었다.
앞으로도 단순히 돌아가는 서버가 아니라, 안정적이고 신뢰할 수 있는 서비스를 만드는 게 목표이다.
'프로젝트 > 기술 면접 복습 플랫폼' 카테고리의 다른 글
JMeter를 이용한 성능 측정 - JMeter 설정, 결과 분석 (0) | 2025.05.19 |
---|---|
GitHub Actions로 EC2 자동 배포 (0) | 2025.05.08 |
Nginx가 왜 필요했는가 (0) | 2025.05.05 |
프로젝트에 Docker를 도입한 이유 (2) | 2025.05.05 |
EC2 + Docker 기반 수동 배포 (0) | 2025.05.05 |