서브 도메인 설정 및 HTTPS 적용: AWS EC2와 Let's Encrypt 활용
1. 서브도메인 api.
도메인은 웹사이트를 식별해 주는 URL섹션
서브 도메인이란?
하위 도메인으로 웹사이트의 섹션을 구분하기 위해 도메인 이름에 추가되는 프리픽스
2. api.도메인을 aws ip에 연결
아래 블로그 참고함
aws ec2 서버와 카페24 도메인 연결 - 진화하는공간 (tistory.com)
도메인 포워딩: cafe24에서 구매한 도메인이 다른 웹사이트(aws인스턴스 퍼블릭 IPv4 DNS)로 이동 시켜주는 기능
네임서버 관리: 호스트ip 수정으로 aws public ip를 수정하고 서브 도메인으로 (api.내 도메인)으로 추가
#로컬호스트 말고 이제부터 사용할 내 서브 도메인을 활용해서 통신이 가능하게
#요청하는 프론트엔드 서버 코드 수정
const response = await axios.post('https://api.내 도메인/sendMessage', {
user_input: inputValue
});
#https s!!주의 이거 빼먹어서 개고생함
3. aws에 Letsencypt사용해서 ssl설치하기
아래 블로그 참고
2-6 AWS에 Let's Encrypt로 HTTPS 적용하기 (tistory.com)
저번에 nginx 웹서버를 구축했으니 외부로부터 접속할 수 있도록 포트 포워딩을 해준다.
Let's Encrypt
Let's Encrypt는 무료의 TLS/SSL 인증서를 쉽게 가져오고 설치할 수 있는 방법을 제공하는 CA(인증 기관)으로, 웹 서버에서 암호화된 HTTPS를 사용할 수 있다.
이러한 방법은 사용자에게 Certbot라는 소프트웨어를 제공함으로써 구현할 수 있게 한다.
(1) Certbot 설치
$ sudo apt update
$ sudo apt upgrade
$ sudo apt-get install python3-certbot-nginx
(2) Nginx 설정 파일 수동 업데이트
Nginx 기본 설정 파일에 들어가서 인증서를 적용할 도메인 이름을 설정합니다.
sudo nano /etc/nginx/sites-available/default
server {
listen 80;
server_name api.내 도메인;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 원래 클라이언트 IP 주소를 전달합니다.
proxy_set_header X-Original-IP $remote_addr;
}
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name api.내 도메인;
ssl_certificate /etc/letsencrypt/live/api.westcold0035.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.westcold0035.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 원래 클라이언트 IP 주소를 전달합니다.
proxy_set_header X-Original-IP $remote_addr;
}
}
Chat GPT의 도움을 받아 전체 과정 요약
- 80번 포트에서 HTTP 요청 수신:
- server_name api.내 도메인;에 도메인 이름을 설정한다.
- location / 블록은 모든 요청을 내부 서버(로컬호스트)로 프록시한다.
- proxy_set_header 지시어를 사용해 클라이언트의 원본 요청 정보를 보존한다.
- if ($scheme != "https") { return 301 https://$host$request_uri; } 구문을 통해 HTTP 요청을 HTTPS로 리다이렉트한다.
- 443번 포트에서 HTTPS 요청 수신:
- listen 443 ssl;을 통해 SSL을 사용하는 443 포트에서 요청을 수신한다.
- ssl_certificate와 ssl_certificate_key 지시어를 사용해 Let's Encrypt SSL 인증서를 적용한다.
- location / 블록은 HTTP와 동일하게 모든 요청을 내부 서버(로컬호스트)로 프록시한다.
- proxy_set_header 지시어를 사용해 클라이언트의 원본 요청 정보를 보존한다.
상세 설명
HTTP 요청 처리 (80번 포트)
- HTTP 요청 수신: 서버는 80번 포트에서 HTTP 요청을 수신한다.
- 프록시 설정: 들어오는 모든 요청은 http://127.0.0.1:5000으로 프록시된다. 이는 로컬에서 동작하는 백엔드 애플리케이션을 의미한다.
- 헤더 설정: proxy_set_header 지시어를 통해 원래의 호스트, 클라이언트 IP 주소, 전달된 포워드 정보를 백엔드로 전달한다.
- HTTP -> HTTPS 리다이렉션: 요청이 HTTP인 경우, Nginx는 해당 요청을 HTTPS로 리다이렉트한다. 이는 모든 트래픽을 암호화된 HTTPS로 강제하여 보안을 강화한다.
HTTPS 요청 처리 (443번 포트)
- HTTPS 요청 수신: 서버는 443번 포트에서 SSL을 사용하는 HTTPS 요청을 수신한다.
- SSL 인증서 설정: Let's Encrypt에서 발급받은 SSL 인증서와 개인 키를 사용하여 연결을 암호화한다.
- 프록시 설정: 들어오는 모든 HTTPS 요청은 http://127.0.0.1:5000으로 프록시된다.
- 헤더 설정: HTTP와 동일하게 원래의 호스트, 클라이언트 IP 주소, 전달된 포워드 정보를 백엔드로 전달한다.
설정 파일을 적용하기 위해 Nginx를 다시 로드해줍니다.
sudo systemctl reload nginx
(3) SSL 인증서 받기
Certbot은 다양한 플러그인을 통해 SSL 인증서를 획득하는 다양한 방법을 제공
Nginx플러그인은 필요할 때마다 Nginx를 재구성하고 구성을 다시 로드
이제 원하는 도메인을 지정해서 Nginx플러그인을 통해 인증서를 획득
이후 알림설정이 나오는데 다 ok해줬다
$ sudo certbot --nginx
Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): api.your-domain.com
(4)파이썬 실행
python3 "open_port.py"
https://api.도메인이 제대로 돌아가는지 결과 화면
참고한 블로그
서브 도메인 정의와 유용하게 사용하는 방법 (wix.com)