Kubernetes(쿠버네티스)를 활용해 인프라를 구성하다 보면, HTTPS 보안 연결 설정은 필수입니다.
특히 Ingress Controller와 L7 Load Balancer(계층 7 로드 밸런서)를 함께 사용하는 구조에서는 SSL 인증서 처리 위치를 명확히 하는 것이 중요하죠.
이 글에서는 SSL Offloading이란 무엇인지, 그리고 Ingress + L7 LB 구조에서 SSL Offloading을 어떻게 구성해야 하는지를 초보자 눈높이에서 자세히 설명합니다.
목 차
SSL Offloading이란?
SSL Offloading은 HTTPS 통신을 Ingress Controller나 애플리케이션 서버가 아닌, 외부의 L7 Load Balancer에서 처리하는 방식입니다.
즉, 클라이언트가 HTTPS로 요청을 보내면 L7 LB가 이를 받아서 SSL 인증서를 기준으로 복호화하고, 내부에는 HTTP 요청으로 전달하는 구조입니다.
사용 이유
- 각 애플리케이션 서버에 SSL 인증서를 따로 설치할 필요가 없습니다.
- 인증서 갱신, 관리가 한 곳(LB)에서만 가능해집니다.
- 암호화/복호화 과정이 로드 밸런서에서 끝나므로 성능 저하를 방지할 수 있습니다.
Ingress + L7 LB 구조 이해하기
Ingress Controller는 Kubernetes 클러스터 내부에서 외부 트래픽을 적절한 서비스로 라우팅해주는 역할을 합니다.
하지만 클라이언트의 HTTPS 요청을 그대로 받아 처리하려면 인증서 관리, TLS 설정 등이 복잡해집니다.
그래서 많은 기업 환경에서는 Ingress 앞단에 L7 Load Balancer를 두고, 그곳에서 HTTPS 처리를 끝내고 내부에는 HTTP로만 보내는 SSL Offloading 구조를 사용합니다.
구조 예시:
- 클라이언트 → HTTPS 요청 → L7 LB (SSL Termination)
- L7 LB → HTTP 요청 → Ingress Controller (NGINX 등)
- Ingress → Kubernetes 서비스 → 애플리케이션 파드
이때 중요한 것은, L7 LB가 SSL 처리를 마쳤다는 것을 Ingress에 알려주기 위해 특정 헤더를 함께 전달해야 한다는 점입니다.
주요 헤더:
- X-Forwarded-Proto: https
- X-Forwarded-For: 실제 클라이언트 IP
이 헤더가 없으면 Ingress나 백엔드 앱은 “지금이 HTTPS 요청인지” 알 수 없습니다.
SSL Offloading 설정 단계별 가이드
(1) L7 Load Balancer에 인증서 설치
AWS의 ALB, GCP의 HTTPS LB, Azure의 App Gateway 모두 자체적으로 인증서를 설정할 수 있는 기능을 제공합니다.
Let's Encrypt 인증서를 직접 발급해서 적용해도 됩니다.
(2) Ingress Controller는 HTTP 포트만 열기
Ingress Controller(NGINX 기준)는 HTTPS를 처리하지 않도록 설정하고, HTTP(80번 포트)만 리스닝하도록 설정합니다.
보통 Helm Chart나 Deployment 설정 파일에서 --http만 활성화합니다.
(3) Ingress 리소스에서 ssl-redirect 비활성화
기본적으로 NGINX Ingress는 HTTP 요청을 HTTPS로 리디렉션하려고 합니다.
SSL Offloading 구조에서는 이것이 무한 리디렉션을 유발할 수 있으므로, 반드시 아래와 같이 비활성화합니다.
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
(4) 헤더 전달 확인
L7 Load Balancer에서 반드시 X-Forwarded-Proto와 X-Forwarded-For 헤더를 전달하도록 설정해야 합니다.
Ingress Controller는 이 값을 바탕으로 트래픽을 판단하고, 백엔드 애플리케이션도 이를 기준으로 리디렉션 또는 보안 관련 로직을 수행합니다.
자주 발생하는 문제와 해결법
(1) 무한 리디렉션 발생
Ingress 리소스에서 ssl-redirect를 비활성화하지 않으면 HTTP → HTTPS 리디렉션이 계속 발생합니다.
이 구조에서는 반드시 ssl-redirect를 false로 설정해야 합니다.
(2) 클라이언트 IP가 사라짐
모든 요청의 IP가 L7 LB IP로만 보이는 경우, X-Forwarded-For 헤더를 전달하지 않았거나 Ingress에서 해당 헤더를 무시하고 있을 가능성이 높습니다. ingress controller의 config 내용을 확인합니다.
controller:
config:
use-forwarded-headers: "true"
(3) HTTPS인지 인식 못함
X-Forwarded-Proto 헤더가 누락되었거나 백엔드 애플리케이션이 이를 읽지 않는 경우 발생합니다.
Spring Boot, Express.js, Django 등에서는 해당 헤더를 명시적으로 읽도록 설정이 필요합니다.
요약 정리
SSL Offloading은 로드 밸런서가 HTTPS를 처리하고, 내부로는 HTTP로 요청을 전달하는 방식입니다.
이 구조를 사용하면 보안성과 운영 효율성을 동시에 잡을 수 있습니다.
필수 설정 요약:
- Ingress에 ssl-redirect: false
- L7 LB에서 X-Forwarded-* 헤더 전달
- 애플리케이션이 헤더를 읽도록 구성
이 구성을 제대로 이해하고 적용하면, 보안은 물론이고 운영 안정성까지 챙길 수 있습니다.
'쿠버네티스' 카테고리의 다른 글
Kubernetes에서 노드 삭제 시 발생하는 서비스 지연 현상 (0) | 2025.04.14 |
---|---|
CoreDNS 운영 Best Practice 8가지 (0) | 2025.04.14 |
pause image 총 정리 - failed to pull image "registry.k8s.io/pause:3.9" (0) | 2025.04.02 |
Kubernetes에서 Object Storage 사용하는 법: S3 연동부터 코드 예시까지 (0) | 2025.03.25 |
Kubernetes Multi Cluster (0) | 2025.03.24 |