
# 프로필 업데이트

`PATCH /fapi/v1/me` · 환경의 로그인 호스트에서 호출

인증된 사용자의 프로필 필드를 변경합니다. 본문에 있는 필드는 변경되고, 없는 필드는 그대로 유지됩니다. 빈 문자열이나 `null`을 보내면 해당 필드가 지워집니다. `user_metadata`를 지정하면 RFC 7396 병합 패치로 병합됩니다. 관리 API와 동일한 필드 규칙이 적용됩니다. 인증된 사용자의 `__Host-idp_session` 쿠키가 필요하며, 최근 재인증은 필요하지 않습니다. 다른 출처에 있는 자사 앱은 대신 프런트 API 액세스 토큰(DPoP 증명과 함께 `Authorization: DPoP <token>`)을 보낼 수 있습니다. 자세한 내용은 [프런트 API 액세스 토큰](/docs/api/fapi/front-api-token)을 참조하십시오.

필드 오류(`422 validation_failed`, `errors[]`에 포함): `invalid`(형식 또는 길이 오류입니다. 환경에서 사용하도록 설정되지 않은 언어를 `/locale`에 지정한 경우에도 발생합니다), `too_large` 및 `too_many_keys`(`user_metadata`가 16 KiB를 초과하거나, 깊이가 5를 넘거나, 최상위 키가 100개를 넘는 경우), `identifier_type_disabled`(환경에서 사용자 이름이 꺼져 있습니다), `profile_field_disabled`(환경에서 해당 필드를 끈 경우입니다. 다만 값을 지우는 것은 허용됩니다), `profile_field_required`(환경에서 해당 필드를 필수로 지정하여 지울 수 없습니다).

## 요청

헤더:

| 헤더 | 필수 | 설명 |
| --- | --- | --- |
| `Idp-Client` | 예 | SDK 식별자입니다. |
| `Origin` | 예 | 정확히 `https://<sign-in host>`이어야 합니다. |
| `If-Match` | 아니요 | 선택 사항입니다. 이전 응답의 `ETag`(또는 `*`)이며, 프로필이 여전히 해당 버전일 때만 변경됩니다. |

본문(`application/json` 또는 `application/merge-patch+json`):

| 필드 | 유형 | 설명 |
| --- | --- | --- |
| `given_name` | string 또는 null | 이름입니다. |
| `family_name` | string 또는 null | 성입니다. |
| `name` | string 또는 null | 전체 이름입니다. |
| `picture` | string 또는 null | 사진 URL(`https`)입니다. |
| `locale` | string 또는 null | 언어(BCP 47 태그)입니다. |
| `zoneinfo` | string 또는 null | 시간대(IANA 이름)입니다. |
| `username` | string 또는 null | 사용자 이름입니다. |
| `user_metadata` | object | `user_metadata`에 적용되는 병합 패치입니다(RFC 7396). |

```json
{
  "given_name": "Ada",
  "zoneinfo": "",
  "user_metadata": {
    "theme": null
  }
}
```

## 응답

업데이트된 프로필(`GET /fapi/v1/me`와 동일한 필드)과 새 `ETag`를 포함한 `200 OK`를 반환합니다.

## 오류

| 상태 | 코드 | 발생 조건 |
| --- | --- | --- |
| 400 | `malformed_request` | 본문 또는 `If-Match` 헤더의 형식이 잘못되었습니다. |
| 400 | `unknown_field` | 여기서 변경할 수 없는 필드가 본문에 있습니다(예: `email` 또는 `app_metadata`). |
| 401 | `unauthenticated` | 유효한 세션 쿠키가 없습니다. |
| 403 | `origin_not_allowed` | `Origin`이 없거나 잘못되었습니다. |
| 404 | `not_found` | 계정을 읽을 수 없습니다(예: 차단되었거나 삭제 진행 중인 경우). |
| 409 | `username_unavailable` | 사용자 이름이 예약되었거나 다른 계정이 이미 사용 중입니다(두 경우 모두 같은 응답입니다). |
| 412 | `precondition_failed` | `If-Match`가 현재 버전과 일치하지 않습니다. 아무것도 변경되지 않았습니다. |
| 413 | `payload_too_large` | 본문이 16 KiB를 초과합니다. |
| 415 | `unsupported_media_type` | 지원되지 않는 `Content-Type`입니다. |
| 422 | `validation_failed` | 필드가 규칙을 위반했습니다. `errors[]`에 필드와 사유가 표시됩니다(위 내용 참조). |
| 503 | `service_unavailable` | 사용자 디렉터리를 일시적으로 사용할 수 없습니다. `Retry-After`초 후에 다시 시도하십시오. |

## 예시

```bash
curl -X PATCH https://example.keenauth.app/fapi/v1/me \
  -H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
  -H "Origin: https://example.keenauth.app" \
  -H 'If-Match: "7"' \
  -H "Content-Type: application/json" \
  -b cookies.txt \
  -d '{"given_name":"Ada","zoneinfo":""}'
```

## 개인정보

이 엔드포인트는 개인정보, 즉 최종 사용자 프로필을 다룹니다. [KeenAuth API의 개인정보](/docs/policies/personal-data)에서 저장되는 항목, 보관 기간, 삭제 방식을 설명합니다. 어떤 필드에도 특수 범주의 개인정보(건강, 생체 정보, 종교, 정치적 견해, 성적 지향)를 보내지 마십시오.
