프로젝트 배포를 하기 위해 프론트엔드는 vercel을 이용하여 배포하였고
백엔드는 docker를 사용하여 aws ec2로 배포를 진행하였다.
vercel 배포를 하면 기본적으로 https 주소가 할당되고
AWS EC2로 배포를 하게 되면 http 주소가 할당된다.
프론트엔드가 https로 구성되어 있어서 백엔드 서비스에 https로 접근하려 할 때
EC2에서 사용 중인 도메인 이름에 해당하는 SSL/TLS 인증서가 없기 때문에 위와 같은 에러가 발생한다.
이 문제를 해결하기 위해 SSL/TLS 인증서를 EC2 서버에 적용할 필요가 있어 가비아에서 도메인을 구매하여 SSL/TLS인증서를 적용 해주기로 했다.
AWS EC2 같은 인프라스트럭처 서비스를 사용하여 애플리케이션을 배포할 때 기본 설정은 HTTP로 되어있다.이는 사용자가 원하는 보안 설정과 인증서를 직접 관리하고 구성할 수 있게 하기 위함이다.
SSL/TLS 란?
SSL(Secure Sockets Layer)및 TLS(Transport Layer Security)는 인터넷 상에서 데이터를 안전하게 전송하기 위해 설계된 암호화 프로토콜이다.
- 암호화 : 사용자와 서버 사이에 교환되는 데이터를 암호화하여 중간자 공격(man-in-the-middle attacks)으로부터 정보를 보호한다.
- 인증 : 클라이언트가 서버에 접속할 때 서버는 자신의 신원을 인증서를 통해 증명해야한다.이로인해 사용자는 자신이 원하는 서버에 안전하게 연결 되었다는 것을 확신 할 수 있다.
- 데이터 무결성 : 전송 중인 데이터가 중간에 변경되지 않았음을 보장한다.
- 안전한 연결의 확립 : 클라이언트와 서버는 handshake 라는 과정을 통해 안전한 연결을 확립한다.
이 과정에서 양측은 어떤 암호화 방식을 사용할 지 통신에 사용할 임시의 비밀 키는 어떻게 교환할지 등을 협의한다.
SSL/TLS를 사용하여 보호되는 웹 사이트를 방문 할 때 웹 브라우저의 주소창에 "https://"프로토콜과 함께 자물쇠 아이콘이 표시된다.이는 해당 웹 사이트가 안전하게 암호화된 연결을 사용하고 있음을 나타낸다.
SSL/TLS 인증서는 신뢰할 수 있는 제 3자 기관,즉 인증 기관(CA,certificate Authority)에 의해 발급 된다.
먼저 가비아에서 원하는 도메인을 구매해 준 후 웹사이트의 보안강화,무료SSL/TLS제공,성능 향상,그리고 빠르고 안정적인 DNS 해석을 위해 Cloudflare로 DNS를 변경하였다.
Cludflare에 가입을 하고 구매한 사이트를 추가해 준다.
요금제를 무료로 선택해준다.
그다음 가비아에서 구매한 도메인의 네임서버를 Cloudflare의 네임서버로 변경해주어야 한다.
기존 가비아에 설정되어 있는 네임서버를 지우고 Cloudflare 네임서버를 넣어줘야 한다.
그다음 도메인에 대한 DNS 관리 설정을 해주어야 한다.
레코드 추가를 클릭하고
A 유형을 선택하고 @(루트 주소)를 입력하고 아이피주소를 입력해준다.
A 유형을 선택하고 www를 입력하고 아이피주소를 입력해준다.
Cloudflare로 DNS를 변경하는 이유
- 보안 강화 : Cloudflare는 웹사이트를 DDoS 공격과 다른 웹 위협으로부터 보호하는 기능을 제공한다.특히 웹 애플리케이션 방화벽(WAF)을 통해 악성 트래픽을 필터링하고 차단한다.
- 무료 SSL/TLS : Cloudflare는 Universal SSL이라는 무료 SSL인증서를 제공한다.이를 통해 웹사이트의 트래픽을 안전하게 HTTPS로 암호화할 수 있다.
- 성능 향상 : Cloudflare는 다양한 성능 최적화 기술을 통해 웹사이트의 응답 시간을 개선하며 사용자 경험을 향상 시킨다.
- 빠른 DNS 해석 : Cloudflare는 매우 빠른 DNS 해석 시간을 제공한다.또 DNS 설정 변경 사항이 거의 즉시 반영된다.
- 유연한 설정 : Cloudflare는 사용자에게 웹 트래픽을 제어하고,웹사이트 설정을 유연하게 조정할 수 있는 다양한 기능을 제공한다.
- 비용 효율 : Cloudflare의 기본 플랜은 무료이며,이플랜만으로도 많은 기능을 이용 할 수 있다.
이번 프로젝트는 nginx-proxy-manager 이미지를 사용하여 프록시 설정해주었다.
services:
nginx:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: always
ports:
- 81:81 #관리포트
- 80:80 #http
- 443:443 #
volumes:
- ./nginx-proxy-manager/data:/data
- ./nginx-proxy-manager/letsencrypt:/etc/letsencrypt
environment:
DISABLE_IPV6: "true"
81번 포트로 접속하여 nginx-proxy-manager를 통해 프록시 설정을 해주었다.
Nginx-Proxy-Manager를 사용하여 SSL 인증서를 요청하기 위해 Cloudflare에서 사용자 API토큰을 발급받아 한다.
API 토큰 -> 토큰 생성 -> 사용자 설정 토큰 시작 을 한후
토큰 이름을 입력해주고
권한을 영역,DNS,편집으로 설정해 토큰을 생성해준다.
생성된 토큰을 Nginx-Proxy-Manager에서 등록해줘야 한다.
Request a new SSL Cerficate를 눌러주고 Use a DNS Challenge 를 활성화 해준다.
DNS Provider 를 Cloudflare로 설정해주고
발급받은 cloudflare api token을 기본값을 지우고 입력해 주면 된다.
Let's Encrypt에서 발급받은 인증서가 적용된걸 알 수 있다.
Nginx Proxy Manager에서 Let's Encrypt의 인증서를 사용할 때 Cloudflare의 DNS API 토큰을 활용하는 이유는"DNS Challenge"를 통한 인증 방식 때문이다.
이 방식은 DNS 레코드를 변경하여 소유한 도메인을 검증하는 방법이다.
즉,Let's Encrypt가 인증서를 발급하기 전에 도메인 소유권을 확인하기 위해 DNS 검증을 요청하는데 Cloudflare의 DNS 서비스를 사용하는경우 Cloudflare의 API토큰이 이 검증 과정을 자동화하는데 필요한다.
Cloudflare는 DNS 검증을 위한 도구로 사용되며, 실제 SSL/TLS 인증서는 Let's Encrypt에서 발급받는 것이다.
이렇게 하여 백엔드 서버 주소가 https가 되어 처음 발생한 에러를 해결 할 수 있었다.