[Final 15] 아직도 HTTP? Certbot으로 5분 만에 HTTPS 적용하기
사용자의 비밀번호나 개인정보를 주고받는 서비스에서 HTTPS는 선택이 아닌 필수입니다. 데이터를 암호화하여 전송할 뿐만 아니라, 검색 엔진 최적화(SEO)에도 긍정적인 영향을 미칩니다. Let's Encrypt와 Certbot을 이용해 무료로 적용해 봅시다.
1. HTTP와 HTTPS의 결정적 차이
- HTTP (HyperText Transfer Protocol): 데이터를 평문으로 전송합니다. 해커가 중간에서 가로채면 아이디와 비밀번호를 그대로 읽을 수 있습니다.
- HTTPS (HTTP Secure): SSL/TLS 프로토콜을 사용하여 데이터를 암호화합니다. 전송 과정에서 데이터가 노출되어도 해독이 불가능하며, 사이트의 신원도 보증합니다.
2. 사전 준비 사항
이 가이드를 따라 하기 전, 다음 조건이 충족되어야 합니다.
- EC2 인스턴스가 실행 중이어야 합니다.
- **도메인(Route53)**이 탄력적 IP에 정상적으로 연결되어 있어야 합니다.
- AWS 보안 그룹 인바운드 규칙에 443(HTTPS) 포트가 열려 있어야 합니다.
3. Docker 환경에서 Certbot으로 인증서 발급받기
우리는 Nginx와 Django를 컨테이너로 돌리고 있으므로, 인증서 발급 역시 Docker를 활용하면 서버가 깔끔하게 유지됩니다.
① Nginx 임시 설정 (인증용)
인증서 발급을 위해서는 Let's Encrypt 서버가 우리 서버에 접속할 수 있어야 합니다. nginx/default.conf에 아래 내용을 추가합니다.
server {
listen 80;
server_name dev-portfolio.com; # 본인 도메인
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
② Certbot 실행 및 발급
터미널에서 아래 명령어를 실행하여 인증서를 요청합니다.
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를 최종 업데이트합니다.
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을 수정합니다.
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을 이용해 자동화합니다.
# 크론탭 편집기 열기
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 디비 자동 생성

superputty 사용법
putty에서 기본 설정이 되어있는걸 그대로 들고옴(그러나 퍼블릭ip는 계속 바뀌므로 계속 확인필요)
지정된 ip 지정된 세션 이름 키값을 모두 등록(저장)해주면 superputty에서 지정된 셋팅값을 전부 들고와줌
이름이랑 해당 퍼블릭 ip로 접속가능
인바운드 아웃바운드 규치ping 해제해야 핑이 감
같은 보안그룹이면 방벽 해제
10.0.0.0/25
10.0.0.15
브로드캐스팅ip 가장 먼저 찾아가서 방송시킴 노이즈가 많이 생겨서 분할시킴
디비접속
'웹 > 배포' 카테고리의 다른 글
| [Final 17] 서비스 모니터링 기법과 17일간의 로드맵 회고,"로그 관리 (0) | 2025.09.12 |
|---|---|
| [Final 16] 코드만 push하세요, 배포는 GitHub Actions가 알아서 합니다 (0) | 2025.09.11 |
| [Final 14] 서버 용량 걱정 끝! S3로 Static & Media 파일 관리하기 (0) | 2025.09.10 |
| [Cloud 13] Nginx 리버스 프록시 설정으로 서버 트래픽 안정화하기 (1) | 2025.09.08 |
| [Cloud 12] 내 서비스에 이름 붙이기: Route53 도메인 및 탄력적 IP 연결 (0) | 2025.09.05 |