Blog

테크

AWS에서 EC2로 배포한 웹 서버를 HTTPS로 제공하기

#HTTPS#AWS#ELB#ALB#EC2#Load Balancer#Route 53#Web#Backend

2025-04-07

AWS에서 EC2로 배포한 웹 서버를 HTTPS로 제공하기
🌐

AWS에서 EC2로 배포한 웹 서버를 HTTPS로 제공하기

AWS에 웹 서버를 올리면서 HTTPS도 함께 설정해야 했는데, 처음엔 HTTPS가 왜 필요한지도 잘 몰랐고, AWS 사용법도 생각보다 복잡했습니다. 그래서 저처럼 처음 AWS에서 HTTPS를 설정하는 사람들을 위해, HTTPS의 필요성과 AWS에서 로드밸런서를 사용하여 HTTPS를 설정하는 과정을 정리해봤습니다.

HTTPS의 필요성

HTTPS는 HTTP에 TLS(Transport Layer Security) 보안 계층을 더한 프로토콜입니다. 즉, HTTPS를 사용한다는 것은 HTTP 통신 내용을 TLS를 통해 암호화하고 보호한다는 의미입니다.
오늘날 웹 서비스를 배포하려면 HTTPS는 필수적으로 사용해야 합니다. 그래서 먼저 왜 HTTP가 아닌 HTTPS를 사용해야 하는지, 그리고 HTTPS를 사용하면 좋은 점이 무엇인지 알아봤습니다.

1. 데이터 암호화

HTTP는 패킷 안의 데이터가 암호화되지 않습니다. 그래서 사용자 인증이나 민감한 개인정보를 처리할 때, 이러한 정보가 제3자에게 쉽게 노출될 수 있습니다.
HTTPS는 TLS를 이용해 패킷 안의 HTTP 데이터를 암호화하므로, 로그인 정보, 쿠키, 개인정보 같은 민감한 정보가 중간에서 탈취당하더라도 읽을 수 없게 만듭니다. 실제로 Wireshark 같은 소프트웨어로 HTTPS 트래픽을 분석해보면, TLS가 적용되어 있기 때문에, 실제 HTTP 메시지는 암호화되어 평문을 확인할 수 없습니다.
<그림> Wireshark에서 확인한 session 관련 HTTP 패킷에 그대로 노출된 데이터
<그림> Wireshark에서 확인한 session 관련 HTTP 패킷에 그대로 노출된 데이터
<그림> Wireshark에서 확인한 패킷의 TLS로 암호화된 데이터
<그림> Wireshark에서 확인한 패킷의 TLS로 암호화된 데이터
 

2. 데이터 무결성

<그림> 중간자 공격 예시 - 파일 변조를 통한 랜섬웨어 배포
<그림> 중간자 공격 예시 - 파일 변조를 통한 랜섬웨어 배포
HTTP는 통신 중 데이터가 변조되었는지 확인할 수 없습니다. 따라서 누군가 패킷을 가로채 내용을 바꾸는 중간자 공격(MITM, Man-in-the-Middle attack)을 막을 수 없습니다. 해커는 이 공격을 통해 정상적인 데이터를 악성 코드로 바꾸거나, 회사 기밀을 유출시키는 등의 일을 할 수 있습니다.
TLS는 MAC(Message Authentication Code) 또는 AEAD(Authenticated Encryption with Associated Data) 기법을 사용해 전송 중 데이터가 변조되지 않았음을 확인할 수 있습니다. 이를 통해 중간자 공격(MITM)에서 발생할 수 있는 데이터 위변조를 사전에 탐지하고 차단할 수 있습니다.

3. 서버 인증

<그림> 구글 웹사이트의 인증서 유효 여부와 발급 기관 정보
<그림> 구글 웹사이트의 인증서 유효 여부와 발급 기관 정보
TLS는 클라이언트(브라우저)가 접속하려는 서버가 진짜 신뢰할 수 있는 서버인지 확인할 수 있도록 디지털 인증서를 사용합니다. 이 인증서는 일반적으로 공인 인증기관(CA)이 발급하며, 인증서에 포함된 정보(도메인, 공개키 등)를 바탕으로 브라우저는 “내가 접속한 서버가 진짜 이 도메인의 주인인가?”를 검증합니다. 이 과정을 통해 사용자는 피싱 사이트나 위조 서버에 속는 것을 방지할 수 있습니다.

4. 사용자 신뢰도 및 검색엔진 최적화 (SEO) 향상

<그림> Chrome에서 HTTP 사이트에 접속하면 표시되는 보안 경고 안내
<그림> Chrome에서 HTTP 사이트에 접속하면 표시되는 보안 경고 안내
크롬과 같은 일부 브라우저에서는 HTTPS가 아닌 HTTP를 사용하는 웹 사이트에 안전하지 않음 이라는 표시를 사용자에게 보여줍니다. 따라서 HTTP로 서비스를 제공하는 경우 사용자에게 신뢰를 주기 어렵고, 사이트 이용률이 떨어질 가능성이 높습니다.
또한 구글은 HTTPS를 사용하는 사이트를 더 높게 평가하므로, 검색 순위를 높이는 데 도움을 줍니다.

5. HTTPS에서만 지원되는 브라우저 고급 기능

많은 최신 웹 API는 HTTPS 환경에서만 동작합니다. 예를 들어 다음과 같은 기능들은 HTTPS 환경에서만 동작합니다.
  • 프로토콜
    • HTTP/2: 표준에서는 TLS가 선택사항이지만, 대부분의 주요 브라우저가 TLS를 강제하므로, 사실상 HTTPS에서만 동작한다고 볼 수 있습니다.
    • HTTP/3: 구글에서 개발한 QUIC라는 UDP 상에서 동작하면서 TLS 1.3을 내장하고 있는 프로토콜을 사용하며, 개발자 입장에선 최적화된 HTTPS라는 정도로 볼 수 있습니다.
이런 기능을 사용하려면 HTTPS 환경이 필수이기 때문에, 현대적인 웹 애플리케이션을 만들기 위해서도 HTTPS는 기본 전제가 됩니다.

HTTPS 유의사항

HTTPS는 TLS를 통해 전송 중인 데이터를 암호화하여, 중간자 공격이나 데이터 탈취, 위변조 같은 보안 위협을 효과적으로 차단합니다. 하지만 TLS는 통신 구간만을 보호하기 때문에, 다음과 같은 상황에서는 여전히 보안 위협이 존재할 수 있습니다:
  • 사용자의 단말기가 악성코드에 감염되어 있거나 해킹된 경우, 입력한 정보는 암호화되기 전에 유출될 수 있습니다.
  • 웹 서버 자체에 보안 취약점이 있거나, 인증서 관리가 부실할 경우에도 HTTPS는 완전한 보안을 보장하지 못합니다.
결국 HTTPS는 웹 보안의 출발점일 뿐이며, 종단 간(end-to-end) 보안을 위해서는 사용자와 서버 양쪽 모두의 보안 관리가 필수적입니다.

AWS에서 로드밸런서를 사용하여 HTTPS 제공하기

개요

<그림> AWS에서 HTTPS 요청을 EC2 서버로 전달하기까지의 과정
<그림> AWS에서 HTTPS 요청을 EC2 서버로 전달하기까지의 과정
AWS에서 HTTPS 요청을 EC2 서버로 전달하기 위한 구성과 과정은 위 그림과 같습니다.

주요 구성

  • AWS Route 53
    • 웹 서비스의 도메인 주소를 등록 및 관리하거나, 이미 보유한 도메인을 AWS 리소스와 연결할 수 있도록 설정합니다.
    • 이 문서에서는 Route 53이 사용자 도메인 요청을 로드밸런서(ALB)로 전달하는 역할을 합니다.
  • Application Load Balancer: (ALB)
    • AWS에서 제공하는 로드밸런서 서비스 중 하나로, HTTP 및 HTTPS 요청을 처리하고, 트래픽을 여러 대상(Targets)으로 분산시키는 레이어 7 로드밸런서입니다.
    • TLS(HTTPS) 종료, 경로 기반 라우팅, 정적 콘텐츠 처리 등 다양한 웹 어플리케이션 기능을 제공합니다.
  • Target Group
    • 하나 이상의 EC2 인스턴스를 그룹으로 묶어, ALB가 트래픽을 분산할 대상을 정의합니다.
    • 각 인스턴스의 상태를 자동으로 확인(헬스 체크)하여 정상적인 인스턴스에만 요청을 전달하도록 돕습니다.
  • EC2 인스턴스
    • AWS 클라우드에 생성된 가상 서버로, 이 문서에서는 Next.js 웹 어플리케이션이 실행 중인 웹 서버로 사용됩니다.

HTTPS 요청 전달 과정

  1. 사용자가 브라우저에서 웹사이트 주소(예: example.com)를 입력하면, 브라우저는 해당 도메인에 대한 DNS 조회(DNS Lookup)를 수행합니다.
  1. AWS Route 53은 example.com 도메인에 연결된 Application Load Balancer(ALB)의 도메인 주소(예: example.region.elb.amazonaws.com)를 반환합니다. 즉, 직접 EC2 인스턴스의 IP를 반환하지 않고, 트래픽을 ALB로 유도합니다.
  1. 브라우저는 반환된 ALB 주소로 HTTPS 요청을 전송합니다. 이때, TLS 핸드셰이크를 통해 암호화된 연결이 수립됩니다.
  1. ALB는 설정된 리스너(Listener)라우팅 규칙(Routing Rules)에 따라 요청을 적절한 대상 그룹(Target Group)으로 전달합니다.
  1. 대상 그룹은 내부적으로 연결된 EC2 인스턴스(Next.js 서버)로 요청을 전달하고, 해당 인스턴스가 실제로 클라이언트 요청을 처리합니다.

HTTPS 설정 전 사전 준비

HTTPS를 설정하기 전에, 아래 리소스들이 준비되어 있어야 합니다.
  • 서비스를 호스팅할 EC2 인스턴스 (Next.js 앱이 실행 중이어야 합니다)
  • 연결할 도메인 이름 (여기서는 AWS Route 53을 기준으로 설명하지만, 다른 도메인 등록기관도 이용 가능)
이 문서에서는 위 리소스들이 이미 준비되어 있다고 가정하고, HTTPS를 위한 로드밸런서를 설정하는 방법에 대해서만 집중적으로 다룹니다.

AWS 로드 밸런서 생성 및 설정

1) 로드 밸런서란?

<그림> 로드 밸런서를 이용한 요청 분산 구조
<그림> 로드 밸런서를 이용한 요청 분산 구조
‘로드 밸런서(Load Balancer)’라는 용어를 분리해서 보면, 그 개념을 더 쉽게 이해할 수 있습니다.
  • 로드(load): 직역하면 ‘부하’인데, 여기서는 외부에서 서비스로 들어오는 다양한 요청들을 의미합니다. 예를 들어, 사용자가 웹 페이지에 접속하거나 데이터를 요청할 때 발생하는 트래픽이 이에 해당합니다.
  • 밸런서(balancer): 균형을 유지하는 장치입니다. 즉, 특정 서버에 트래픽이 몰리지 않도록 여러 서버에 요청을 골고루 분산시켜주는 역할을 합니다.
따라서 로드 밸런서는 외부에서 들어오는 요청들을 적절하게 분산시켜, 여러 서버가 안정적으로 서비스를 처리할 수 있도록 도와주는 장치입니다.
예를 들어 서비스를 구성하는 서버들 중에서 하나의 서버에만 모든 요청이 몰리면, 해당 서버는 과부하로 느려지거나 다운될 수 있습니다. 로드 밸런서를 사용하면 이 요청들을 여러 서버로 나눠서 처리하므로 더 안정적이고 확장 가능한 서비스 운영이 가능합니다.

2) AWS에서 로드밸런서를 사용하여 HTTPS를 설정하는 이유

AWS를 사용하지 않는 환경에서는 보통 Nginx나 Apache에 인증서를 직접 설치하고 수동으로 관리합니다. 하지만 AWS에서는 ACM(AWS Certificate Manager)를 통해 인증서를 로드밸런서에 쉽게 연동할 수 있고, 자동 갱신까지 지원하기 때문에 훨씬 간편하게 HTTPS를 설정할 수 있습니다.
그래서 일반적으로 AWS에서는 로드밸런서를 사용해 HTTPS 요청을 받아 웹 서버(EC2)로 전달하는 구조로 구성합니다. 또한 로드밸런서를 사용하면 트래픽 분산이나 서비스 확장(스케일링)에도 유리하다는 장점이 있습니다.

3) 로드 밸런서 (ELB) 기본 정보 설정

💁‍♂️
AWS 용어 소개: ELB(Elastic Load Balancing)
ELB(Elastic Load Balancing)란 AWS에서 여러 대의 서버에 트래픽을 자동으로 분산시켜주는 서비스로, 서버 과부하를 막고 웹 서비스를 안정적으로 운영할 수 있게 해줍니다.
먼저 AWS EC2 대시보드의 사이드바에서 로드 밸런싱 그룹의 [로드밸런서] 메뉴를 클릭합니다.
<그림> EC2 대시보드 화면에서 찾을 수 있는 로드밸런서 메뉴
<그림> EC2 대시보드 화면에서 찾을 수 있는 로드밸런서 메뉴
다음으로 로드 밸런서 페이지에서 [로드 밸런서 생성] 버튼을 누릅니다.
<그림> EC2 대시보드의 로드 밸런서 화면
<그림> EC2 대시보드의 로드 밸런서 화면
다음으로 로드 밸런서 유형을 선택할 수 있습니다. HTTPS를 제공해야 하는 경우에는 L7(Application Layer) 로드 밸런서인 ALB(Application Load Balancer)를 사용합니다. 반면, NLB(Network Load Balancer)는 더 낮은 계층인 L4(Transport Layer)에서 동작하므로 HTTPS 환경에는 적합하지 않습니다. 대신, ALB보다 처리 속도가 빠르기 때문에 실시간 응답이 필요한 TCP/UDP 기반 트래픽에는 유용하게 활용됩니다.
참고로 AWS의 ALB에서는 HTTP/1.1 및 HTTP/2는 지원하지만, HTTP/3은 아직 지원되지 않습니다. HTTP/3을 사용하려면 AWS CloutFront를 통해서 처리하거나, Nginx와 같은 서버를 준비하여 별도로 HTTP/3을 설정해야 합니다.
항목
ALB (Application Load Balancer)
NLB (Network Load Balancer)
계층 (OSI)
L7 (Application)
L4 (Transport)
프로토콜
HTTP, HTTPS, WebSocket
TCP, TLS, UDP
HTTPS 처리
지원
제한적 (직접 처리 X)
특징
콘텐츠 기반 라우팅
낮은 지연, 빠른 처리
<그림> 로드 밸런서 유형 선택 화면
<그림> 로드 밸런서 유형 선택 화면
다음으로 ALB의 구성을 설정합니다.
  • 로드밸런서 이름: 자유롭게 설정
  • 체계: 인터넷 경계
  • IP 주소 유형: IPv4
<그림> ALB 생성 시 기본 구성 설정
<그림> ALB 생성 시 기본 구성 설정

4) 로드 밸런서 (ELB) 네트워크 매핑

💁‍♂️
AWS 용어 소개: VPC(Virtual Private Cloud)
AWS 안에서 내가 직접 구성할 수 있는 가상의 네트워크 공간으로, EC2 같은 자원을 어디에 둘지, 인터넷은 열지 등을 설정할 수 있습니다.
다음으로 ALB의 네트워크 매핑을 설정합니다.
  • VPC: EC2의 VPC를 선택합니다.
    • EC2 인스턴스 목록에서 사용할 인스턴스를 클릭하고, [네트워킹] 탭을 클릭하여 VPC ID를 확인할 수 있습니다.
      • <그림> EC2의 VPC ID
        <그림> EC2의 VPC ID
  • IP 풀: 선택하지 않음
  • 가용 영역 및 서브넷: 2개 이상 선택합니다. 선택한 가용 영역(AZ, Availability Zone) 중에 EC2가 소속된 가용 영역이 하나라도 없다면 로드밸런서가 EC2를 찾을 수 없으므로 주의가 필요합니다. EC2의 가용영역은 EC2 인스턴스 정보에서 확인할 수 있습니다.
<그림> ALB 생성 시 네트워크 매핑 설정
<그림> ALB 생성 시 네트워크 매핑 설정
<그림> EC2 인스턴스 - 인스턴스 선택 - 네트워킹 탭에서 확인할 수 있는 EC2 인스턴스의 가용 영역
<그림> EC2 인스턴스 - 인스턴스 선택 - 네트워킹 탭에서 확인할 수 있는 EC2 인스턴스의 가용 영역

5) 로드 밸런서 (ELB) 보안 그룹 설정

💁‍♂️
AWS 용어 소개: 보안 그룹 (Security Group)
EC2나 로드밸런서에 대한 방화벽 역할을 하는 설정으로, 어떤 IP에서 어떤 포트로 접근 가능한지 제어합니다.
다음으로 보안 그룹을 설정합니다.
일반적으로 EC2와 보안 그룹을 공유하기 보다는, ALB용 보안 그룹을 따로 설정하는 것이 안전합니다. 보안 그룹을 생성하려면 “새 보안 그룹을 생성” 링크를 클릭합니다.
  • VPC 정보는 EC2와 일치
  • 인바운드 규칙
    • (선택사항) HTTP - HTTPS로 리디렉션 시키기 위한 용도, 0.0.0.0/0
    • HTTPS: HTTPS 요청을 허용하기 위한 용도, 0.0.0.0/0
  • 아웃바운드 규칙: 기본값 사용
<그림> ALB 생성 시 보안 그룹 설정, “새 보안 그룹을 생성” 링크를 통해 보안 그룹을 쉽게 추가할 수 있음
<그림> ALB 생성 시 보안 그룹 설정, “새 보안 그룹을 생성” 링크를 통해 보안 그룹을 쉽게 추가할 수 있음
<그림> 보안 그룹 생성 화면
<그림> 보안 그룹 생성 화면

6) 로드 밸런서 (ELB) 대상 그룹 설정

💁‍♂️
AWS 용어 소개: 대상 그룹 (Target Group)
로드밸런서가 트래픽을 전달할 대상(예: EC2 인스턴스)을 묶어놓은 그룹입니다. 대상 그룹에 속한 서버들이 실제 요청을 처리하게 됩니다.
다음으로 대상 그룹을 생성합니다.
  • 기본 구성: 인스턴스
    • 로드 밸런서가 받은 요청을 전달(라우팅)할 대상이므로, EC2 인스턴스를 선택해야 합니다.
      • <그림> 대상 그룹 생성 시 대상 유형 선택
        <그림> 대상 그룹 생성 시 대상 유형 선택
  • 대상 그룹 이름: 적절한 이름을 설정
  • 프로토콜 포트: HTTP / 80
  • IP 주소 유형: IPv4
  • VPC: EC2 인스턴스와 동일한 VPC
<그림> 대상 그룹 생성 시 프로토콜 포트, VPC, 프로토콜 버전 설정
<그림> 대상 그룹 생성 시 프로토콜 포트, VPC, 프로토콜 버전 설정
  • 상태검사: HTTP, /
    • 별도로 서버가 동작하는지 체크하기 위한 /api를 추가하는 것이 권장됨, 예) /health
    • <그림> 대상 그룹 생성 시 상태 검사 설정
      <그림> 대상 그룹 생성 시 상태 검사 설정
대상 그룹 생성의 다음 단계에서 EC2 인스턴스를 선택하고 인스턴스를 위한 포트를 설정할 수 있습니다. 보통 HTTP 포트인 80번을 선택할 수도 있지만, 개발용인 경우 3000번 포트를 사용하는 경우도 있습니다.
<그림> 대상 그룹 생성 화면
<그림> 대상 그룹 생성 화면

7) 로드 밸런서 (ELB) 보안 리스너 설정

💁‍♂️
AWS 용어 소개: ACM (AWS Certificate Manager)
HTTPS 통신을 위한 SSL/TLS 인증서를 자동으로 발급·관리해주는 서비스입니다. AWS 리소스에 쉽게 연결할 수 있어 HTTPS 설정이 간편해집니다.
마지막으로 보안 리스너를 설정해야 합니다. ACM에서 인증서를 발급받고 도메인을 설정해야 합니다. 보안 리스너 설정에서 “새 ACM 인증서 요청” 링크를 클릭합니다.
<그림> 보안 리스너 설정 화면
<그림> 보안 리스너 설정 화면
ACM 페이지에서 [인증서 요청] 버튼을 클릭합니다.
<그림> AWS의 ACM 페이지
<그림> AWS의 ACM 페이지
다음으로 퍼블릭 인증서를 요청합니다.
<그림> 인증서 요청 페이지
<그림> 인증서 요청 페이지
다음으로 도메인 이름을 입력합니다. 예를 들어 구매한 도메인이 exmaple.com이고, 서비스할 웹의 도메인이 service.example.com 이라면, 후자인 service.example.com을 입력하고, [요청] 버튼을 누릅니다.
<그림> 퍼블릭 인증서 요청 페이지
<그림> 퍼블릭 인증서 요청 페이지
퍼블릭 인증서가 생성되었으면 CNAME을 Route 53에 등록해야 합니다. AWS Certificate Manager에서 인증서 나열 페이지에 들어가면 생성한 인증서를 볼 수 있습니다.
<그림> ACM의 인증서 나열 페이지
<그림> ACM의 인증서 나열 페이지
현재 생성한 인증서 ID를 클릭하면 인증서 정보를 확인할 수 있는데, 도메인 항목에서 [Route 53에서 레코드 생성] 버튼을 클릭하여 CNAME 레코드를 쉽게 생성할 수 있습니다.
<그림> ACM의 인증서 정보 페이지
<그림> ACM의 인증서 정보 페이지
<그림> ACM에서 DNS 레코드 생성 결과 (성공)
<그림> ACM에서 DNS 레코드 생성 결과 (성공)
위 이미지와 같이 검증 상태가 성공이 되었으면, 다시 로드 밸런서 설정 항목으로 돌아와서 보안 리스너 설정 항목에서 인증서를 선택한 뒤, [로드 밸런서 생성] 버튼을 누릅니다.
notion image

8) Route 53에 레코드 추가 및 레코드를 ELB 연결

💁‍♂️
AWS 용어 소개: Route 53
AWS에서 제공하는 DNS 서비스로, 도메인 이름(www.example.com)을 로드밸런서나 서버 IP와 연결해주는 역할을 합니다.
로드 밸런서 설정이 끝난 다음에 해야 할 일은 레코드를 ELB에 연결하는 것입니다. Route 53 대시보드로 이동하여 [호스팅 영역] 으로 이동합니다.
<그림> Route 53 대시보드
<그림> Route 53 대시보드
호스팅 영역 페이지에서 ELB에 연결할 호스팅 영역 이름을 클릭합니다.
<그림> 호스팅 영역 페이지
<그림> 호스팅 영역 페이지
그리고 레코드를 생성합니다.
  • 레코드 이름: ACM 인증서 생성시 설정한 도메인 이름과 일치해야 합니다. (예: service.example.com )
  • 레코드 유형: A
  • 별칭: 활성화
    • 트래픽 라우팅 대상: Application/Classic Load Blancer
    • 리전: 아시아 태평양(서울)
  • 로드밸런서: 생성해둔 로드밸런서 선택
<그림> 레코드 생성 화면
<그림> 레코드 생성 화면

9) HTTP를 HTTPS로 리다이렉션

먼저 EC2의 로드밸런서 페이지에서 로드밸런서를 선택하고, 리스너 및 규칙 탭을 엽니다. 그리고 [리스너 추가] 버튼을 누릅니다.
<그림> 로드밸런서 페이지
<그림> 로드밸런서 페이지
다음으로 리스너 구성을 다음과 같이 설정하고 [추가] 버튼을 누릅니다.
  • 리스너 구성
    • 프로토콜: HTTP
    • 포트: 80
  • 기본 작업
    • 라우팅 액션: URL로 리디렉션
    • URL로 리디렉션: URI 부분
      • 프로토콜: HTTPS
      • 포트: 433
  • 상태 코드: 301 - 영구 이동됨
<그림> 리스너 추가 페이지
<그림> 리스너 추가 페이지
리스너 추가가 정상적으로 완료되면 HTTP로 접속할 경우, HTTPS로 리다이렉션 됩니다.

맺음말

처음엔 AWS 로드밸런서에서 HTTPS를 설정하는 작업이 막막했지만, 직접 하나씩 따라 해보니 구조가 조금씩 보이기 시작했습니다. 이 글이 AWS에서 웹 서버를 HTTPS로 제공하려는 분들에게 조금이나마 도움이 되었길 바랍니다.

jujeong

관련된 이야기

우리 센터 차별화를 위한 AI 체형분석기, Bodydot Fitness 출시!

제품

우리 센터 차별화를 위한 AI 체형분석기, Bodydot Fitness 출시!