---
title: "외부 앱 client_credential 폐기 (APP_CREDENTIAL_SCHEMA §6 + §1 line 50)"
method: POST
path: "/v1/app-credentials/{client_id}/revoke"
tags: ["AppCredential"]
---

# 외부 앱 client_credential 폐기 (APP_CREDENTIAL_SCHEMA §6 + §1 line 50)

`POST /v1/app-credentials/{client_id}/revoke`

## 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/{client_id}/revoke`
- 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`)

`POST /v1/app-credentials/{client_id}/revoke` 단일 진입점
(APP_CREDENTIAL_SCHEMA §6 line 195 + §1 line 50 1:1, PR-N-5).

Phase 2 외부 표면 4호 폐기 단계 (PR-N-3 발급 패턴 1:1 재사용 — 8 원칙 #1
공통모듈화). 정책 평가 + app_credentials UPDATE (ACTIVE -> REVOKED) +
`app_credential.revoked` audit 적재 단일 트랜잭션. 단방향 전이 (resurrection
0건, 계획서 §16-1 line 816 정본).

응답 분기 (8 error_code → ERROR_CODES.md 표준 envelope 정밀 매핑 잠금):
    - 정상 폐기                              → 200 OK + 3필드 envelope
      ({client_id, status='REVOKED', revoked_at})
    - 정책 거부 (AuthPolicyError)            → 401/402/403/422/429
      (PR-M 정밀 매핑, 미들웨어 위임)
    - Service 거부 (AppCredentialRevokeError) → 8 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
        * REVOKED_REASON_MISSING            → 400 VALIDATION_INVALID_FIELD
        * REVOKED_REASON_FORBIDDEN          → 400 VALIDATION_INVALID_FIELD
        * TARGET_NOT_FOUND                  → 404 RESOURCE_NOT_FOUND
        * TARGET_ALREADY_REVOKED            → 409 RESOURCE_CONFLICT
    - Repository ValueError                  → 400 VALIDATION_INVALID_FIELD
      (client_id 정규식 위반 / organization_id 음수 등 사전 검증 결함 —
      Service 가 정상 통과한 입력이라 도달 0건 fallback)
    - 그 외 예외                              → 500 INTERNAL_ERROR (미들웨어)

시나리오 4 (계획서 §15-5 line 791) 정합:
    본 핸들러가 status='REVOKED' 전이 commit 후 동일 client_id 로 인증
    시도 시 AuthPolicyService._verify_client_credential 의 status != 'ACTIVE'
    분기 (CWE-208 Timing Oracle 차단 + OWASP 인증 모범 사례) 가 즉시
    AUTH_CREDENTIAL_INVALID 401 거부 — 폐기 즉시 차단 보장.

Audit (계획서 §3-2.D line 219 + §14-2 line 684 정합):
    `app_credential.revoked` (AUDIT_LOG_SCHEMA §7 line 326) 단일 진입점
    emit. payload={client_id, reason} 2키 + actor_user_id (who) +
    revoked_at (when) + revoked_reason (why) 1:1 정합. helper 의 audit
    durability 5분기로 DENIED/FAILURE/RevokeError/ValueError/SUCCESS 모두
    commit 영구 보존 (감사로그 손실 0건).

## Path parameters

- `client_id` string, required

## Query parameters

- `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
- `User-Agent` 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 입니다.

## Request body

- AppCredentialRevokeRequest: `POST /v1/app-credentials/{client_id}/revoke` 요청 본문 (APP_CREDENTIAL_SCHEMA §6 line 195 + §1 line 50 1:1, PR-N-5). 필드: revoked_reason: 폐기 사유 (선택). None 의 경우: - console_user: 'user_request' 자동 채움 (Service M-1 추천 결정). - admin_user: 명시 필수 (REVOKED_REASON_MISSING 거부). principal_kind 별 허용 enum: - console_user: ('user_request',) 단일 — admin_action / security_incident / superseded 모두 거부 (M-8 추천 결정). - admin_user: ('admin_action', 'security_incident') 2종 — user_request / superseded 거부 (M-8 추천 결정). 'superseded' 는 시스템 batch / reissue 트랜잭션 한정 별도 경로, 본 사용자 표면 진입 0건 (Repository 단계 차단). Headers (PR-N-3 issue 와 동일 잠금): Authorization: Bearer console_jwt 또는 admin_jwt (필수). client_credential/ legacy_api_key 는 ADR-010 §2-8 매트릭스 PR-N-4-pre 잠금으로 403 거부. X-Env-Scope: sandbox/real_test/production. X-Trace-Id / X-Request-Id: 운영 상관관계 (선택, 누락 시 자동 발급). X-Organization-Id: admin_user 위임 organization_id hint (선택).
  - `revoked_reason` string, nullable: 폐기 사유 (선택). console_user None → 'user_request' 자동 채움, admin_user None → REVOKED_REASON_MISSING 거부 (admin 명시 필수). principal_kind 별 허용 enum 위반 시 REVOKED_REASON_FORBIDDEN 거부.

## 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)
