2026-02-13 9:30 AM
Kubernetes에서 OIDC(OpenID Connect) 기반 사용자 인증을 붙일 때, 많은 분들이 kube-apiserver에 --oidc-* 플래그를 넣어 설정해왔습니다.
Kubernetes는 1.30 전후로(점진적 도입) AuthenticationConfiguration(구조화된 인증 설정)라는 새로운 방식으로, 인증 구성을 “플래그 중심”에서 “파일 기반(버전드 API) 구성”으로 옮기는 흐름을 타고 있습니다. 현재 문서 버전 기준 최신은 1.35이고, 질문 주신 것처럼 1.34에서도 실사용 가능한지, 그리고 기존 OIDC의 Airgap 제약이 개선됐는지 궁금하실 수 있습니다.
이 글에서는:
--oidc-* 플래그 방식과 AuthenticationConfiguration의 차이점를 기술적으로 정리합니다.
참고: 본 글은 Kubernetes 공식 문서의 AuthenticationConfiguration 및 API reference 내용을 기반으로 정리했습니다.
- Authentication overview: https://kubernetes.io/docs/reference/access-authn-authz/authentication/
- apiserver config API(v1): https://kubernetes.io/docs/reference/config-api/apiserver-config.v1/
--oidc-*) 방식: 무엇이 불편했나?전통적으로 apiserver의 OIDC 연동은 이런 플로우입니다.

kubectl(클라이언트)은 ID Token(JWT) 을 들고 apiserver에 요청합니다./.well-known/openid-configuration)즉, 많은 운영자들이 겪었던 것처럼:
이 특성 때문에 Airgap에서 OIDC가 항상 까다로웠습니다.
AuthenticationConfiguration는 kube-apiserver의 인증 설정을 플래그가 아니라 파일(버전드 API) 로 구성하는 방식입니다.
공식 API reference에 따르면 AuthenticationConfiguration는 다음을 포함합니다.
jwt[]: JWT/OIDC(정확히는 “OIDC discovery로 키를 찾는 JWT 인증기”) 목록anonymous: 익명 인증(anonymous)의 세밀한 제어v1 API 문서에는 “JWTAuthenticator는 issuer의 공개 엔드포인트에서 OIDC discovery로 키를 찾는다”고 명시되어 있습니다.
기존 --oidc-* 플래그의 문제는 크게 2가지였습니다.
AuthenticationConfiguration는 이를 “구조화된 스키마”로 해결합니다.

jwt: 배열을 통해 여러 issuer(또는 여러 audience/규칙)를 명시적으로 분리할 수 있습니다.v1beta1/v1 스펙에는 claim mapping, 그리고 표현식 기반(문서에 CEL 표현식 언급) 검증/추출 기능이 포함됩니다.
즉, 단순히 --oidc-username-claim / --oidc-groups-claim만으로는 부족했던
같은 요구를 더 “정식”으로 구성할 수 있게 됩니다.
Authentication 문서에는 1.34 기준으로:
이라고 명시되어 있습니다.
(예: /livez, /readyz, /healthz만 익명 허용)
Source: https://kubernetes.io/docs/reference/access-authn-authz/authentication/ (Anonymous authenticator configuration 섹션)
결론적으로 “가능”에 가깝습니다.
apiserver.config.k8s.io/v1로 AuthenticationConfiguration 리소스가 존재즉, 1.34는 AuthenticationConfiguration를 본격적으로 운영에 쓰기 좋은 버전대로 보는 것이 합리적입니다.
다만, 실제 적용 시에는 환경별로 다음을 확인하는 것을 권장합니다.
--oidc-* 플래그와의 동시 사용/충돌 규칙(문서상 일부 항목은 동시 설정 불가)근본적으로는 그대로입니다.
AuthenticationConfiguration의 JWTAuthenticator 역시 “OIDC discovery로 issuer의 공개키를 찾는다”는 모델을 따릅니다. 즉:
개선 포인트는 “OIDC 통신이 없어졌다”가 아니라, 통신 경로를 더 명확히 통제/설계할 수 있다는 쪽에 가깝습니다.
권장 패턴은 아래 중 하나입니다.

이 방식은 이전에 작성한 “폐쇄망 K8s egress” 패턴과 동일하게 적용할 수 있습니다.
apiserver의 외부 통신이 필요하다면, 최소한
를 기술적으로 고정해야 합니다.
아래는 개념 예시입니다(필드는 버전/환경에 맞게 조정 필요).
apiVersion: apiserver.config.k8s.io/v1
kind: AuthenticationConfiguration
jwt:
- issuer:
url: https://issuer.example.com
audiences:
- kubernetes
claimMappings:
username:
claim: sub
prefix: ""
groups:
claim: groups
prefix: ""
anonymous:
enabled: true
conditions:
- path: /livez
- path: /readyz
- path: /healthzAir-gapped 환경에서 흔히 나오는 접근이 “외부 IdP(OIDC issuer) 앞에 DMZ 프록시를 두고, apiserver는 프록시로만 나가게 하자”입니다.
여기서 중요한 제약이 있습니다.
iss(issuer) 클레임과, apiserver에 설정한 issuer URL을 정확히 일치시키는 방식으로 검증을 시작합니다.즉, 단순히 issuer: https://idp.example.com을 issuer: https://dmz-proxy.local로 바꾸면:
iss가 https://idp.example.com인 토큰은 매칭 단계에서 바로 실패합니다.https://idp.example.com)은 그대로 유지idp.example.com을 DMZ 프록시 IP로 해석iss가 내부 URL을 가리키도록 토큰 발급 경로 자체를 설계iss와 동일해야 합니다.이 포인트 때문에 Airgap OIDC는 “네트워크만 뚫으면 된다”가 아니라, DNS/URL/토큰 발급 체계까지 포함한 설계가 필요합니다.