Skip to content

fix(deploy): the production image and compose cannot run OIDC — pyjwt is missing and no OIDC variable is passed #992

Description

@yeongseon

Builder(공공데이터를 수집해 데이터셋으로 빌드하는 서버)의 운영 배포용 이미지와 compose 구성으로는 OIDC(Keycloak 같은 인증 서버에 로그인을 맡기는 표준 방식) 인증을 켤 수 없습니다. Studio(Builder 의 웹 화면)는 OIDC 토큰만 보내므로, 이 상태로는 Studio 를 운영 Builder 에 연결할 수 없습니다.

Problem

운영 배포는 API 키 인증만 지원하고 OIDC 를 켤 수 없습니다. Studio 는 Bearer 토큰(Keycloak 이 발급)만 보냅니다. 지금 구성으로는 Studio 가 운영 Builder 에 연결되지 못합니다.

Evidence

  • Dockerfile:51 은 ARG EXTRAS=publish 입니다. JWT 검증에 필요한 pyjwt 는 auth extra 에만 있습니다(pyproject.toml:63).
  • docker-compose.prod.app.yml:27-38 의 environment 에는 KPUBDATA_BUILDER_API_KEY, HOST, PORT, OUTPUT_DIR, ALLOWED_ORIGINS, CREDENTIAL_MASTER_KEY 여섯 개만 있습니다. OIDC_* 변수는 없습니다.
  • .env.app.example 에도 OIDC_* 변수가 없습니다. deploy.yml:45 가 사용하는 파일이 이 compose 입니다.
  • OIDC 변수를 넘기는 compose 는 따로 있습니다(infra/oci/docker-compose.yml:46-49). 이 파일은 운영 배포 경로와 맞지 않습니다.
  • Studio 쪽에는 X-API-Key 를 보내는 경로가 없습니다(Studio 의 이슈를 참조합니다).

Impact: 실제 Builder 에 연결된 Studio 를 배포할 수 없습니다. "사용자가 자신의 provider 키를 직접 넣고(BYOK) 서버는 그 키를 저장하지 않는다"는 설명은 다중 사용자(OIDC) 모드에서만 성립합니다. 단일 사용자 모드는 CREDENTIAL_MASTER_KEY 로 키를 암호화해 저장합니다.
Blocks: Studio 를 실제 Builder 에 연동한 배포와 V5 검증(제품 전체를 처음부터 끝까지 실행하는 테스트)을 막습니다.
Evidence: 위에 적은 파일들입니다.

먼저 정할 것 (사람)

  • 운영 인증 모드를 정합니다. 선택지는 OIDC 다중 사용자와 API 키 단일 사용자입니다. Studio 가 Bearer 토큰만 지원하므로 OIDC 다중 사용자가 권장됩니다.
  • 토큰 종류를 정합니다. 선택지는 ID 토큰과 access 토큰입니다. Studio 는 Keycloak 의 access 토큰을 보냅니다.

Scope

  • 배포 이미지에 auth extra 를 포함합니다(EXTRAS="publish auth").
  • compose, .env.app.example, deploy.yml 에 OIDC_ISSUER, OIDC_AUDIENCE, KPUBDATA_BUILDER_ADMIN_SUBJECTS, KPUBDATA_BUILDER_AUTH_FAILURE_LIMIT 를 추가합니다.
  • 다중 사용자 프로필에서 CREDENTIAL_MASTER_KEY 와 provider 키 환경변수를 제거합니다.
  • Keycloak 의 realm export(audience mapper 와 email_verified 포함)를 저장소에 추가합니다.

Acceptance Criteria

  • 배포 이미지에서 import jwt 가 성공합니다.
  • OIDC 변수가 있는 프로필이 CI 에서 기동 스모크 테스트를 통과합니다.
  • 실제 Keycloak 토큰으로 GET /providers 를 호출하면 200 이 돌아옵니다.

Required Verification

V3(실제 컴포넌트 사이의 통합 테스트)와 인증에 대한 부정 테스트(거부되어야 할 요청이 실제로 거부되는지 확인하는 테스트)가 필요합니다. 검증 수준은 POLICY.md 의 Verification Level 표를 따릅니다.

Dependencies

Blocked by: #990, #991. 다중 사용자 모드로 열면 이 두 결함이 바로 노출됩니다. #990 은 REQUIRE_OWN_PROVIDER_CREDENTIAL 설정에서도 키 없는 요청이 운영자의 환경 변수 키로 실행되는 문제이고, #991 은 POST /builds 가 다른 호출자의 run_id 를 받으면 그 호출자의 job 을 돌려주는 문제입니다.
Relates: #692 (프로필별 기동 스모크 테스트를 갖춘 Compose 묶음)

Notes

2026-10-04 에 세 저장소의 연동을 검토하면서 나온 항목입니다. main 의 커밋 7a3f78f 에서 다시 확인한 것만 적었습니다.


2026-10-07 최소 운영 설계 재검토

HEAD와 릴리스 산출물 구분

2026-10-07 에 커밋 1d93ceb 기준으로 확인한 내용입니다. Dockerfile 의 EXTRAS 는 이미 publish auth 이고, 운영용 compose 에 OIDC 변수가 있습니다. 따라서 위 본문은 과거 시점의 설명이며, 현재 main 의 코드 상태로 인용하지 않습니다. 사용자가 보고한 "v0.4.0 에서 OIDC 를 쓸 수 없다"는 문제는, 이 검토에서 해당 이미지를 받아 실행해 재현하지 않았습니다.

이 검토에서는 이 이슈를 완료 처리하거나 닫지 않습니다.

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

epic:distributionDistribution — versions, images, releases, supply chainreview:R3BYOK, auth, cache isolation, publish policy, PII, CI, release (POLICY 18.1)severity:majorWrong data produced, core flow fails, bypassable policy gatetype:bugSomething is wrong (POLICY 2.1)

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions