
# 지원 아티팩트 업로드

`POST /v1/support-artifacts` · 권한 `support-artifacts:write`

HAR 파일 또는 로그를 지원 티켓에 첨부합니다. 아티팩트는 대시보드의 지원 페이지에서만 업로드할 수 있으며, API 키와 머신 클라이언트는 `403 insufficient_permissions`를 받습니다. 대시보드는 업로드 전에 브라우저에서 비밀 정보를 제거하고, 서버는 아티팩트를 다시 검사합니다. `Cookie`, `Set-Cookie`, `Authorization`, `DPoP` 헤더, OAuth, OIDC 및 SAML 토큰 필드, `__Host-` 쿠키, JWT 및 KeenAuth 접두사가 붙은 비밀 값은 `[redacted]`로 대체됩니다. 아티팩트에서 발견된 관리 API 키(`idp_sk_`, `idp_rk_`)는 즉시 취소됩니다. 취소에 실패하면 아무것도 저장되지 않고 업로드는 `503`을 반환합니다. 정리된 내용만 저장되며, 환경의 데이터 키로 암호화되고 30일 후 삭제됩니다. 응답에는 내용이나 제거된 값이 절대 포함되지 않습니다.

## 요청

| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
| `ticket_ref` | query | 예 | 지원 티켓 참조: 1-64자, 문자, 숫자 및 `_ . : -`, 문자 또는 숫자로 시작. |
| `kind` | query | 예 | `har`(HAR 1.2 JSON 문서) 또는 `log`(일반 텍스트). |
| `Content-Type` | header | 예 | `application/octet-stream`. |
| `Content-Encoding` | header | 아니요 | 압축된 아티팩트를 보내려면 `gzip`. |
| `Idempotency-Key` | header | 아니요 | 선택 사항. 16-64자 `[A-Za-z0-9_-]`; 같은 키를 같은 본문으로 반복하면 같은 아티팩트를 반환합니다. |

본문은 아티팩트 자체이며, 압축 해제 기준 최대 50 MB입니다. 전송 중 요청 본문은 11 MiB로 제한되므로, 더 큰 아티팩트는 gzip으로 압축하세요. 티켓에는 최대 10개의 아티팩트를 저장할 수 있습니다.

## 응답

저장된 아티팩트와 함께 `201 Created`. `findings`는 종류별로 제거된 값의 개수를 나타내며, `revocations_triggered`는 아티팩트에 포함되어 있었기 때문에 취소된 자격 증명의 개수입니다.

```json
{
  "id": "sart_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "ticket_ref": "SUP-48213",
  "kind": "har",
  "size_bytes": 482113,
  "sha256": "9f2b5c7d1e3a4f60718293a4b5c6d7e8f90123456789abcdef0123456789abcd",
  "findings": {"authorization": 2, "cookie": 5, "host_cookie": 3, "oauth_param": 1},
  "revocations_triggered": 0,
  "created_at": "2026-11-10T09:30:00.123456Z",
  "expires_at": "2026-12-10T09:30:00.123456Z"
}
```

## 오류

| HTTP | code | 조건 |
|---|---|---|
| 400 | `malformed_request` | 본문을 읽을 수 없거나, gzip 스트림이 잘못되었거나, `Idempotency-Key` 형식이 잘못되었습니다. |
| 401 | `unauthenticated` | 자격 증명이 없거나 유효하지 않거나 취소되었습니다. |
| 403 | `insufficient_permissions` | 요청이 대시보드에서 오지 않았거나, 대시보드 역할에 `support-artifacts:write`가 없습니다. |
| 403 | `quota_exceeded` | 티켓에 이미 10개의 아티팩트가 있습니다. |
| 413 | `payload_too_large` | 아티팩트가 50 MB를 초과하거나, 요청 본문이 11 MiB를 초과합니다. |
| 415 | `unsupported_media_type` | `Content-Type`이 `application/octet-stream`이 아니거나, 콘텐츠 인코딩이 `gzip`이 아닙니다. |
| 422 | `validation_failed` | `ticket_ref` 또는 `kind`가 없거나 잘못되었거나, 본문이 비어 있거나, `har` 아티팩트가 HAR 문서가 아닙니다(`/body` `invalid_har`). |
| 422 | `idempotency_key_reuse` | `Idempotency-Key`가 이미 다른 본문과 함께 사용되었습니다. |
| 429 | `rate_limited` | 처리 중인 업로드가 너무 많거나 속도 제한을 초과했습니다. `Retry-After` 기간이 지난 후 다시 시도하세요. |
| 503 | `service_unavailable` | 아티팩트가 저장되지 않았습니다(자격 증명을 취소할 수 없거나 스토리지를 사용할 수 없음). `Retry-After` 기간이 지난 후 다시 시도하세요. |

## 예제

업로드는 대시보드 작업입니다. 대시보드가 보내는 요청:

```http
POST /v1/support-artifacts?ticket_ref=SUP-48213&kind=har
Content-Type: application/octet-stream
Content-Encoding: gzip
Idempotency-Key: 2f1c9a7e-5b3d-4e8f-9a6c-1d2e3f4a5b6c

<gzip 압축 HAR 파일>
```
