
1탄에서 Express로 구현한 서버를 EC2에 올리는 작업을 진행했고, 2탄에서 서버를 무중단 실행시키는 작업과 CI/CD를 구축하는 작업을 진행했다.
이번에는 현재 http://13.125.13.246 형태의 IP 주소로 접근해야 하는 서버에 이름을 달아주는 과정을 진행한다. 먼저 HTTP로 도메인을 연결하고, HTTPS를 적용해 보안을 강화한다.
현재 서버에 접속하려면 브라우저의 주소창에 http://13.125.13.246이라는 퍼블릭 IP 주소를 직접 입력해야한다. 하지만 우리가 사용하는 대부분의 웹사이트 또는 API에서 이런 방식을 이용해 접근하는 것을 찾아보기는 쉽지 않다. 그 이유는 대부분의 웹사이트는 도메인(domain) 이라는 것을 사용하기 때문이다.
도메인은 인터넷에서 웹사이트나 이메일 주소 등을 사람이 식별하기 쉽게 문자 기반으로 만든 주소를 말한다. 우리가 구글의 웹 서버가 142.250.76.142에 있다는 것을 기억할 필요 없이 www.google.com 이라는 문자 기반의 주소를 이용해 Google에 접속할 수 있는 이유가 바로 도메인 덕분이다.
브라우저에서 문자(ex. www.google.com)를 이용해 웹사이트에 접속하면 도메인 이름 시스템(DNS, Domain Name System)이 도메인 이름을 컴퓨터가 네트워크에서 서로를 식별하는데 사용하는 IP 주소(ex. 142.250.76.142)로 변환하여 사용자에게 원하는 결과를 전달하는 것이다.
지금 하려고 하는 작업은 네트워크에서 식별을 위해 사용하는 13.125.13.246이라는 IP 주소에 도메인 이름을 붙이는 것이다. 도메인 이름을 붙이기 위해서 도메인을 구매해야 하는데, 도메인을 구매할 수 있는 사이트는 여러 곳이 있지만 나는 가장 유명한 가비아에서 1년 할인 이벤트로 저렴한 도메인을 하나 구매했다.

이제 구매한 도메인을 AWS Route53에 연결한다. Route53 호스팅 영역 메뉴에서 호스팅 영역을 생성한다.
| 호스팅 영역 구성 |
|---|
![]() |
[호스팅 영역 구성]
| Route53 네임서버 확인 | 가비아 네임서버에 등록 |
|---|---|
![]() | ![]() |
[Route53 네임서버 확인]
호스팅 영역을 생성하면 위와 같이 2개의 레코드가 생성되는데, 이 중 NS 레코드에 있는 네 개의 주소를 가비아의 네임서버에 등록해야 한다.
예시)
ns-0000.aaaaa-00.org
ns-0000.aaaaa-00.net
ns-0000.aaaaa-00.com
ns-0000.aaaaa-00.co.uk
[가비아 네임서버에 등록]
위 네 개의 주소를 가비아의 네임 서버의 1차 ~ 4차 호스트명에 등록한다.
다시 호스팅 영역으로 돌아와서, 새로운 레코드를 하나 생성한다.
| A레코드 생성 |
|---|
![]() |
[A레코드 생성]
api로 설정했고, 만일 루트 도메인에 대한 레코드를 생성하려면 비워두면 된다.
레코드 생성을 마치면 약간의 시간이 지난 후 다음과 같이 도메인을 이용해 서버에 HTTP 접속이 가능하다! 혹시라도 접속이 안 된다면, EC2의 보안 그룹에 들어가서 아래와 같이 IPv6 규칙까지 허용하면 아마 접속이 잘 될 것이다.

이제 서버에 도메인을 이용해 HTTP 접속까지 완료하였다. 하지만 브라우저에서 서버에 접속해보면 주소창에 계속해서 보안상의 문제를 제기하며 주의 요함 경고를 보내올 것이다. 이는 HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이기 때문에 보안상의 이유로 암호화가 추가된 HTTPS를 사용하라고 경고하는 것이다.
HTTPS는 HTTP에 SSL/TLS 등의 암호화가 추가된 프로토콜로, HTTP가 80번 포트를 사용하는 것과 달리 443번 포트를 사용하며 네트워크 상에서 중간에 제3자가 정보를 볼 수 없도록 암호화를 지원한다. 따라서 서버에 HTTPS 연결을 설정하여 보안을 강화하는 작업을 진행한다.
HTTPS는 SSL/TLS 방식을 이용해 보안을 강화한다.
SSL(Secure Sockets Layer)은 클라이언트와 서버가 서로 데이터를 암호화해 통신할 수 있도록 돕는 보안 프로토콜이다. TLS(Transport Layer Security)는 SSL의 업그레이드 버전으로 더 이상 사용되지 않고 TLS 방식을 사용하며 SSL/TLS로 표기한다. 두 프로토콜 모두 웹사이트와 사용자 간의 데이터 전송을 안전하게 만들어, 중간에서 누군가가 정보를 훔치는 것을 방지한다. 웹사이트와 사용자 간에 암호화와 인증을 통해 데이터 전송을 안전하게 만드는데, 이 때 AWS에서 발급하는 ACM 인증서가 필요하다. 이 인증서를 활용해 AWS에서 웹사이트나 애플리케이션의 HTTPS 보안을 설정한다.
| ACM 인증서 요청 | 퍼블릭 인증서 요청 |
|---|---|
![]() | ![]() |
| Route53 레코드 생성 |
|---|
![]() |
[ACM 인증서 요청]
퍼블릭 인증서를 요청한다.
[퍼블릭 인증서 요청]
*.도메인.com과 같이 와일드카드를 넣어서 작성하면 해당 도메인의 모든 하위 도메인에 인증서를 적용할 수 있다. 따라서 api.jinwook.site 뿐만 아니라 추후에 blog.jinwook.site 등에도 인증서를 사용할 수 있는 것이다.[Route53 레코드 생성]
인증서 요청을 완료하면 레코드 생성 버튼이 활성화될 텐데, 이 때 레코드를 생성하면 위와 같이 CNAME 레코드가 생성된다.

검증 대기중 상태가 조금 걸리기는 하지만 몇 분 기다리면 발급됨 상태로 변경될 것이다.
로드 밸런서를 이용해 http로 들어오는 클라이언트의 요청을 https로 리다이렉트 시키는 작업을 진행한다. EC2의 로드 밸런서 메뉴에서 로드 밸런서를 생성한다.
| 로드 밸런서 유형 | 기본 구성 |
|---|---|
![]() | ![]() |
[로드 밸런서 유형]
Application Load Balancer(ALB)를 선택한다.
[기본 구성]
| 네트워크 매핑 | 보안 그룹 설정 |
|---|---|
![]() | ![]() |
[네트워크 매핑]
[보안 그룹 설정]
EC2에 설정한 보안 그룹을 선택한다.
| 리스너 및 라우팅 설정 | 대상 그룹 생성 |
|---|---|
![]() | ![]() |
| 대상 등록 |
|---|
![]() |
[리스너 및 라우팅 설정]
리스너 및 라우팅에 대상 그룹을 설정하기 위해 대상 그룹 생성을 먼저 진행한다.
[대상 그룹 생성]
80번 포트를 그대로 유지한다.⚠️ 2탄에서 nginx 설정을 통해
80번 포트로 접근하면3000번 포트로 보내는 설정을 추가한 상태라 그대로80번을 유지했지만, 이 설정을 진행하지 않았다면 원하는 포트를 지정할 수도 있다.
[대상 등록]
인스턴스를 선택하고 아래에 보류 중인 것으로 포함을 클릭한 후, 대상 그룹을 생성한다. 이후 로드 밸런서 생성 메뉴로 돌아와 리스너 및 라우팅 설정을 계속한다.
| 리스너 및 라우팅 설정 | 보안 리스너 설정 |
|---|---|
![]() | ![]() |
[리스너 및 라우팅 설정]
80번 포트의 리스너와 HTTPS 443번 포트의 리스너를 추가한다.[보안 리스너 설정]
| 리스너 설정 변경 | 리스너 규칙 변경 |
|---|---|
![]() | ![]() |
[리스너 규칙]
생성한 로드 밸런서의 리스너 및 규칙 메뉴로 이동해 HTTP:80번 규칙을 선택해 규칙을 편집한다.
[리스너 규칙 편집]
443번 포트를 설정한다.Route53의 호스팅 영역으로 이동해 기존에 생성한 A 레코드를 편집해야 한다.
| A 레코드 편집 |
|---|
![]() |
[A 레코드 편집]
1분 정도 기다리면 레코드 편집이 적용될 것이다.
이제 서버에 기존 http://<도메인> 주소를 이용해 접속하면, 자동으로 https://<도메인>로 접속하는 것을 확인할 수 있다.

로드 밸런서의 리스너에서 http로 요청이 들어오면 https로 리다이렉트 시켜주었기 때문이다.
이로써 https 적용까지 완료되었다!
다음에는 EC2 인스턴스에 데이터베이스를 구축하고, 몇 가지 API를 설계한 후 Swagger를 활용한 API 설명서 작성과 CORS 설정 등을 적용할 예정이다. 여유가 된다면 간단한 Front-end 프로젝트를 개발하며 직접 구현한 Back-end를 한 번 사용해 보아야겠다.
이제 풀스택인가요