웹/배포

[Final 15] 아직도 HTTP? Certbot으로 5분 만에 HTTPS 적용하기

jumemory 2025. 9. 10. 17:40

[Final 15] 아직도 HTTP? Certbot으로 5분 만에 HTTPS 적용하기

사용자의 비밀번호나 개인정보를 주고받는 서비스에서 HTTPS는 선택이 아닌 필수입니다. 데이터를 암호화하여 전송할 뿐만 아니라, 검색 엔진 최적화(SEO)에도 긍정적인 영향을 미칩니다. Let's EncryptCertbot을 이용해 무료로 적용해 봅시다.


1. HTTP와 HTTPS의 결정적 차이

  • HTTP (HyperText Transfer Protocol): 데이터를 평문으로 전송합니다. 해커가 중간에서 가로채면 아이디와 비밀번호를 그대로 읽을 수 있습니다.
  • HTTPS (HTTP Secure): SSL/TLS 프로토콜을 사용하여 데이터를 암호화합니다. 전송 과정에서 데이터가 노출되어도 해독이 불가능하며, 사이트의 신원도 보증합니다.

2. 사전 준비 사항

이 가이드를 따라 하기 전, 다음 조건이 충족되어야 합니다.

  1. EC2 인스턴스가 실행 중이어야 합니다.
  2. **도메인(Route53)**이 탄력적 IP에 정상적으로 연결되어 있어야 합니다.
  3. AWS 보안 그룹 인바운드 규칙에 443(HTTPS) 포트가 열려 있어야 합니다.

3. Docker 환경에서 Certbot으로 인증서 발급받기

우리는 Nginx와 Django를 컨테이너로 돌리고 있으므로, 인증서 발급 역시 Docker를 활용하면 서버가 깔끔하게 유지됩니다.

① Nginx 임시 설정 (인증용)

인증서 발급을 위해서는 Let's Encrypt 서버가 우리 서버에 접속할 수 있어야 합니다. nginx/default.conf에 아래 내용을 추가합니다.

Nginx
 
server {
    listen 80;
    server_name dev-portfolio.com; # 본인 도메인

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
}

② Certbot 실행 및 발급

터미널에서 아래 명령어를 실행하여 인증서를 요청합니다.

Bash
 
docker run -it --rm --name certbot \
  -v "$(pwd)/certbot/conf:/etc/letsencrypt" \
  -v "$(pwd)/certbot/www:/var/www/certbot" \
  certbot/certbot certonly --webroot \
  -w /var/www/certbot -d dev-portfolio.com

Tip: 실행 후 이메일 주소 입력과 약관 동의 절차를 거치면 certbot/conf/live/도메인명/ 경로에 인증서(fullchain.pem, privkey.pem)가 생성됩니다.


4. Nginx에 SSL 설정 적용하기

이제 발급받은 인증서를 Nginx가 사용하도록 default.conf를 최종 업데이트합니다.

Nginx
 
server {
    listen 80;
    server_name dev-portfolio.com;
    
    # 모든 HTTP 요청을 HTTPS로 강제 리다이렉트
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name dev-portfolio.com;

    # 인증서 경로 설정 (컨테이너 내부 기준)
    ssl_certificate /etc/letsencrypt/live/dev-portfolio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dev-portfolio.com/privkey.pem;

    # 보안 최적화 설정
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://web:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme; # 중요: Django가 HTTPS임을 인지하게 함
    }
}

5. Docker Compose 볼륨 연결

Nginx 컨테이너가 서버에 저장된 인증서 파일을 읽을 수 있도록 docker-compose.yml을 수정합니다.

YAML
 
nginx:
  image: nginx:latest
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    - ./certbot/conf:/etc/letsencrypt  # 인증서 공유
    - ./certbot/www:/var/www/certbot
  depends_on:
    - web

6. [선생님의 심화 보충] 90일의 마법: 자동 갱신 설정

Let's Encrypt 인증서는 90일마다 만료됩니다. 수동으로 갱신하는 것은 번거로우므로 Crontab을 이용해 자동화합니다.

Bash
 
# 크론탭 편집기 열기
sudo crontab -e

# 매월 1일 새벽 3시에 갱신 시도 및 Nginx 재시작 명령 추가
0 3 1 * * docker run --rm -v "$(pwd)/certbot/conf:/etc/letsencrypt" -v "$(pwd)/certbot/www:/var/www/certbot" certbot/certbot renew && docker exec nginx nginx -s reload

✍️ 블로그 작성을 위한 마지막 조언

독자들에게 **"자물쇠 아이콘은 사용자에게 주는 최소한의 예의"**라고 강조해 주세요. 특히 HTTPS를 적용하면 브라우저의 '위치 정보 API'나 '푸시 알림' 같은 고급 기능을 사용할 수 있게 된다는 장점도 언급하면 좋습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3대 클라우드 아마존 웹 서비스(aws), ms(애저), 구글(gcp)

 

 

SaaS

 

 

 

aws 접속 로그인 ec2 검색 

니전 선택 잘하기 (실재 서버가 위치하는곳)

EC2 (서버를 만들기위한 버추얼박스같은 존재) 기본서비스 (ec2_user)

인스턴스 생성

사용하는것만마다 

키관리 잘하기 개인소

 

가상 네트워

 

 

중지 종료 차이 이해하기

86_64와 arm 차이 이해하기

aws 접속하고 미니콘다에서 링크 받아와서 설치

 

wget https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-Linux-x86_64.sh

권한 변경

chmod +x ./Miniconda3-py312_25.7.0-2-Linux-x86_64.sh

실행

./Miniconda3-py312_25.7.0-2-Linux-x86_64.sh

 

You can undo this by running `conda init --reverse $SHELL`? [yes|no]
[no] >>> yes

 source ~./bashrc

base는 Conda의 기본 환경 이름


mkdir ~./locals

pip install jypter

free -h

jupyter notebook --generate-config

ls -al-al `~/.jupyter

juy pyter passwored

cat /home//ec2-user/.jupyter//jupyter_notebook_config.py yter_server_config.json 

vim ~/..gjupyter/jupyter_notebook_config.py 

mkditrr workspqcace

cd workspqcace

 jupyter npotebook --ip = 0.0.0.0

 

ps -ef pipe| grep jupyter

백그라운드 돌리면 창을 닫아도 접속가

nohup jupyter notebook --ip=0.0.0.0 &

 

sageMaker

 

 

앤서블, 테라폼 클라우드 인프라 자동화

 

우부투로 db 서버 생성

ubuntu로 접속

 

버전확안하는 명령어

cat /etc/issue
Ubuntu 24.04.3 LTS \n \l

소유권이 root일때  sudo 브텽줌

sudo apt update

sudo apt install mysql server -y

sduo service mysql status

 cd /etc/mysql//mysql.conf.d/

sudo vim mysqld.cnf

bind-adress = 0.0.0.0

 sudo service mysql restart

sudo mysql -uroot

 

create user 'play'@'%' identified by '1q2w3e4r!';

grant all privileges on *.* to 'play'@'%';

 

보안그룹 같은 그룹에서만 접속가능?!

RDS 디비 자동 생성 

 

Putty 설치 이후 사용 가

superputty 사용법

putty에서 기본 설정이 되어있는걸 그대로 들고옴(그러나 퍼블릭ip는 계속 바뀌므로 계속 확인필요)

지정된 ip 지정된 세션 이름 키값을 모두 등록(저장)해주면 superputty에서 지정된 셋팅값을 전부 들고와줌

 

 

 

이름이랑 해당 퍼블릭 ip로 접속가능 

 

인바운드 아웃바운드 규치ping 해제해야 핑이 감

같은 보안그룹이면 방벽 해제

 

 

10.0.0.0/25

10.0.0.15

브로드캐스팅ip 가장 먼저 찾아가서 방송시킴 노이즈가 많이 생겨서 분할시킴

 

디비접속