본문 바로가기

Technical architecture/Kubernetes

Kubernetes로 대용량 오픈소스 웹 상용화하기 ⑤: 보안 강화를 위한 인증서(Certificate) 관리

Kubernetes로 대용량 오픈소스 웹 상용화하기 시리즈 목차

  1. 대용량 트래픽을 고려한 오픈소스 선정 및 분석
  2. 컨테이너화와 Kubernetes 리소스 관리 (Pod, Deployment, StatefulSet)
  3. Helm chart로 Kubernetes에 오픈 소스 웹 배포하기
  4. Kubernetes 서비스(Service) 및 Ingress 관리 (HTTP 및 gRPC 프로토콜 이해)
  5. 보안 강화를 위한 인증서(Certificate) 관리
  6. 서비스 안정성을 위한 튜닝(성능테스트, HA 구성, 리소스 최적화)

 

2025.07.27 - [Technical architecture/Kubernetes] - Kubernetes로 대용량 오픈소스 웹 상용화하기 ④: Ingress로 외부통신 설정하기

 

Kubernetes로 대용량 오픈소스 웹 상용화하기 ④: Ingress로 외부통신 설정하기

외부 IP를 DNS 레코드(A레코드)에 등록합니다.Kubernetes로 대용량 오픈소스 웹 상용화하기 시리즈 목차대용량 트래픽을 고려한 오픈소스 선정 및 분석컨테이너화와 Kubernetes 리소스 관리 (Pod, Deploymen

develiro.tistory.com

 

1. HTTPS와 인증서(Certificate) 기본 개념

웹 서비스에서 HTTPS는 단순한 보안 옵션이 아니라 필수 요소입니다.
HTTPS는 TLS(Transport Layer Security) 또는 SSL(Secure Sockets Layer) 프로토콜을 기반으로 클라이언트와 서버 간의 통신을 암호화합니다. 이를 통해 중간자 공격(MITM), 패킷 스니핑 등의 보안 위협을 예방할 수 있습니다.

인증서(Certificate) 는 다음과 같은 구성 요소로 이루어집니다.

  • 공개키(Public Key): 데이터를 암호화하는 데 사용
  • 개인키(Private Key): 암호를 해독하는 데 사용 (절대 외부에 노출 금지)
  • CA 서명(CA Signature): 신뢰할 수 있는 인증기관이 해당 도메인의 소유권과 유효성을 보증한 서명

인증서 종류

  • Self-signed: 자체 서명, 테스트/개발 환경에서 사용
  • Public CA: 공인 인증기관(CA) 서명, 상용 환경에서 사용

2. 인증서 구성 요소와 역할

실제 인증기관(CA)에서 발급받으면, 보통 아래와 같은 파일을 받게 됩니다.

파일명 실질적 역할 비유
Chain_RootCA_Bundle Intermediate CA + Root CA 묶음 → 서버 인증서를 신뢰할 수 있게 해주는 다리 역할 (“내가 인증기관의 Root CA와 연결되어 있음!”) “이 서버는 믿을 수 있어! (내가 Root CA랑 연결돼 있어)”
cert.pem 서버 인증서(Leaf Certificate), 도메인 소유 증명 (예: CN=test.langfuse.com) “나는 test.langfuse.com 주인이다”
key.pem 서버 인증서의 개인키 (HTTPS 암호화에 사용) 금고 열쇠
 

💡 Ingress에서의 파일 매핑

  • tls.crt → fullchain.crt = cert.pem + Chain_RootCA_Bundle (서버 인증서 + 신뢰 사다리 묶음)
  • tls.key → key.pem (개인키)

즉, Ingress는 tls.crt와 tls.key 두 가지를 가지고 있어야만
클라이언트와 안전하게 대화(HTTPS 연결)할 수 있습니다.


3. Ingress 요청 흐름 예시

 
[ ACA 컨테이너 ]
    |
    |   🔒 HTTPS 요청
    V
[ Langfuse Ingress (Nginx 등) ]
    |
    |--- tls.crt = fullchain.crt
    |       ├ cert.pem (Leaf: test.langfuse.com)
    |       └ rootca.crt (Intermediate CA)
    |
    |--- tls.key = key.pem (Leaf Private Key)

작동 원리

  1. 사용자가 https://test.langfuse.com에 접속하면 브라우저가 서버에게 인증서 정보를 요청합니다.
  2. Ingress는 tls.crt(인증서)와 tls.key(개인키)를 사용해 TLS Handshake를 수행합니다.
  3. 브라우저는 cert.pem → Intermediate CA → Root CA 순서로 올라가며
    “이 인증서가 진짜 믿을 수 있는 곳에서 왔는지” 검증합니다.
  4. 검증이 끝나면 HTTPS 암호화 통신이 시작됩니다.

 

4. 상용 환경: 공인 인증서 발급 및 관리

상용 서비스에서는 반드시 공인 인증기관(CA)에서 발급한 인증서를 사용해야 합니다.
한국에서는 다음과 같은 기관이 대표적입니다.

  • 한국정보인증
  • 한국전자인증
  • Comodo, GlobalSign, DigiCert 등 글로벌 CA

발급 절차

  1. 발급 신청: 사업자 등록증, 도메인 소유 증명서 제출
  2. 검증 절차: 인증기관에서 사업자 정보와 도메인 소유권 확인
  3. 발급 완료: .crt(인증서)와 .key(개인키) 파일 수령
  4. Kubernetes Secret 생성
kubectl create secret tls my-tls-secret \
  --cert=path/to/tls.crt \
  --key=path/to/tls.key \
  -n my-namespace

갱신 주기 및 비용

  • 갱신 주기: 보통 1년 단위(일부 기관은 2년 지원)
  • 비용: 단일 도메인 약 20만~40만 원/년, 멀티도메인·와일드카드는 더 비쌈
  • 운영 팁: 만료 30~60일 전에 갱신 프로세스 실행, 발급기관 알림 설정 필수

5. 개발 환경: Self-signed 인증서 발급

개발·테스트 환경에서는 비용이 들지 않는 Self-signed 인증서를 사용하면 됩니다.

OpenSSL로 Self-signed 인증서 생성

# 개인키 생성
openssl genrsa -out tls.key 2048

# 인증서 생성 (365일 유효)
openssl req -x509 -new -nodes -key tls.key -sha256 -days 365 \
  -out tls.crt \
  -subj "/CN=example.local/O=MyOrg"

 

저는 아래 글을 보고 만들었습니다. 순서대로 따라하면 

https://goldsony.tistory.com/223

Secret 생성

kubectl create secret tls my-tls-secret \
  --cert=tls.crt \
  --key=tls.key \
  -n my-namespace

브라우저 신뢰 설정

  • 로컬에서 테스트 시, 생성된 인증서를 OS 또는 브라우저의 신뢰 저장소에 추가해야 “보안 경고”가 사라집니다.
  • macOS의 경우 Keychain Access → System → 인증서 추가 후 “Always Trust” 설정

6. Ingress에서 HTTPS 적용

NGINX Ingress Controller를 사용한다고 가정하면, TLS 적용은 다음과 같이 설정합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-service-ingress
  namespace: my-namespace
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
    - hosts:
        - test.langfuse.com
      secretName: my-tls-secret
  rules:
    - host: test.langfuse.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80
 

💡 SNI 기반 다중 인증서
여러 도메인을 한 Ingress로 처리할 경우, tls 블록을 여러 개 정의하여 각각 다른 인증서 Secret을 적용할 수 있습니다.


7. 운영 팁 & 모니터링

  • 인증서 상태 확인
kubectl describe certificate my-cert -n my-namespace
  • 만료 모니터링
    Prometheus + Alertmanager를 사용하면 인증서 만료 30일 전 알림 발송 가능
  • 와일드카드 인증서
    서브도메인이 많은 서비스에서는 *.example.com 와일드카드 인증서를 고려

마무리

이번 글에서는 상용 환경과 개발 환경에서 인증서를 발급하는 방법, 그리고 Ingress에 HTTPS를 적용하는 과정을 살펴봤습니다.
다음 글에서는 서비스 안정성을 위한 Kubernetes 환경 튜닝HA(고가용성) 구성을 다뤄보겠습니다.