Infra/AWS

[AWS] S3에 배포한 웹에 HTTPS 적용 - ACM, Route53, Cloud Front

강서월 2023. 6. 29. 21:33

S3웹사이트 엔드포인트에 HTTPS를 적용하려고 하였으나 S3 웹 사이트 엔드포인트는 HTTPS를 지원하지 않는다. AWS는 배포한 웹사이트를 더 안전하고, 보안을 강화하기 위해서 CloudFront를 사용하여 HTTPS를 적용하는 방법을 안내하고 있다.

CloudFront

Cloud Front는 AWS의 CDN(Content Delivery Network)서비스이다. 지리적으로 분산된 서버들을 연결한 네트워크(CDN)에서 Cloud Front는 클라이언트의 콘텐츠 요청으로 Origin Server에서 받아온 콘텐츠를 Edge Location에 캐싱하고 이후 같은 요청이 들어왔을 때, 그 캐싱해둔 것을 사용자에게 제공한다.

이러한 Cloud Front의 특성을 이용하여 Cloud Front Edge Server에 https로 리소스를 요청하고, Edge Server에 콘텐츠가 있다면 그대로 제공하고 그렇지 않다면 S3에 http 프로토콜로 리소스를 요청한다.

 

* Origin Server : 원본 데이터를 가지고 있는 서버로 AWS에서 EC2, S3에 해당

* Edge Server(=Edge Location) : 지리적으로 분산된 서버에 해당

 

위 그림에서 나오는 Route53, ACM 서비스에 대해서는 https를 적용하는 과정에서 설명하고, 본격적으로 https에 적용해보자.

 

S3 정적 웹 사이트 HTTPS 적용 과정 요약

1. Route53에 호스팅 영역 등록
2. ACM에서 SSL 인증서 발급 및 DNS 검증
3. Cloud Front 배포 생성
4. Route53에서 등록한 도메인 Cloud Front 별칭으로 라우팅 설정

1. Route53에 호스팅 영역 등록

Route53이란?

Route53은 AWS에서 제공하는 DNS(Domain Name Server) 웹 서비스로 도메인 등록, DNS 라우팅, 상태 확인 3가지 기능을 제공한다.

 

1. 가비아에서 도메인을 구매한다.

 

2. Route53에서 호스팅 영역을 생성해주어야 한다.

Route53 > 호스팅 영역 > 호스팅 영역 생성 버튼을 누른다. 구매한 도메인 주소를 입력하고, 호스팅 영역 생성 버튼을 누른다.

성공적으로 호스팅 영역이 생성되었음을 알 수 있다. (처음 생성된 호스팅 영역이라면 레코드 수가 2개이다.)

 

3. 생성된 호스팅 영역에 들어가면, Type이 NS로 된 값 4개가 생성되어 있다. 

 

4.생성된 값 4개를 가비아 네임 서버에 등록해주어야 한다.

* 주의 : 등록 시 값 뒤에 있는 .은 빼고 등록해야 한다.

 

2. ACM에서 SSL 인증서 발급 및 DNS 검증

ACM이란?

HTTPS 프로토콜을 적용하기 위해서는 SSL 인증서를 받아야 한다. SSL 인증서를 받는 방법은 2가지이다.

1) 서버 내부에 SSL인증서를 설치하고 서비스 하는 방법 (일반적인 기존 방식)

2) AWS에서 제공하는 인증서 관리 서비스인 ACM(AWS Certificate Manager)을 적용하는 방법

나는 2번째 방법으로 진행하였다. (HTTPS와 SSL에 대한 블로깅은 추후 예정]

 

* 주의 : 증명서가 쓰일 CloudFront는 버지니아 북부만을 지원하므로, 꼭 리전을 버지니아 북부로 설정해야한다

1. ACM에서 인증서 발급을 받아보자. AWS Certificate Manager(ACM) > 인증서 요청을 누른다. 

 

2. 도메인 설정을 하고 요청 버튼을 누른다.

나는 서브 도메인(API 서버에 대한 도메인)을 사용할 예정이라 다음과 같이 두개 작성하였다.

도메인 소유권을 검증하기 위한 방법으로 DNS 검증 방식, 키 알고리즘은 RSA 2048을 선택하고, 요청 버튼을 누른다.

 

3. 도메인에 대한 CNAME을 Route53에 등록한다.

생성된 인증서를 보면 도메인에 대한 CNAME이 생성되어 있다. 이는 key-value 값으로 사용자의 도메인에 대한 소유권을 증명한다. CNAME 레코드는 데이터베이스 즉, Route53에 등록되어야 하므로 수동으로 Route53에 레코드를 생성하거나 아래와 같이 버튼을 눌러 등록한다.

 

4. 30분정도 이후에 ACM에서 인증서 상태가 발급됨으로 변경된다.

 

DNS 검증 방식이란?

DNS 검증 방식은 이메일 검증 방식과 달리 인증서 기간 만료시 ACM이 직접 자동으로 갱신한다는 장점을 갖고 있다.

 

3. Cloud Front 배포 생성

1. CloudFront > 배포 > 배포 생성 버튼을 누른다.

 

2. Origin Server에 해당하는 원본 도메인을 지정한다. S3 버킷에 배포한 정적 웹사이트를 호스팅하므로 S3의 엔드포인트를 복사해서 붙여놓는다.

* 주의 : 선택하는 것이 아닌 S3 주소를 직접 복사해서 붙여야 한다.

S3의 엔드포인트는 S3 서비스 > 버킷 > 호스팅하는 버킷 > 속성 맨 아래에 있다.

 

3. 기본 캐시 동작을 설정한다.

나는 추가로 HTTP로 접속한 사용자를 HTTPS로 바꿔주는 프로토콜 정책으로 설정해주었다.

 

4. ACM에서 받은 SSL 인증서를 적용하고, 배포를 생성한다.

정상적으로 CloudFront가 배포되었음을 확인할 수 있다.

 

4. Route53에서 등록한 도메인 Cloud Front 별칭으로 라우팅 설정

이제 Route53에서 등록한 도메인으로 https 요청을 보내면, Cloud Front로 라우팅 되도록 설정해주자.

 

1. 1단계에서 생성한 호스팅 영역에 들어가서 레코드 생성 버튼을 누른다.

 

2. 다음과 같이 설정값을 넣고 레코드를 생성한다.

레코드 유형은 A형으로 Cloud Front 배포에 대한 별칭을 선택해 이전에 배포한 CloudFront를 선택해주면 된다.

 

이번 블로깅에서는 CloudFront를 이용하여 사용자가 https 프로토콜을 사용하여 S3버킷에 접근하도록 하였다.

 

그런데 서버와 클라이언트 연결이 제대로 되지 않았다. EC2인스턴스에 API 서버를 돌려 CSR 방식으로 개발한 나는 Mixed Content ERROR 문제를 직면하였다. 이 문제는 간단히 https 사이트에서 ajax를 사용해서 비동기로 http가 적용된 서버에 요청해서 문제가 발생했다. 암호화된 HTTPS 기반의 사이트에서 암호화되지 않은 HTTP 사이트에 요청을 보내서 Mixed content 에러가 발생한 것이다.

 

다음 글은 Mixed Content Error를 해결하기 위해서 EC2 인스턴스에 배포되어 있는 Spring API 서버에도 https로 요청을 하도록 적용하는 글이다.

 

[AWS] ACM, Route53, ALB - EC2 인스턴스에 HTTPS 적용

S3 버킷에 배포된 정적 웹 사이트에 HTTPS를 적용하고, Mixed Content Error를 직면하였다. 간단히 말해 HTTPS 적용된 정적 웹 사이트에서 HTTPS가 적용되지 않은 톰캣 서버에 요청했기 때문에 발생한 문제

kangkangsulae.tistory.com