---
title: "외부 앱 client_credential 목록 조회 (APP_CREDENTIAL_SCHEMA §6 line 194)"
method: GET
path: "/v1/app-credentials"
tags: ["AppCredential"]
---

# 외부 앱 client_credential 목록 조회 (APP_CREDENTIAL_SCHEMA §6 line 194)

`GET /v1/app-credentials`

## Request

- Base URL: `https://api.xdata.kr` (the document declares no server; this is the origin it was published from)
- URL: `https://api.xdata.kr/v1/app-credentials`
- Auth: one of:
  - HTTP basic
  - OAuth 2 (authorization code, authorization URL `https://api.xdata.kr/oauth/authorize`, token URL `https://api.xdata.kr/oauth/token`)

`GET /v1/app-credentials` 단일 진입점
(APP_CREDENTIAL_SCHEMA §6 line 194 1:1, PR-N-6).

Phase 2 외부 표면 5호 — 자기 organization 의 ACTIVE 자격증명 목록 조회.
PR-J-4 read 패턴 1:1 재사용 (8 원칙 #1 공통모듈화 + #3 일관성). SELECT 만
이므로 audit 신규 적재 0건 — 정책 평가 자체의 `auth.policy.evaluation`
audit 1건만 §5-11 에서 적재.

응답 분기 (4 error_code → ERROR_CODES.md 표준 envelope 정밀 매핑 잠금):
    - 정상 조회                              → 200 OK + 4필드 envelope
      ({items, total, limit, offset}) — items 는 6-key row (client_id /
      label / allowed_env_scopes / status / created_at / last_used_at)
    - 정책 거부 (AuthPolicyError)            → 401/402/403/422/429
      (PR-M 정밀 매핑, 미들웨어 위임)
    - Service 거부 (AppCredentialListError)  → 4 error_code 정밀 매핑:
        * PRINCIPAL_KIND_FORBIDDEN          → 403 AUTHZ_FORBIDDEN
        * PRINCIPAL_USER_ID_MISSING         → 500 INTERNAL_ERROR (운영 진단)
        * ORGANIZATION_ID_MISSING           → 400 VALIDATION_INVALID_FIELD
        * PRINCIPAL_NOT_OWNER_OR_ADMIN      → 403 AUTHZ_FORBIDDEN
    - Repository ValueError                  → 400 VALIDATION_INVALID_FIELD
      (limit/offset 사전 검증 결함 — Pydantic Field constraints 가 1차 차단)
    - 그 외 예외                              → 500 INTERNAL_ERROR (미들웨어)

Filter / Pagination (M-3 Opt-A + M-2 Opt-A 추천 결정):
    - status 필터: default ACTIVE-only (REVOKED 자격증명 외부 노출 0건 —
      보안 표면 최소화). 후속 PR 에서 ?status=all|revoked query 파라미터로
      확장 가능 (의식적 deferred — 본 PR-N-6 v1 default 잠금).
    - 정렬: created_at DESC, id DESC (최근 발급 순 + tie-breaker 안정 정렬).
    - SELECT 컬럼 (M-5 Opt-A — PII 외부 노출 0건): client_id / label /
      allowed_env_scopes / status / created_at / last_used_at 6 컬럼.
      제외 = id / client_secret_hash / secret_algo / organization_id* /
      created_by_user_id* / revoked_* / last_used_ip_hash / updated_at.

organization 격리 (M-3 Opt-c 패턴 1:1 재사용):
    Repository SQL `WHERE organization_id = :o` + Service principal.
    organization_id 양측 잠금 — 다른 organization 의 자격증명 조회 표면
    0건 (escalation 차단). console_user 는 자기 organization 만, admin_user
    는 X-Organization-Id 헤더로 위임 organization 진입.

## Query parameters

- `limit` integer: 페이지 크기 (1-100). default 20 — 운영자 콘솔 일반 페이지 크기 + Repository._validate_list_inputs 다층 안전망.
- `offset` integer: 페이지 오프셋 (>= 0). default 0 — 첫 페이지 진입. OFFSET 음수는 Pydantic ge=0 + Repository._validate_list_inputs 양측 차단.
- `env_scope` 'production' | 'real_test' | 'sandbox', nullable: 환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.

## Headers

- `Authorization` string, nullable
- `X-Env-Scope` 'production' | 'real_test' | 'sandbox', nullable: 환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/xdata/apis/xboss-api.md) · [All operations](https://skmtc.dev/xdata/apis/xboss-api/llms.txt) · [OpenAPI document](https://skmtc.dev/xdata/apis/xboss-api/revisions/816de78950db?raw)
