Load Balancer에 SSL/TLS 설정하기

김유경·2025년 6월 8일

들어가며

이 글에서는 카카오클라우드 로드밸런서와 Let’s Encrypt를 활용해 SSL/TLS를 구성하고, HTTPS로 서비스하는 과정을 정리했습니다.

💡 그렇다면 SSL/TLS란 무엇일까?

SSL(Secure Sockets Layer)과 TLS(Transport Layer Security)는 인터넷 데이터를 암호화하여 도청이나 위조를 방지하는 보안 프로토콜입니다. 우리가 자주 접하는 HTTPS는 이 SSL/TLS 위에서 동작하며, 웹에서 안전한 통신을 보장하는 데 사용됩니다.


목표 아키텍처

User → DNS → ALB (SSL 터미네이션) → 백엔드 서버 (HTTP)

💡 왜 이렇게 구성했을까?

  • SSL 처리를 ALB에서 담당하여 백엔드 서버는 기존 HTTP 설정 그대로 유지
  • 백엔드 수정 없이 HTTPS 보안 적용 가능
  • 인증서 관리를 ALB에 집중시켜 중앙화된 인증서 운영

두 개의 독립적인 서비스 구성

  • web.playus.o-r.kr → 정적 리소스를 서빙하는 웹 전용 ALB
  • api.playus.o-r.kr → API 요청을 처리하는 백엔드 전용 ALB

1. 도메인 설정

내도메인.한국에서 다음과 같이 설정하였습니다.

  • .playus.o-r.kr → https://web.playus.o-r.kr (웹포워딩)
  • web.playus.o-r.kr → 웹 ALB의 공인 IP (A 레코드)
  • api.playus.o-r.kr → WAS ALB의 공인 IP (A 레코드)

2. Let's Encrypt 인증서 발급

1) Certbot 설치

brew install certbot

‼️ Certbot은 Let’s Encrypt에서 제공하는 무료 오픈소스 도구로, TLS 인증서의 발급과 갱신을 자동화할 수 있습니다. 루트 도메인, 특정 서브도메인, 와일드카드(*.example.com) 인증서까지 모두 무료로 발급할 수 있으며, 유효기간은 90일, 갱신은 만료 30일 전부터 무제한 가능합니다.

2) 인증 방식

  • webroot: 웹 서버의 특정 디렉토리에 파일을 업로드하여 인증
  • webserver: Apache/Nginx 등의 웹 서버 설정을 자동으로 변경해 인증
  • standalone: 임시로 웹 서버를 띄워 인증
  • DNS: 도메인의 DNS 설정에 TXT 레코드를 추가하여 인증

✨ 저는 여러 서브도메인을 사용하고 있어, 하나의 인증서로 모든 서브도메인을 커버할 수 있는 DNS 방식을 선택했습니다.

3) 인증서 발급 명령어

sudo certbot certonly --manual --preferred-challenges=dns \
  -d "*.playus.o-r.kr" -d "playus.o-r.kr"
  • certonly 인증서만 발급
  • --manual 수동 인증 (DNS 설정을 직접 입력)
  • --preferred-challenges=dns DNS 방식으로 소유권 인증
  • -d "*.playus.o-r.kr" 모든 서브도메인을 포함
  • -d "playus.o-r.kr" 루트 도메인도 포함

certbot 실행 중 아래와 같이 이메일 입력을 요청받습니다

Enter email address or hit Enter to skip.
(Enter 'c' to cancel):

이메일 주소 용도

  • 인증서 만료 알림 (90일 주기)
  • 보안 관련 공지
  • Let’s Encrypt 정책 변경 안내

4) DNS TXT 레코드 추가

_acme-challenge.playus.o-r.kr TXT "인증 문자열"

🥳 발급 완료!

5) 발급된 파일 위치

/etc/letsencrypt/live/playus.o-r.kr/
├── fullchain.pem  (인증서)
├── privkey.pem    (개인키)
├── cert.pem
└── chain.pem

3. 카카오 클라우드 Certificate Manager 업로드

  • 인증서 프라이빗 키 privkey.pem 내용 전체 복사
  • 인증서 본문 fullchain.pem 내용 전체 복사
sudo ls -la /etc/letsencrypt/live/playus.o-r.kr/
sudo cat /etc/letsencrypt/live/playus.o-r.kr/privkey.pem
sudo cat /etc/letsencrypt/live/playus.o-r.kr/fullchain.pem

4. 문제 발생: ECC 인증서 미지원

카카오클라우드에 인증서를 등록하는 과정에서 다음과 같은 오류가 발생했습니다.

SSL 인증서의 키 길이가 보안 요구 사항을 충족하지 않습니다.
최소 길이는 2048 이상이어야 합니다.

🚨 Let’s Encrypt 기본 설정이 ECC(Elliptic Curve) 기반 인증서이기 때문이며, 카카오클라우드는 현재 RSA 2048bit 이상만 지원합니다.

5. 해결 방법

1) 기존 인증서 삭제

sudo rm -rf /etc/letsencrypt/live/playus.o-r.kr/
sudo rm -rf /etc/letsencrypt/archive/playus.o-r.kr/
sudo rm -rf /etc/letsencrypt/renewal/playus.o-r.kr.conf

2) RSA 2048 인증서로 재발급

sudo certbot certonly --manual --preferred-challenges=dns \
  --key-type rsa --rsa-key-size 2048 \
  -d "*.playus.o-r.kr" -d "playus.o-r.kr"

‼️ --key-type rsa --rsa-key-size 2048 옵션을 반드시 포함해야 합니다.

3) 인증서 업로드

인증서 본문에는 다음 두 인증서를 모두 포함해야 합니다.

  • 서버 인증서 (*.playus.o-r.kr)
  • 중간 CA 인증서 (Let’s Encrypt R10)

fullchain.pem 파일에는 이 두 가지가 이미 모두 포함되어 있으므로 그 내용을 그대로 복사해서 인증서 본문에 넣으면 됩니다.

-----BEGIN CERTIFICATE-----
[서버 인증서]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[중간 CA 인증서]
-----END CERTIFICATE-----

프라이빗 키에는 privkey.pem 내용 전체를 입력합니다.

-----BEGIN PRIVATE KEY-----
[privkey.pem 내용]
-----END PRIVATE KEY-----

인증서 체인은 본문에 포함되어 있기 때문에 비워도 무방합니다.

인증서 신뢰 구조

Root CA (브라우저 내장)
    ↓ 신뢰
Intermediate CA (Let's Encrypt R10)
    ↓ 신뢰
Server Certificate (*.playus.o-r.kr)
    ↓ 검증
사용자 브라우저 또는 클라이언트

적용 결과

외부: https://web.playus.o-r.kr
 ↓ (HTTPS)
ALB: SSL 처리
 ↓ (HTTP)
백엔드: [프라이빗 IP]:80 (기존 HTTP 그대로)

6. HTTPS 리스너 생성

카카오 클라우드 ALB에서 다음과 같이 HTTPS 리스너를 추가합니다.

설정 항목

- Protocol: HTTPS
- Port: 443
- SSL Certificate: 등록한 인증서 선택
- Backend Set: 기존 HTTP 백엔드 셋 연결

0개의 댓글