프로젝트/기술 면접 복습 플랫폼

도메인 연결, HTTPS 적용하기

yoon4360 2025. 5. 6. 19:20

그냥 EC2의 퍼블릭 IP 주소로 웹사이트에 접속하는 것이 간단하긴 하다.

하지만 현재의 주소 http://43.201.208.238 는 사용자에게 낯설 뿐만 아니라 http로 되어있어 로그인 같은 기능에 보안 경고가 뜬다.

 

그래서 본격적으로 도메인을 연결하고 HTTPS를 적용하는 작업에 들어갔다.
이 글은 그 모든 과정을 정리해본 기록이다.

 

 1단계 – 도메인 연결 (Route 53 + 가비아)

왜 도메인이 필요?

  • IP 주소는 외우기 힘들고 전문적이지 않은 인상을 준다.
  • HTTPS 인증서 발급도 도메인을 기준으로 진행된다.
  • 결국 사용자가 접속하는 주소는 https://devinterview.shop 같은 형태여야 한다.

도메인 연결 흐름

  1. 도메인 구매 (나는 가비아에서 devinterview.shop 구매했다)
  2. Route 53에서 호스팅 영역 생성
    → AWS가 내 도메인의 DNS를 관리할 수 있도록 설정한다.
    → 이 과정에서 NS(Name Server) 정보가 생성된다.
  3. 가비아에 NS 설정 변경
    → 기존 NS 모두 삭제하고, Route 53에서 제공한 NS 4개를 입력한다.
  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가 연결되는 구조를 제대로 이해할 수 있었다.

앞으로도 단순히 돌아가는 서버가 아니라, 안정적이고 신뢰할 수 있는 서비스를 만드는 게 목표이다.