
# 멤버의 진단 정보 조회

`GET /v1/organizations/{org_id}/memberships/{membership_id}/diagnostics` · 권한 `organizations:read` 및 `users:read`

조직 관리자가 "이 멤버가 왜 로그인할 수 없는가?"라는 질문에 하나의 응답으로 답할 수 있도록 합니다. 응답에는 멤버십, 조직 정책 요약, 대기 중인 초대, 멤버 인증기 요약, 조직 맥락에서의 로그인 상태, 멤버의 디렉터리 그룹, 그리고 애플리케이션 접근 권한이 포함됩니다. 이 엔드포인트는 읽기 전용입니다. 아무것도 변경되지 않으며, 쓰기 작업은 각각의 엔드포인트에서 수행합니다. 로그인 활동은 [사용자 로그 조회](/docs/api/management/users/list-logs)와 `org_id`를 통해 조회합니다.

응답에는 조직에 속한 데이터만 포함됩니다. 라벨, AAGUID, IP 주소, 사용자 에이전트, 이메일 주소, CIDR 범위와 다른 조직 맥락의 기록은 응답에 포함되지 않습니다.

## 요청

| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
| `org_id` | path | 예 | 조직 ID(`org_…`)입니다. |
| `membership_id` | path | 예 | 멤버십 ID(`mem_…`)입니다. |

요청 본문은 없습니다.

## 응답

다음 필드와 함께 `200 OK`을(를) 반환합니다.

| 필드 | 설명 |
|---|---|
| `membership` | [멤버십 조회](get.md)가 반환하는 것과 같은 멤버십입니다. 상태, 출처, 역할 및 정지 사유를 포함합니다. |
| `policy` | 조직에 설정된 정책입니다. `authentication_methods`(패스키와 비밀번호 허용 여부, 허용된 연결 수), `mfa`(다중 인증을 사용해야 하는 대상과 허용된 인증 요소), `phishing_resistant`, `sso_enforcement`(모드 및 멤버가 비상 접근 목록에 있는 경우 `bypass`), `ip_allowlist`(존재 여부와 적용 대상)입니다. `null`은 조직이 해당 정책에 대해 환경 값을 상속한다는 뜻입니다. |
| `invitation` | `invited` 멤버십인 경우에만 해당합니다. 사용자의 기본 이메일 주소로 보낸 대기 중인 초대와 전달 및 전달 상태를 포함합니다. 그 외에는 `null`입니다. 이메일 주소는 반환되지 않습니다. |
| `authenticators` | `classes`: 멤버의 활성 인증기 유형입니다. `mfa_enrolled`: 활성 인증기 중 역할이 `true` 또는 `second_factor`인 인증기가 있을 때 `both`입니다. |
| `sign_in` | `locked`과 `locked_until`(잠금은 모든 맥락에서 계정의 로그인을 중단합니다), 그리고 이 조직 맥락에서의 마지막 로그인(`last_sign_in_at`, `last_sign_in_amr`)입니다. 실패 횟수 카운터는 어떤 조직에도 속하지 않으므로 표시되지 않습니다. |
| `groups` | 조직 디렉터리에서 멤버가 속한 그룹입니다(`data`: `id` `dsg_…` 및 `directory_id` `dir_…`, 최대 100개이며, 더 많으면 `truncated`입니다). 이 사용자와 연결되어 있고 활성 상태인 디렉터리 사용자의 멤버십만 집계됩니다. 그룹 이름은 반환되지 않으며, `GET /v1/directories/{directory_id}/groups/{directory_group_id}`을(를) 통해 조회합니다. |
| `applications` | 이 조직에서 애플리케이션에 대한 접근 권한입니다. `org_access_mode`이(가) `all_organizations`인 애플리케이션은 모든 멤버에게 열려 있으며 개수만 집계됩니다(`open_count`). 그 외 애플리케이션(`data`, 이름순, 최대 100개이며, 더 많으면 `truncated`)에 대해서는 `application_id`, `name`, `access_mode`, `allowed`을 반환하며, 접근이 거부된 경우 `reason`도 반환합니다(`application_not_enabled`: 애플리케이션이 이 조직에 활성화되지 않음, `application_not_assigned`: 멤버십과 디렉터리 그룹 중 어느 것도 할당되지 않음). 판단은 로그인 시 확인과 동일한 규칙을 따릅니다. |

```json
{
  "membership": {
    "id": "mem_01j9xn5p9s0t4v6w8x0y2z4a6c",
    "organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
    "user_id": "usr_01j9xh2k6p7q1r3s5t7v9w1x3y",
    "status": "suspended",
    "source": "scim",
    "reason": "scim_deprovisioned",
    "roles": [],
    "expires_at": null,
    "created_at": "2026-10-12T09:31:00.123456Z",
    "activated_at": "2026-10-12T09:31:00.123456Z",
    "suspended_at": "2026-10-20T07:00:00Z",
    "removed_at": null,
    "updated_at": "2026-10-20T07:00:00Z",
    "version": 3
  },
  "policy": {
    "authentication_methods": null,
    "mfa": { "required_for": "all", "allowed_factors": ["totp", "webauthn"] },
    "phishing_resistant": null,
    "sso_enforcement": { "mode": "org_context", "bypass": false },
    "ip_allowlist": null
  },
  "invitation": null,
  "authenticators": { "mfa_enrolled": false, "classes": ["webauthn"] },
  "sign_in": {
    "locked": false,
    "locked_until": null,
    "last_sign_in_at": "2026-10-19T08:15:42Z",
    "last_sign_in_amr": ["fed"]
  },
  "groups": {
    "data": [{ "id": "dsg_01j9xp4r8s2t4v6w8x0y2z4a6b", "directory_id": "dir_01j9xm1n5p7q9r1s3t5v7w9x1y" }],
    "truncated": false
  },
  "applications": {
    "open_count": 2,
    "data": [
      {
        "application_id": "app_01j9xq6s0t2v4w6x8y0z2a4b6c",
        "name": "Finance portal",
        "access_mode": "assigned_only",
        "allowed": false,
        "reason": "application_not_assigned"
      }
    ],
    "truncated": false
  }
}
```

## 오류

| HTTP | 코드 | 발생 조건 |
|---|---|---|
| 404 | `not_found` | 이 조직에 멤버십이 없거나, `removed` 상태입니다. |
| 401 | `unauthenticated` | 자격 증명이 없거나, 유효하지 않거나, 취소되었습니다. |
| 403 | `insufficient_permissions` | 자격 증명에 `organizations:read` 또는 `users:read` 권한이 없습니다. |
| 429 | `rate_limited` | 요청 한도를 초과했습니다. `Retry-After` 기간이 지난 후 다시 시도하십시오. |
| 503 | `service_unavailable` | 의존 서비스를 일시적으로 사용할 수 없습니다. `Retry-After` 기간이 지난 후 다시 시도하십시오. |

## 예시

```bash
curl -i "https://api.eu.keenauth.com/v1/organizations/org_01j9xk3m7q8r2s4t6v8w0y2z4a/memberships/mem_01j9xn5p9s0t4v6w8x0y2z4a6c/diagnostics" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

## 개인정보

이 엔드포인트는 개인정보를 다룹니다. 조직 멤버십과 초대 정보, 자격 증명이 포함됩니다. [KeenAuth API의 개인정보](/docs/policies/personal-data)에서 저장되는 항목, 보관 기간, 삭제 방법을 확인하실 수 있습니다. 어떤 필드에도 민감정보(건강, 생체 정보, 종교, 정치적 견해, 성적 지향)를 보내지 마십시오.
