
# subject 충돌 해결

`POST /v1/connections/{connection_id}/subject-conflicts/{conflict_id}:resolve` · 권한 `users:write`

열려 있는 SSO subject 충돌([연결의 subject 충돌 목록 조회](subject-conflicts.md) 참조)에 대해 관리자의 결정을 적용합니다. 새 subject가 누구의 것인지 ID 공급자의 관리자와 확인한 후에만 결정하십시오.

| `resolution` | 의미 | KeenAuth의 동작 |
|---|---|---|
| `same_person` | 새 subject가 같은 사람의 것입니다(예: ID 공급자에서 계정을 다시 만든 경우). | 이 연결에서 사용자의 기존 ID를 새 subject로 교체합니다. 다음 로그인부터 사용자는 새 subject로 로그인합니다. |
| `different_person` | 이메일 주소가 다른 사람에게 할당되었습니다. | 레코드를 닫고 아무것도 연결하지 않습니다. 새 사람이 기존 계정에 들어갈 수 없습니다. |

`different_person`을 선택한 후 새 사람이 다음 번에 로그인하면 새 레코드가 생성됩니다. 새 사람이 로그인하도록 하려면 기존 계정의 이메일 주소를 변경하거나, 해당 계정을 차단 또는 삭제하십시오. 그 후에는 일반 로그인 규칙이 적용됩니다.

ID 변경, 해당 이벤트 및 감사 기록은 하나의 트랜잭션으로 기록됩니다. 감사 행위자는 호출을 수행한 자격 증명입니다.

같은 결정을 반복하면 아무것도 기록하지 않고 레코드를 반환합니다. 이미 해결된 레코드에 다른 결정을 내리면 `409 conflict`를 반환합니다. 재시도 시 원래 응답을 돌려받으려면 `Idempotency-Key`를 보내십시오.

## 요청

| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
| `connection_id` | path | 예 | 연결 ID (`conn_…`). |
| `conflict_id` | path | 예 | subject 충돌 ID (`sscf_…`). |
| `resolution` | body | 예 | `same_person` 또는 `different_person`. |

```json
{ "resolution": "same_person" }
```

## 응답

해결된 레코드와 함께 `200 OK`를 반환합니다:

```json
{
  "id": "sscf_01j9xr4a6b8c0d2e4f6g8h0j2k",
  "connection_id": "conn_01j9xp6q0r1s5t7v9w1x3y5z7b",
  "user_id": "usr_01j9xm2n4p6q8r0s2t4v6w8x0y",
  "status": "resolved",
  "resolution": "same_person",
  "created_at": "2026-10-28T10:00:00Z",
  "last_seen_at": "2026-10-28T10:05:00Z",
  "expires_at": "2026-11-27T10:00:00Z",
  "closed_at": "2026-10-28T11:00:00Z"
}
```

## 오류

| HTTP | code | 발생 조건 |
|---|---|---|
| 400 | `unknown_field` / `malformed_request` | 본문에 알 수 없는 필드가 있거나 올바른 JSON이 아닙니다. |
| 401 | `unauthenticated` | 자격 증명이 없거나, 유효하지 않거나, 취소되었습니다. |
| 403 | `insufficient_permissions` | 자격 증명에 `users:write` 권한이 없습니다. |
| 403 | `user_not_active` | `same_person`: 사용자가 차단되었거나 삭제 중입니다. 레코드는 열린 상태로 유지됩니다. |
| 404 | `not_found` | 이 환경에 연결 또는 레코드가 없거나, 레코드가 다른 연결에 속하거나, 만료되었습니다. |
| 409 | `conflict` | 레코드가 다른 결정으로 이미 해결되었습니다. 또는 `same_person`의 경우 연결이 활성 상태가 아니거나, 새 subject가 이제 다른 사용자에 연결되어 있거나, 사용자의 ID 한도에 도달했습니다. `same_person`인 경우 레코드는 열린 상태로 유지됩니다. |
| 422 | `validation_failed` | `resolution`이 없거나 두 값 중 하나가 아닙니다(`errors[].pointer` = `/resolution`). |
| 429 | `rate_limited` | 요청 한도를 초과했습니다. `Retry-After` 기간이 지난 후 다시 시도하십시오. |
| 503 | `service_unavailable` | 종속 서비스를 일시적으로 사용할 수 없습니다. `Retry-After` 기간이 지난 후 다시 시도하십시오. |

## 예제

```bash
curl -X POST "https://api.eu.keenauth.com/v1/connections/conn_01j9xp6q0r1s5t7v9w1x3y5z7b/subject-conflicts/sscf_01j9xr4a6b8c0d2e4f6g8h0j2k:resolve" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"resolution":"different_person"}'
```

```bash
keenauth connections subject-conflicts resolve conn_01j9xp6q0r1s5t7v9w1x3y5z7b sscf_01j9xr4a6b8c0d2e4f6g8h0j2k \
  --resolution different_person --yes
```
