[Node.js] 3. EC2 서버에 HTTPS 연결하기

진욱·2025년 7월 2일

NodeJS

목록 보기
3/5
post-thumbnail

들어가며

1탄에서 Express로 구현한 서버를 EC2에 올리는 작업을 진행했고, 2탄에서 서버를 무중단 실행시키는 작업과 CI/CD를 구축하는 작업을 진행했다.

이번에는 현재 http://13.125.13.246 형태의 IP 주소로 접근해야 하는 서버에 이름을 달아주는 과정을 진행한다. 먼저 HTTP로 도메인을 연결하고, HTTPS를 적용해 보안을 강화한다.


HTTP 연결하기

1️⃣ 도메인 구매

현재 서버에 접속하려면 브라우저의 주소창에 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년 할인 이벤트로 저렴한 도메인을 하나 구매했다.


2️⃣ Route53에 도메인 연결

이제 구매한 도메인을 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차 호스트명에 등록한다.


3️⃣ IP 연결

다시 호스팅 영역으로 돌아와서, 새로운 레코드를 하나 생성한다.

A레코드 생성

[A레코드 생성]

  • 레코드 이름: EC2 서버에 사용할 레코드를 입력한다. 나는 api 용으로 사용할 예정이라 api로 설정했고, 만일 루트 도메인에 대한 레코드를 생성하려면 비워두면 된다.
  • 레코드 유형: A - IPv4 주소 및 일부 AWS 리소스로 트래픽 라우팅을 선택한다.
  • 값: 도메인을 연결하고자 하는 EC2의 퍼블릭 IP 주소를 입력한다.

레코드 생성을 마치면 약간의 시간이 지난 후 다음과 같이 도메인을 이용해 서버에 HTTP 접속이 가능하다! 혹시라도 접속이 안 된다면, EC2의 보안 그룹에 들어가서 아래와 같이 IPv6 규칙까지 허용하면 아마 접속이 잘 될 것이다.



HTTPS 연결하기

이제 서버에 도메인을 이용해 HTTP 접속까지 완료하였다. 하지만 브라우저에서 서버에 접속해보면 주소창에 계속해서 보안상의 문제를 제기하며 주의 요함 경고를 보내올 것이다. 이는 HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이기 때문에 보안상의 이유로 암호화가 추가된 HTTPS를 사용하라고 경고하는 것이다.

HTTPS는 HTTP에 SSL/TLS 등의 암호화가 추가된 프로토콜로, HTTP가 80번 포트를 사용하는 것과 달리 443번 포트를 사용하며 네트워크 상에서 중간에 제3자가 정보를 볼 수 없도록 암호화를 지원한다. 따라서 서버에 HTTPS 연결을 설정하여 보안을 강화하는 작업을 진행한다.

1️⃣ ACM 인증서 발급

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 등에도 인증서를 사용할 수 있는 것이다.
  • 내보내기를 비활성화한다.
  • 검증 방법: DNS 검증을 선택한다.

[Route53 레코드 생성]
인증서 요청을 완료하면 레코드 생성 버튼이 활성화될 텐데, 이 때 레코드를 생성하면 위와 같이 CNAME 레코드가 생성된다.

검증 대기중 상태가 조금 걸리기는 하지만 몇 분 기다리면 발급됨 상태로 변경될 것이다.


2️⃣ 로드 밸런서 설정

로드 밸런서를 이용해 http로 들어오는 클라이언트의 요청을 https로 리다이렉트 시키는 작업을 진행한다. EC2의 로드 밸런서 메뉴에서 로드 밸런서를 생성한다.

로드 밸런서 유형기본 구성

[로드 밸런서 유형]
Application Load Balancer(ALB)를 선택한다.

[기본 구성]

  • 체계: 인터넷을 이용해 로드 밸런서에 접근할 것이므로 인터넷 경계를 선택한다.
  • IP 주소 유형은 IPv4를 선택한다.
네트워크 매핑보안 그룹 설정

[네트워크 매핑]

  • VPC: EC2가 위치한 VPC를 선택한다.
  • 가용 영역 및 서브넷: 가용 영역은 최소 두 개 이상 선택해야 하며, 외부에서 접속하기 위해 Public Subnet을 선택한다.

[보안 그룹 설정]
EC2에 설정한 보안 그룹을 선택한다.

리스너 및 라우팅 설정대상 그룹 생성
대상 등록

[리스너 및 라우팅 설정]
리스너 및 라우팅에 대상 그룹을 설정하기 위해 대상 그룹 생성을 먼저 진행한다.

[대상 그룹 생성]

  • 기본 구성: 인스턴스를 선택한다.
  • 대상 그룹 이름을 지정한다.
  • 포트: 현재 로드 밸런서로 HTTP 요청이 들어왔을 때 몇 번 포트로 보낼 것인지 지정하는 것이기 때문에 80번 포트를 그대로 유지한다.

⚠️ 2탄에서 nginx 설정을 통해 80번 포트로 접근하면 3000번 포트로 보내는 설정을 추가한 상태라 그대로 80번을 유지했지만, 이 설정을 진행하지 않았다면 원하는 포트를 지정할 수도 있다.

[대상 등록]
인스턴스를 선택하고 아래에 보류 중인 것으로 포함을 클릭한 후, 대상 그룹을 생성한다. 이후 로드 밸런서 생성 메뉴로 돌아와 리스너 및 라우팅 설정을 계속한다.

리스너 및 라우팅 설정보안 리스너 설정

[리스너 및 라우팅 설정]

  • HTTP 80번 포트의 리스너와 HTTPS 443번 포트의 리스너를 추가한다.
  • 기본 작업: 위에서 생성한 대상 그룹을 선택한다.

[보안 리스너 설정]

  • 인증서는 발급받은 ACM 인증서를 선택한 후 로드 밸런서 생성을 마무리한다.
리스너 설정 변경리스너 규칙 변경

[리스너 규칙]
생성한 로드 밸런서의 리스너 및 규칙 메뉴로 이동해 HTTP:80번 규칙을 선택해 규칙을 편집한다.

[리스너 규칙 편집]

  • 라우팅 액션: HTTP로 요청이 들어왔을 때, HTTPS로 요청을 리다이렉트 시키므로 URL로 리디렉션을 선택한다.
  • 프로토콜: HTTPS를 설정한다.
  • 포트: 443번 포트를 설정한다.

3️⃣ Route53 레코드 변경

Route53의 호스팅 영역으로 이동해 기존에 생성한 A 레코드를 편집해야 한다.

A 레코드 편집

[A 레코드 편집]

  • 별칭 토글을 활성화한다.
  • 트래픽 라우팅 대상을 수정한다.
    • Application/Classic Load Balancer를 선택한다.
    • 지역은 아시아 태평양(서울)을 선택한다.
    • 위에서 생성한 로드밸런서를 선택한다.

1분 정도 기다리면 레코드 편집이 적용될 것이다.


4️⃣ 서버 접속

이제 서버에 기존 http://<도메인> 주소를 이용해 접속하면, 자동으로 https://<도메인>로 접속하는 것을 확인할 수 있다.

로드 밸런서의 리스너에서 http로 요청이 들어오면 https로 리다이렉트 시켜주었기 때문이다.


마치며

이로써 https 적용까지 완료되었다!

다음에는 EC2 인스턴스에 데이터베이스를 구축하고, 몇 가지 API를 설계한 후 Swagger를 활용한 API 설명서 작성과 CORS 설정 등을 적용할 예정이다. 여유가 된다면 간단한 Front-end 프로젝트를 개발하며 직접 구현한 Back-end를 한 번 사용해 보아야겠다.


참고

2개의 댓글

comment-user-thumbnail
2025년 7월 4일

이제 풀스택인가요

1개의 답글