안녕하세요! 오늘은 쿠버네티스 서비스 메시의 표준, Istio(이스티오)를 다룰 때 가장 중요하면서도 헷갈리기 쉬운 Gateway의 TLS 모드에 대해 이야기해보려 합니다.
외부의 트래픽을 우리 클러스터로 안전하게 받아들이기 위해서는 보안 연결(HTTPS)이 필수적인데요. Istio Gateway에서는 이 보안 레벨을 어떻게 조정할까요?
가장 많이 사용되는 SIMPLE 모드와 MUTUAL 모드의 차이점, 그리고 설정 과정에서 자주 겪는 CLI 에러 해결법까지 아주 상세하게 파헤쳐 보겠습니다. 🚀

1. 잠깐! 시크릿 생성하다가 에러 나셨나요? 🚨
Istio 게이트웨이에 인증서를 적용하려면 먼저 쿠버네티스 Secret을 만들어야 합니다. 그런데 아래와 같은 에러를 만나는 경우가 종종 있습니다.
error: flag needs an argument: --from-file
bash: tls.crt=/root/certificates/booking.example.com.crt: No such file or directory
이것은 보통 명령어가 길어질 때 줄바꿈(Enter) 처리를 잘못해서 발생합니다. 터미널은 백슬래시(\) 없이 줄을 바꾸면 명령어가 끝난 줄 알고 실행해버리기 때문이죠.
✅ 올바른 해결법
옵션들을 한 줄에 쓰거나, 줄을 바꿀 때 꼭 \를 붙여주세요. 특히 mTLS를 위해서는 CA 인증서(ca.crt)도 함께 넣어야 한다는 점을 잊지 마세요!
# mTLS용 시크릿 생성 예시 (한 줄로 깔끔하게!)
kubectl create secret generic booking-credential-mutual -n istio-system \
--from-file=ca.crt=/root/certificates/example.com.crt \
--from-file=tls.crt=/root/certificates/booking.example.com.crt \
--from-file=tls.key=/root/certificates/booking.example.com.key
자, 이제 재료(인증서)가 준비되었으니 요리(TLS 모드 설정)를 시작해볼까요? 👨🍳
2. mode: SIMPLE (단방향 TLS) 🌐
SIMPLE 모드는 우리가 흔히 인터넷 서핑을 할 때 만나는 표준 HTTPS 방식입니다.
💡 동작 원리
이 방식은 "서버(Gateway)만 신분증을 제시"합니다.
- Client(사용자) ➡️ Gateway: "접속 좀 할게요."
- Gateway ➡️ Client: "네, 제가 바로 그 사이트(Server) 맞습니다. 제 인증서 확인해보세요." 📜
- Client: "음, 믿을만한 기관(CA)에서 발급해줬군. 합격!" ✅
- 🔒 암호화 통신 시작
🎯 특징 및 용도
- 게이트웨이는 클라이언트가 누구인지 검사하지 않습니다. (누구나 접속 가능)
- 용도: 일반적인 웹 서비스, 쇼핑몰, 블로그 등 대중에게 공개된 서비스.
📝 YAML 설정 예시
서버의 인증서와 키가 담긴 시크릿(credentialName)만 지정하면 됩니다.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: my-simple-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "example.com"
tls:
mode: SIMPLE # 👈 여기!
credentialName: booking-credential # 서버 인증서(tls.crt, tls.key)만 있으면 됨
3. mode: MUTUAL (양방향 TLS / mTLS) 🤝
MUTUAL 모드는 보안이 훨씬 강화된 방식입니다. 이름 그대로 "서로(Mutual)" 인증합니다. 흔히 mTLS라고 부릅니다.
💡 동작 원리
이 방식은 "서버와 클라이언트 모두 신분증을 교환"합니다.
- Client ➡️ Gateway: "접속 요청!"
- Gateway ➡️ Client: "일단 제 신분증(Server Cert) 확인하시고요." 📜
- Gateway ➡️ Client: "근데 당신은 누구죠? 당신 신분증(Client Cert)도 보여주세요." 👮♂️
- Client ➡️ Gateway: "여기 제 인증서입니다." 🪪
- Gateway: (가지고 있는 CA 인증서로 검증) "오, 우리 회사 파트너 맞네요. 통과!" ✅
- 🔒 양방향 암호화 통신 시작
🎯 특징 및 용도
- 클라이언트도 반드시 유효한 인증서가 있어야 접속이 가능합니다. (없으면 400 에러 등으로 거부됨)
- 용도: 금융권 API, 파트너사 전용 시스템, 내부 관리자 페이지, IoT 기기 통신 등 신뢰된 대상만 접속해야 할 때.
📝 YAML 설정 예시
여기서는 서버 인증서뿐만 아니라, 클라이언트를 검증할 CA 인증서가 시크릿에 반드시 포함되어 있어야 합니다.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: my-mutual-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "booking.example.com"
tls:
mode: MUTUAL # 👈 강력한 보안!
credentialName: booking-credential-mutual # 여기엔 ca.crt가 필수 포함!
4. 한눈에 요약하기 📊
| 구분 | SIMPLE (단방향) | MUTUAL (양방향) |
|---|---|---|
| 인증 주체 | 클라이언트가 서버를 검증 | 서로가 상대방을 검증 |
| 클라이언트 준비물 | 없음 (브라우저만 있으면 됨) | 클라이언트 인증서(Client Cert) |
| 게이트웨이 준비물 | 서버 인증서 + 키 | 서버 인증서 + 키 + CA 인증서 |
| 보안 강도 | 보통 (데이터 암호화) | 최상 (데이터 암호화 + 접근 제어) |
| 추천 시나리오 | 퍼블릭 웹사이트 | 보안이 중요한 내부/B2B 시스템 |
🏁 마치며
Istio를 도입하는 큰 이유 중 하나가 바로 이 강력한 보안 기능 때문입니다.
- 일반 사용자에게 서비스한다면 👉 SIMPLE
- 검증된 시스템끼리만 통신해야 한다면 👉 MUTUAL
이 두 가지를 상황에 맞게 골라 쓰는 것이 Istio 보안의 첫걸음입니다. 오늘 정리한 내용이 여러분의 안전한 클러스터 구축에 도움이 되기를 바랍니다! 읽어주셔서 감사합니다. 😊
'클라우드 > Istio' 카테고리의 다른 글
| [Istio] 우리 집 문단속하기 🚪: 외부 트래픽 전면 차단과 허용 (ALLOW_ANY vs REGISTRY_ONLY) (0) | 2025.11.29 |
|---|---|
| [Istio] 암호화된 트래픽을 열어보지도 않고 라우팅하는 비결: SNI와 PASSTHROUGH 모드 🔒🚦 (0) | 2025.11.29 |
| [Istio] 트래픽 관리의 핵심, 로드밸런서(Load Balancer) 설정 완벽 가이드 🚦 (0) | 2025.11.29 |
| 🚨 서버가 아픈데 트래픽을 계속 보내시나요? Istio Outlier Detection의 숨겨진 비밀 (0) | 2025.11.28 |
| 마이크로서비스에 '신분증'이 필요하다고? Istio가 SPIFFE를 선택한 진짜 이유 🕵️♂️ (0) | 2025.11.28 |