필요한 이유 → HTTPS 통신을 위한 암호화 인증서 (SSL/TLS)는 IP 주소가 아니라 도메인 이름을 기준으로 발급이 된다. 따라서 가비아에서 저렴한 도메인을 사야 한다.
결국, HTTPS 통신이 필요하면 도메인을 구매하여야 한다.
api.fit-me.site)을 쳤을 때 EC2 서버로 찾아올 수 있다.
Host라는 무엇인가?
Host는 기본 도메인(fie-me.site) 앞에 붙이는 서브 도메인(api)의 이름을 청하는 칸. 서비스의 용도에 따라 서버를 분리하기 위해 사용한다.
리버스 프록시의 역할을 한다.Cerbot)를 EC2에 설치하면, Nginx에 HTTPS용 SSL 인증서를 쉽게 발급받고 적용할 수 있다.443)포트로 들어온 암호화 요청을 해독해서, 서버 내부에서 돌고 있는 스프링부트(8080) 포트로 길을 안내한다.Nginx 설정 파일 열기
sudo nano /etc/nginx/sites-available/default
설정 파일 수정 (전체 수정)
server {
listen 80;
server_name api.fit-me.site;
location / {
# 80번으로 들어온 요청을 8080으로 토스
proxy_pass http://localhost:8080;
# 클라이언트의 진짜 IP와 정보들을 스프링 부트로 넘겨주기 위한 필수 설정들
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
try_files 명령어는 Nginx에게 다음과 같이 지시한다.
/var/www/html 폴더를 뒤져 사용자가 요청한 파일이 있는지 찾아봐. 없으면 404 에러를 뱉어버려.
우리의 목적은 Nginx가 파일을 찾는게 아니라 8080으로 토스하는 것이기에 지워도 됨Nginx 테스트 및 재시작
sudo nginx -t # 설정 파일에 문법 오류가 없는지 테스트
sudo systemctl restart nginx # Nginx 재시작
Certbot이란?
Certbot은 웹사이트에 무료로 SSL/TLS 인증서를 발급해주는 비영리 기관이 Let's Encrypt의 인증서를 자동으로 발급, 적용, 갱신해주는 오픈소스 소프트웨어 툴이다.
SSL(Secure Sockets Layer)/TLS(Transport Layer Security)는 인터넷을 통해 브라우저와 서버 간 데이터를 안전하게 암호화하여 통신을 보호하는 표준 보안 프로토콜이다.
Certbot을 실행할 때 Nginx 플러그인 옵션(—nginx)을 주면, Certbot이 기존 작성해둔 default 파일의 listen 80;과 proxy_pass http://localhost8080; 설정을 읽어간다. 그 후, 파일 아래쪽 listen 443 ssl;로 시작하는 서버 블록을 만들고 암호화 인증서 경로를 알아서 채워준다.
Certbot 및 Nginx 플러그인 설치
sudo apt update # 패키지 업데이트
sudo apt install certbot python3-certbot-nginx -y
Certbot 실행하여 인증서 발급 및 자동 세팅
sudo certbot --nginx -d api.fit-me.site
Nginx 설정 파일 확인
# 1. 기존 80번 블록은 이렇게 변함 (HTTPS로 강제 이동!)
server {
listen 80;
server_name api.fit-me.site;
if ($host = api.fit-me.site) {
return 301 https://$host$request_uri; # 443으로 쫓아냄
}
}
# 2. Certbot이 새로 만들어준 443번 블록
server {
listen 443 ssl; # HTTPS 포트
server_name api.fit-me.site;
# 네가 적었던 8080 토스 설정이 여기로 복사됨!
location / {
proxy_pass http://localhost:8080;
}
# 복잡한 SSL 인증서 경로들이 자동으로 추가됨 (managed by Certbot)
ssl_certificate /etc/letsencrypt/live/api.fit-me.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.fit-me.site/privkey.pem;
}