이번주에는 도메인 및 SSL 설정을 진행했습니다!
이번 인프라 아키텍처는 Frontend, Backend, AI, RDS 서버를 동일한 VPC 내의 Private Subnet에 위치시켰으며, 외부 접근을 위한 Nginx는 Public Subnet에 배치했습니다. 해당 아키텍처를 기반으로 도메인과 SSL 설정을 진행했기 때문에 간단히 설명드렸습니다.
이번 프로젝트 아키텍처는 아래 링크에 더 자세히 나와있습니다😊
https://young-code.tistory.com/10
글 읽기 전 참고하면 좋습니다 :)
💡참고
가비아에서 도메인 구매
AWS Route 53에서 서브 도메인 설정
🚩 프로젝트 과정
1. Domain
a. 도메인 구매
- 가비아에서 devita.shop 이라는 도메인 구매
- 구매 시 타사 네임서버 사용 옵션 선택
b. AWS Route 53에서 네임서버 정보 설정
- AWS Route 53에서 도메인의 호스팅 영역 생성
- 호스팅 정보 입력
- 도메인 이름 : devita.shop 입력
- 타입 : Public hosted zone 선택
- 네임서버(NS) 레코드 확인
- 호스팅 영역을 생성하면 Route 53에서 기본적으로 네임서버(NS) 레코드와 SOA 레코드가 자동으로 생성
- 생성된 호스팅 영역의 NS 레코드에 나열된 네임서버 주소(보통 4개의 주소)를 확인
- 가비아 도메인 관리 페이지에서 네임서버 업데이트
- 가비아 웹사이트에 로그인하여 도메인 관리 페이지로 이동
- 네임서버 설정 변경 옵션 선택
- 타사 네임서버 사용을 선택한 후, Route 53에서 확인한 네임서버(NS) 주소를 각각 입력
c. Route 53에서 주 도메인 A 레코드 설정
- Route 53에서 호스팅 영역에 들어가 A 레코드를 생성
- devita.shop을 도메인 이름으로 입력하고 값 필드에 EC2의 Public IP 또는 Elastic IP를 설정하여 주 도메인과 EC2를 연결
d. 서브 도메인 A 레코드 추가
- Route 53에서 호스팅 영역으로 이동
- AWS에 로그인한 후 Route 53 서비스로 이동
- 왼쪽 메뉴에서 Hosted Zones를 클릭하여 도메인 이름에 대한 호스팅 영역을 확인
- A 레코드 설정
- Record Name : 서브 도메인의 이름을 입력 ex) home
- Record Type : A(주소) 레코드를 선택
- Value : EC2 인스턴스의 Public IP 또는 Elastic IP 주소를 입력
- TTL (Time To Live) : 기본값으로 두거나 적절한 값을 설정
- Routing Policy : Simple Routing을 선택
- Evaluate Target Health : No 선택 (EC2 인스턴스가 정상적으로 작동하는지 확인하는 옵션, 기본적으로 EC2의 상태를 모니터링 하지 않도록 설정)
- A 레코드 생성
2. SSL 설정
a. Nginx 서버에 cerbot과 nginx 플러그인 설치
sudo apt update
sudo apt install certbot python3-certbot-nginx
b. Certbot으로 SSL 인증서 발급
sudo certbot --nginx -d home.devita.shop
c. 설치 후 확인사항
- https://home.devita,shop 접속 테스트
- 모든 경로에(엔드 포인트) 대한 HTTPS 동작 확인
- HTTP에서 HTTPS로 리다이렉션 확인
- SSL 인증서 정상 발급 여부 확인
- /etc/letsencrypt/live/home.devita.shop/
d. 모든 인증서 목록 확인
sudo certbot certificates
3. Nginx 설정 파일
위에서 도메인 및 SSL 설정 방법을 공유해봤습니다!
설정을 모두 마치면 Nginx 설정 파일에도 변경되게 됩니다.
server {
listen 443 ssl; # managed by Certbot
server_name home.devita.shop;
# FRONT
location / {
proxy_pass http://3.37.229.132:3000; # 리버스 프록시
proxy_set_header Host $host; # 원본 호스트 정보 전달
proxy_set_header X-Real-IP $remote_addr; # 실제 방문자 IP 전달
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시 거친 IP들의 목록
proxy_set_header X-Forwarded-Proto $scheme; # 프로토콜 정보(http/https) 전달
}
# BACK
location /api {
proxy_pass http://10.0.1.44:8080;
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;
}
# AI
location /ai {
proxy_pass http://10.0.2.211:8000;
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;
}
# SSL
# managed by Certbot
ssl_certificate /etc/letsencrypt/live/home.devita.shop/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/home.devita.shop/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
# HTTP -> HTTPS
# managed by Certbot
if ($host = home.devita.shop) {
return 301 https://$host$request_uri;
}
# managed by Certbot
listen 80;
server_name home.devita.shop;
return 404;
}
💡 코드 구조
클라이언트와 Nginx 사이는 보안을 위해 HTTPS를 유지하고, Nginx와 내부 서버 사이는 성능을 위해 HTTP를 사용하는 구조
🧑🏻💻 코드 설명
클라이언트가 HTTP로 접속할 경우 -> Nginx의 80 포트
-> 301 리다이렉션 -> HTTPS로 자동 전환
-> Nginx의 443 포트
-> 내부 서버와 HTTP 통신
밑의 코드는 Certbot에서 관리하는 코드인데 자세히 설명해보겠습니다!
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/home.devita.shop/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/home.devita.shop/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
- listen 443 ssl;
- 443 포트는 HTTPS의 기본 포트
- ssl 파라미터는 이 포트에서 SSL/TLS 암호화를 사용한다는 의미
- ssl_certificate /etc/letsencrypt/live/home.devita.shop/fullchain.pem;
- SSL 인증서 파일의 경로
- fullchain.pem은 서버 인증서와 중간 인증서를 모두 포함
- 브라우저가 신뢰할 수 있는 인증서 체인을 형성
- ssl_certificate_key /etc/letsencrypt/live/home.devita.shop/privkey.pem;
- SSL 인증서의 개인 키 파일 경로
- 절대로 공개되면 안되는 비밀 키
- 암호화된 연결을 설정하는데 사용
- include /etc/letsencrypt/options-ssl-nginx.conf;
- Let's Encrypt에서 제공하는 권장 SSL 설정 파일
- 보안 관련 최적화된 설정들이 포함 : SSL/TLS 버전, SSL 세션 캐시 설정, 암호화 스위트 설정
- ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
- Diffie-Hellman 키 교환에 사용되는 파라미터 파일
- 완벽한 순방향 비밀성을 제공
- 통신의 보안성을 높이는 역할
💡실제 보안 동작 과정
1. 클라이언트가 HTTPS로 접속 시도
2. 서버는 fullchain.pem의 인증서를 클라이언트에 전송
3. 클라이언트는 인증서의 유효성 검증
4. privkey.pem을 사용해 안전한 통신 채널 수립
5. dhparam을 통해 키 교환 수행
6. options-ssl-nginx.conf의 설정에 따라 안전한 암호화 통신 시작
📌 쿠키 문제
이전 블로그에서 아직 해결하지 못한 쿠키 문제가 있었습니다.
자세한 오류는 아래 블로그에서 확인이 가능합니다!
https://young-code.tistory.com/11
HTTPS로 통신을 하니깐 쿠키로 Refresh Token이 잘 전달되어 Nginx의 리버스 프록시를 이용한 카카오 소셜 로그인 성공 👍
'Project > Devita' 카테고리의 다른 글
[Devita] Nginx 삽질 일기..🥲 (0) | 2024.11.06 |
---|---|
[Devita] 인프라 아키텍처 & CI/CD 파이프라인 (1) | 2024.11.06 |