[Auth] mTLS (Mutual TLS): 양방향 인증서 인증
Service Mesh, mTLS, Mutual TLS, client certificate, client cert auth, service mesh mtls, SPIFFE/SPIRE
정의
mTLS (Mutual TLS) 는 서버뿐 아니라 클라이언트도 TLS 인증서로 자기 신분 증명. 일반 TLS = 서버 인증만, mTLS = 양방향.
활용: 서비스 메시 (Istio, Linkerd), 기업 내부 API, 금융 / B2B 통합, IoT 기기.
TLS vs mTLS 흐름
sequenceDiagram
autonumber
participant C as Client
participant S as Server
rect rgb(220,240,220)
Note over C,S: 일반 TLS
C->>S: ClientHello
S-->>C: ServerHello + Certificate
C->>C: 서버 인증서 검증
C-->>S: Finished
end
rect rgb(255,235,220)
Note over C,S: mTLS
C->>S: ClientHello
S-->>C: ServerHello + Certificate<br/>+ CertificateRequest
C->>S: ClientCertificate + Finished
S->>S: 클라이언트 인증서 검증
S-->>C: Finished
end
인증서 발급 흐름
flowchart LR
CA[Root CA] -->|sign| IntCA[Intermediate CA]
IntCA -->|sign| ServerCert[Server Cert]
IntCA -->|sign| ClientCert[Client Cert]
Client -->|보유| ClientCert
Server -->|보유| ServerCert
자세한 인증서 체인은 TLS 참고.
사용 시나리오
1. Service Mesh (Istio, Linkerd, Consul)
flowchart LR
subgraph A[Service A]
AApp[App]
AProxy[Sidecar Envoy]
end
subgraph B[Service B]
BProxy[Sidecar Envoy]
BApp[App]
end
AApp -->|plain HTTP| AProxy
AProxy -->|mTLS auto| BProxy
BProxy -->|plain HTTP| BApp
- 애플리케이션이 mTLS 를 신경 쓰지 않음. Sidecar 가 자동.
- Zero Trust 네트워크의 토대.
2. SPIFFE/SPIRE: 워크로드 신원
SPIFFE ID = spiffe://example.com/ns/prod/sa/web
쿠버네티스 ServiceAccount → SVID (SPIFFE Verifiable Identity Document) → 짧은 mTLS 인증서.
IMPORTANT
수동 인증서 발급/배포 없이 SPIRE 가 자동 회전. 회전 주기는 시간 단위. 침해 시 영향 최소화.
3. 기업 VPN / Zero Trust
- BeyondCorp 류 디바이스 인증 + 사용자 인증.
- 기기 인증서 + 사용자 OIDC.
4. IoT / 디바이스
- 수백만 디바이스 각자 인증서.
- 제조 시점에 발급 (factory cert).
인증서 회전
gantt
title 인증서 라이프사이클
dateFormat YYYY-MM-DD
section Cert
유효기간 1: 2026-01-01, 90d
유효기간 2 (회전): active, 2026-03-15, 90d
유효기간 3 (회전): 2026-06-01, 90d
| 회전 주기 | 적합 |
|---|---|
| 1년 | legacy 시스템 |
| 90일 | Let’s Encrypt 표준 |
| 24시간 | 짧은 SVID (SPIFFE) |
| 1시간 | 고보안 환경 |
짧을수록 침해 영향 최소화. 자동화 없으면 운영 불가.
OAuth + mTLS (RFC 8705)
OAuth 의 client_credentials 에서 client_secret 대신 client cert. 큰 기업 / 금융 API.
sequenceDiagram
Service A->>Auth: POST /token<br/>(mTLS client cert)<br/>grant_type=client_credentials
Auth->>Auth: cert 검증
Auth-->>Service A: access_token (cnf claim 에 cert hash)
Service A->>Service B: Bearer <token><br/>(mTLS, 같은 cert)
Service B->>Service B: token 의 cnf == cert hash?
Service B-->>Service A: 자원
흔한 함정
WARNING
- 인증서 만료 사고 = 자동화 없으면 언젠가는 만료 → 서비스 다운. 모니터링 + 자동 갱신 필수.
- 인증서 회전과 사용 동시 = 회전 직후 옛 인증서로 검증 실패. grace period 필요.
- CRL (Certificate Revocation List) 의 체크 누락 = 침해 인증서가 수개월 유효. 짧은 인증서 (SPIFFE) 가 현실적 답.
- mTLS 끝점에 L7 LB = TLS 종료 시점에 클라이언트 인증서 정보 손실.
X-Forwarded-Client-Cert같은 헤더로 전달 또는 passthrough LB.
인증서 형식
| 형식 | 의미 |
|---|---|
.crt / .pem | base64 인코딩 X.509 (텍스트) |
.der | binary DER |
.p7b / .p7c | PKCS#7 (체인 포함) |
.pfx / .p12 | PKCS#12 (인증서 + private key) |
.key | private key 만 |
관련 위키
- TLS
- OAuth2
- Service Mesh (Istio, Linkerd)
- Kubernetes RBAC
이 글의 용어 (3개)
- [Auth] OAuth 2.0 / 2.1: Authorization Code + PKCEauth-security
- 정의 OAuth 2.0 (RFC 6749, 2012) 은 제3자 앱이 사용자 동의로 자원에 접근 하게 하는 권한 위임 프레임워크. 인증 (authentication) 이 아니라 …
- [K8s] RBAC: Role, ClusterRole, ServiceAccount, RoleBindingkubernetes
- 정의 RBAC (Role-Based Access Control) = K8s 의 권한 부여 모델. 주체 + 권한 + 바인딩. 4 객체 | 객체 | 범위 | |---|---| | |…
- TLS / SSLnetwork
- 정의 TLS (Transport Layer Security)는 (또는 위 ) 위에서 동작하는 암호화·인증 프로토콜이다. SSL 은 TLS 의 전신 (Netscape 1995, 더…
이 개념을 다룬 위키 페이지 (6)
- wiki[Auth] OAuth 2.0 / 2.1: Authorization Code + PKCE
- wiki[Concurrency] Circuit Breaker: cascade failure 방어
- wiki[Pattern] API Gateway: BFF, 라우팅, auth, rate limit
- wiki[Pattern] Microservices vs Monolith: 언제 분리, 언제 통합
- wiki[K8s] NetworkPolicy: pod 간 네트워크 차단
- wiki[K8s] RBAC: Role, ClusterRole, ServiceAccount, RoleBinding
💬 댓글