들어가기 전에
이번 포스팅은 프론트엔드가 사용하는 NAVER MAP과의 통신을 위해 백엔드 도메인을 HTTPS로 통신하도록 설정하는 법에 대해 다뤄보고자 합니다.
진행하고 있는 프로젝트의 경우, Elastic Beanstalk을 통해 배포하였기 때문에 Elastic Beanstalk으로 인해 생성된 ALB(Application Load Balancer)에 Route53과 ACM을 통해 HTTPS 통신 설정을 하였습니다.
Elastic Beanstalk 환경이 이미 구성되어 있다는 가정하에 진행하였기 때문에 만약, Elastic Beanstalk의 어플리케이션 생성 및 환경 생성이 되어 있지 않다면 하기 포스팅을 먼저 읽어볼 것을 권해드립니다.
- [AWS, Github Action] Elastic Beanstalk에 SpringBoot 배포하기(1) - EB 기본 세팅
- [AWS, Github Action] Elastic Beanstalk에 SpringBoot 이미지 Docker로 배포하기(3) - EB 기본 세팅(RDS 포함)
Route 53
Amazon Route 53은 높은 가용성과 확장성을 가진 클라우드 Domain Name System(DNS) 웹 서비스입니다. 이 서비스를 통해 자신의 도메인 주소를 AWS의 여러 리소스와 연결시켜 사용할 수 있습니다.
Route 53 비용
처음 25개의 호스팅 영역에 대해 월별 호스팅 영역 당 0.50 USD 부과되며, 이를 넘어설 경우 추가 호스팅 영역에 대해 월별 호스팅 영역당 0.10 USD가 부과됩니다.
Route 53에 대해 좀 더 자세한 내용이 궁금하다면 하기 참고 자료 란의 AWS Route 53을 참고하면 됩니다.
Route 53에 도메인 등록하기
먼저 AWS 콘솔에 접근하여 Route 53의 호스팅 영역의 호스팅 영역 생성을 클릭합니다.
하기와 같이 생성하고자 DNS에 등록하고자 하는 도메인 이름을 작성하고, 호스팅 영역 생성을 클릭하면, 레코드 정보를 확인할 수 있습니다.
- 레코드 정보 중, 유형이 NS인 것이 NameServer이기 때문에, 해당 로우의 값/트래픽 라우팅 대상에 적힌 nameserver 리스트를 호스팅 영역 생성 시 등록한 도메인 이름과 동일한 도메인 구매 시, nameserver로 넣어야 합니다.
필자의 경우, 서브 도메인을 생성하여 해당 도메인을 Elastic Beanstalk에 연결할 것입니다. 서브 도메인을 생성하기 전에, 먼저 Route 53에 호스팅 영역을 생성하면서 얻은 NameServer를 신규 발급 받은 무료 도메인과 연결해보도록 하겠습니다.
무료 도메인 발급 받기(Freenom)
실 프로젝트에서는 가비아를 통해 도메인을 구매하였지만, 이번 포스팅에서는 테스트 용도로 사용하기 위해 발급받은 도메인이라 Freenom에서 무료 도메인을 발급받았습니다.
먼저, Freenom 사이트에 접속하여 로그인을 하고 원하는 도메인을 구할 수 있는지 확인합니다.
이때 위와 같이 Get it now! 버튼을 클릭하여 바로 도메인 발급이 되면 문제 없지만, 아래와 같이 Get it now! 클릭 시 Not available이 뜬다면, 검색창에 최상위 도메인까지 모두 넣어서 검색한 후 발급을 시도하는 것을 권장합니다.
1 domain in cart가 뜬 것을 확인한 후 Checkout 버튼을 클릭하면, 아래 과정과 같이 도메인 발급이 가능합니다.
위 과정을 통해 도메인을 발급 받으면, 아래와 같이 로그인이 가능합니다.
- 로그인 계정은 도메인 Checkout 시 인증 받은 이메일 주소로 로그인하며, 비밀번호는 Review & Checkout의 Your Details에 넣은 Password입니다.
로그인이 완료되면, Services > My Domains를 클릭하여 NameServer를 등록하면 됩니다.
위와 같이 Services > My Domains에 접근한 뒤 NameServer를 등록하고자 하는 도메인의 Manage Domain을 클릭합니다. 그 후, Management Tools > NameServers를 클릭하여 하기와 같이 NameServer를 입력합니다.
위에 등록하는 NameServer는 Route 53에서 호스팅 영역 생성 시 유형이 NS로 나온 로우의 값/트래픽 라우팅 대상에 적혀 있는 ns 도메인들을 각각 한 줄씩 넣어주면 됩니다. NameServer를 등록한 뒤, whois 명령어를 통해 신규 발급 받은 도메인을 확인해보면, NameServer가 변경된 것을 확인할 수 있습니다.
Freenom 로그인 에러(Your social login could not be determined)
만약, 도메인을 구매하지 않고 로그인을 시도하면 아래와 같이 에러가 발생할 수 있습니다. 이 경우, 발급받고자 하는 도메인을 먼저 검색하여 발급하는 과정을 진행하다보면 이슈 없이 로그인이 가능합니다.
Route 53에 서브 도메인을 생성하여 Elastic Beanstalk과 연결해보기 (HTTP)
기본적으로, Elastic Beanstalk에 접근할 때 사용하는 도메인은 하기와 같이 Elastic Beanstalk의 환경에서 확인할 수 있습니다.
현재 하고자 하는 작업은 기존과 동일하게 HTTP를 사용하되, Elastic Beanstalk이 기본으로 제공하는 도메인이 아닌 신규로 발급 받은 도메인을 통해 Elastic Beanstalk에 접근하고자 하는 것입니다.
먼저, Route 53에 접속하여 레코드 생성을 클릭하여 서브 도메인을 생성해보도록 하겠습니다.
- 레코드 생성 시, 레코드 이름은 원하는 이름으로 지정하면 되며 필자의 경우 elastic beanstalk에 사용할 것이라 eb로 지었습니다.
- 레코드 유형의 경우, AWS 리소스로 트래픽 라우팅은 CNAME 레코드나 A 레코드 모두 사용 가능합니다.
- 이때 A 레코드를 통해 Elastic Beanstalk 도메인을 연결한 이유는, Elastic Beanstalk의 도메인에는 region명이 표시되어 있어 alias 레코드를 만들 수 있기 때문입니다. alias 레코드는 CNAME 레코드에 보다 나은 점에 대해서는 하기에 작성해두었습니다.
- 이때 A 레코드를 통해 Elastic Beanstalk 도메인을 연결한 이유는, Elastic Beanstalk의 도메인에는 region명이 표시되어 있어 alias 레코드를 만들 수 있기 때문입니다. alias 레코드는 CNAME 레코드에 보다 나은 점에 대해서는 하기에 작성해두었습니다.
- 트래픽 라우팅 대상에는 별칭을 사용하여 기입하였으며, Elastic Beanstalk에 대한 라우팅인데, ALB를 선택한 이유는 다음과 같습니다.
- Elastic Beanstalk 구성 시 ALB 로드밸런서를 앞에 두어 사실상 클라이언트는 ALB를 통해 Elastic Beanstalk에 접근하게 됩니다. 따라서, ALB 로드밸런서에 대해 접근할 때에 라우팅을 해주면 그 뒤단은 신경 쓸 필요가 없습니다(사실상 ALB - Elastic Beanstalk에 의해 생성된 EC2간 통신은 클라이언트가 직접 접근 X).
위와 같이 레코드를 생성해주면 생성된 레코드(서브 도메인: 여기서는 eb.earth-h.tk)로 접근 시 기존에 Elastic Beanstalk 도메인으로 접근했을 때와 동일한 화면을 확인할 수 있습니다.
Alias 레코드 VS CNAME 레코드
Alias 레코드는 CNAME 레코드와 유사해보이지만 하기와 같은 CNAME 레코드가 가진 문제를 해결할 수 있는 장점을 가지고 있습니다.
AWS Elastic Load Balancer, AWS Elastic Beanstalk과 같은 AWS가 기본적으로 제공하는 DNS 이름(도메인)은 보통 XXX-<aws-region>.amazon.com으로 생성됩니다.
Alias 레코드를 사용하면, 도메인 내에 AWS region이 포함되어 있으면 따로 IP 정보를 넣을 필요 없이 어떤 AWS 서비스로 라우팅할 것인지 작성할 수 있습니다.
- 위에서 Route 53을 이용해 Elastic Beanstalk에 대한 레코드 생성 시 Alias 레코드 사용
또한, Route 53은 Alias 레코드를 사용하여 트래픽을 라우팅하는 요청에 대해서는 요금을 부과하지 않습니다.
- CNAME 레코드를 통해 DNS 질의를 진행할 때는 요금 부과
ACM(AWS Certificate Manager)을 통해 Elastic Beanstalk에 HTTPS로 접근하기
ACM(AWS Certificate Manager)
AWS Certificate Manager는 AWS 서비스 및 연결된 내부 리소스에 사용할 공인 및 사설 SSL/TLS 인증서를 손쉽게 관리 및 배포할 수 있도록 도와주는 서비스입니다.
AWS Certificate Manager를 통해 프로비저닝된 공인 SSL/TLS 인증서는 무료이며, 사설 인증 기관을 사용할 경우에만 과금됩니다.
필자의 경우, AWS가 제공하는 공인 SSL/TLS 인증서를 사용하여 기존에 생성한 서브 도메인인 eb.earth-h.tk를 https로 접근하였을 때, Elastic Beanstalk에 정상 접근되도록 설정해보도록 하겠습니다.
ACM(AWS Certificate Manager)를 통해 AWS가 제공하는 공인 SSL/TLS 인증서 발급받기
먼저 AWS 콘솔에 접속하여 Cetificate Manager 서비스에 들어갑니다. 처음 인증서를 발급 받는 것이라면, 하기와 같이 화면이 뜰 것이고 인증서 요청 버튼을 눌러 인증서를 생성해보겠습니다.
인증서 요청 시, 하기와 같이 퍼블릭 인증서 요청으로 해야 AWS가 제공하는 무료 인증서를 받을 수 있습니다.
- 도메인 이름에는 인증서를 사용하고자 하는 정확한 명칭의 도메인을 넣어줍니다.
- 검증 방법은 이메일 검증도 가능하겠지만, 필자와 같이 Route 53 접근 권한이 있다면 DNS 검증을 통해 편하게 검증이 가능합니다.
위 과정을 토대로 인증서를 발급 받으면 하기와 같이 검증 대기중으로 뜬 인증서를 볼 수 있습니다.
인증서를 클릭하여 인증서 정보를 보면, 도메인 부분에 Route 53에서 레코드 생성 버튼이 있습니다. 해당 버튼을 클릭하여 Route 53에 레코드를 생성해줍니다.
여기까지 완료되면, 검증 대기중이 아닌 발급됨으로 인증서의 상태가 변경됩니다.
이때, https://eb.earth-h.tk(각자의 도메인을 https로 접근)를 접속하게 되면 한없이 로딩이 이루어지며, 접근이 되지 않는 것을 확인할 수 있습니다. 이는 Elastic Beanstalk 설정에서 로드밸런싱에 80 포트에 대해서만 세팅을 해주었기 때문입니다.
https로 접근해도 제대로 Elastic Beanstalk 환경으로 라우팅되도록 Elastic Beanstalk 구성을 변경해보도록 하겠습니다.
HTTPS 접근이 되도록 Elastic Beanstalk의 ALB 설정 변경하기
먼저, Elastic Beanstalk의 환경에 접근하여 ALB 설정을 추가하고자 하는 환경의 구성을 클릭합니다. 그 후 로드밸런서 탭의 리스너 부분을 하기와 같이 수정합니다.
- ALB 설정의 경우, 443 포트를 통해 HTTPS 접근할 수 있도록 하였습니다.
- 이때, Security policies는 ALB가 사용할 수 있는 Security policies(하기 사진)를 참고하였습니다.
- 리스너 추가 시 ACM은 위에서 생성한 인증서를 연결해주면 됩니다.
로드밸런서의 리스너를 추가한 뒤, 적용을 누르면 Elastic Beanstalk이 환경 구성을 변경합니다.
구성이 완료되면 하기와 같이, https 역시 Elastic Beanstalk 환경으로 라우팅이 되는 것을 확인할 수 있습니다.