--insecure 옵션을 통한 무한 리다이렉션 문제 해결기
ArgoCD를 사용하면서 Web UI 접속이 이상하게 계속 리다이렉션 되는 상황을 겪은 적이 있다.
기존 LoadBalancer 타입으로 배포된 argocd-server를 ClusterIP로 바꾸고, Gateway API에 노출하는 과정에서 발생한 일이었다.
URL은 정확한데, 브라우저는 /auth/login으로 계속 튕기고, 로그를 봐도 인증 자체는 성공한 듯 보이는데 진입하지 못했다.
*.minseoky.me (dns01 wildcard 사용)argocd-server 를 ClusterIP로 운영Gateway 및 HttpRoute 설정은 다음과 같이 구성했다:
minseoky-gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: minseoky-gateway
namespace: istio-system
spec:
gatewayClassName: istio
listeners:
- name: https
protocol: HTTPS
port: 443
tls:
mode: Terminate
certificateRefs:
- kind: Secret
group: ''
name: wildcard-minseoky-me
namespace: cert-manager
allowedRoutes:
namespaces:
from: All
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
argocd-route.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: argocd-route
namespace: istio-system
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: minseoky-gateway
namespace: istio-system
hostnames:
- argocd.minseoky.me
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- group: ""
kind: Service
name: argocd-server
namespace: argocd
port: 80
weight: 1
정확한 문제 상황 설명 이전에, 내 환경 이야기를 먼저 서술해야 할 것 같다. 비용문제로, 나는 클라우드 대신 온프레미스 홈 서버를 사용중이다.

각 IP는 다음과 같다:
우리집 공유기 공인 IP: A.A.A.A
masternode01: 172.30.1.101
masternode02: 172.30.1.102
masternode03: 172.30.1.103
workernode01: 172.30.1.111
workernode02: 172.30.1.112
workernode03: 172.30.1.113
gateway api: 172.30.1.230
그리고 A.A.A.A의 80, 443 번 포트로 들어온 트래픽을 172.30.1.230으로 포트포워딩 해주고 있었다.
cert-manager 에 의해 인증서가 발급되고, TLS Termination은 minseoky-gateway에서 발생하고 있었다. 그 이후에 트래픽이 argocd-server에 전달되도록 구성했다.
문제 상황은 이렇다. argocd.minseoky.me 접근시, http://argocd.minseoky.me -> https://argocd.minseoky.me -> https://argocd.minseoky.me -> https://argocd.minseoky.me -> https://argocd.minseoky.me -> ...(무한 반복)
결국 Too many redirection 오류로, 접근이 되질 않았다.
ArgoCD는 설치 직후 기본적으로 HTTPS를 사용하도록 설정되어 있다. 이는 사용자의 인증 정보, 세션 토큰 등이 네트워크 상에서 노출되지 않도록 하기 위한 보안상의 기본 설정이다. ArgoCD의 argocd-server는 다음과 같은 방식으로 HTTPS를 지원한다:
이 설정은 로컬 환경 또는 테스트 환경에서는 편의성을 제공하지만, 실제 운영 환경에서는 self-signed 인증서 대신 신뢰할 수 있는 **CA 기반 인증서(Let's Encrypt 등)**로 교체하거나, TLS를 Gateway에서 종료시키는 방식으로 리디렉션 문제를 해결해야 한다.
만약 --insecure 옵션을 제거한 채 사용하고자 한다면, 다음을 반드시 고려해야 한다:
argocd-server에 적절한 TLS 인증서(예: wildcard 인증서)를 수동으로 주입해야 한다 (argocd-secret 이름의 Secret 리소스로 관리됨)argocd-server가 HTTPS를 직접 처리하도록 해야 한다이처럼 기본 HTTPS 리다이렉션은 보안을 위한 기본 동작이지만, Istio Gateway 같은 중간 계층에서 TLS를 처리하는 환경에서는 오히려 이 동작이 충돌을 일으킬 수 있다.
처음 발생한 문제는 클라이언트가 HTTPS로 접속하고, Istio Gateway에서 TLS를 Terminate한 후 HTTP로 전달되었지만, argocd-server는 여전히 HTTPS로 리다이렉션을 시도하면서 발생한 무한 리다이렉션 루프였다.
이때 --insecure 옵션이 해결책이 되었다. 이 옵션은 다음과 같은 방식으로 작동한다:
argocd-server가 HTTPS를 리스닝하지 않고, HTTP로만 리스닝하게 만든다.argocd-server의 8080 포트로 전달되어 정상 처리된다.helm으로 배포한 argocd 에 대한 values.yaml 예시를 아래에 첨부한다.
server:
service:
type: ClusterIP
extraArgs:
- --insecure # ✅ insecure 옵션 추가
configs:
cm:
kustomize.buildOptions: "--enable-helm"
argocd-server는 --insecure 옵션으로 HTTP만 리스닝하고 HTTPS 리다이렉션을 수행하지 않음/auth/login 루프 없이 UI가 정상적으로 렌더링됨💡 TLS Termination이란?
TLS Termination은 클라이언트와 서버 간 통신에서 TLS(HTTPS) 세션을 **중간 프록시(예: Istio Gateway)**가 종료시키고, 이후 트래픽을 HTTP로 내부 서비스에 전달하는 구조를 의미한다. 보통 다음과 같은 목적에서 사용된다:
- 클러스터 내부 통신 단순화 (모든 서비스가 TLS를 직접 처리하지 않아도 됨)
- 통합 인증서 관리
- 로드밸런서와 연동된 외부 접근 제어
TLS Termination이 발생하면, 서비스 단에서는 반드시
X-Forwarded-Proto,X-Forwarded-For,X-Forwarded-Host등의 헤더를 참고하여 "실제 클라이언트가 HTTPS로 접근했는지" 판단해야 한다. ZeroTrust 를 지향하는 경우,,, 클러스터의 내부 트래픽도 모두 암호화해야하기 때문에 Termination이 아닌 PassThrough 옵션을 사용해야 할 것이다.
이 문제를 해결하기 위해서는 다음과 같은 구성이 필요했다:
argocd-server에는 --insecure 옵션을 추가하여 HTTP로만 요청을 처리하게 만들고