forked from baron/baron-sso
83 lines
3.1 KiB
Markdown
83 lines
3.1 KiB
Markdown
# Kratos 사용자 traits 필드 인벤토리
|
|
|
|
작성일: 2026-05-13
|
|
|
|
## 확인 대상
|
|
|
|
- 설정 파일: `docker/ory/kratos/identity.schema.json`
|
|
- 로컬 Kratos DB: `ory_postgres` / `ory_kratos.identities.traits`
|
|
- 전역 Personal 테넌트: `9607eb7b-04d2-42ab-80fe-780fe21c7e8f` / `personal`
|
|
|
|
## Kratos schema에 설정된 traits 필드
|
|
|
|
| 필드 | 타입 | 용도 |
|
|
| --- | --- | --- |
|
|
| `custom_login_ids` | string array | password identifier |
|
|
| `email` | string | password/code identifier, recovery, verification, required |
|
|
| `name` | string | 사용자 이름 |
|
|
| `phone_number` | string | password/code SMS identifier |
|
|
| `department` | string | 부서 |
|
|
| `affiliationType` | string | 소속 유형 |
|
|
| `companyCode` | string | 대표 테넌트 slug |
|
|
| `role` | string | 권한 역할 |
|
|
| `tenant_id` | string | 대표 테넌트 UUID |
|
|
| `displayname` | string | 레거시 표시 이름 후보 |
|
|
| `completeForm` | boolean | 레거시 가입 폼 완료 여부 후보 |
|
|
| `team` | string | 레거시 팀 후보 |
|
|
| `taxCode` | string | 레거시 세무 코드 후보 |
|
|
| `familyCompany` | string | 레거시 가족사 후보 |
|
|
| `familyUniqueKey` | string | 레거시 가족사 고유키 후보 |
|
|
| `personal` | boolean | 레거시 Personal 여부 후보 |
|
|
| `grade` | string | 직급 |
|
|
|
|
현재 schema는 `additionalProperties: true`라서 위 목록에 없는 traits도 저장 가능합니다.
|
|
|
|
## 로컬 Kratos DB에 실제 저장된 traits 필드
|
|
|
|
| 필드 | identity 수 |
|
|
| --- | ---: |
|
|
| `affiliationType` | 3 |
|
|
| `companyCode` | 3 |
|
|
| `companyCodes` | 1 |
|
|
| `department` | 3 |
|
|
| `email` | 3 |
|
|
| `grade` | 3 |
|
|
| `name` | 3 |
|
|
| `phone_number` | 1 |
|
|
| `role` | 3 |
|
|
| `tenant_id` | 1 |
|
|
|
|
## 정리 후보
|
|
|
|
유지 후보:
|
|
|
|
- 인증 식별자: `email`, `phone_number`, `custom_login_ids`
|
|
- 사용자 기본 프로필: `name`
|
|
- 권한/대표 소속: `role`, `tenant_id`, `companyCode`
|
|
- 조직 표시/연동: `department`, `grade`
|
|
- 다중 소속이 필요한 동안 유지: `companyCodes`
|
|
|
|
schema 추가 검토 후보:
|
|
|
|
- Backend read model에서 읽는 `position`, `jobTitle`
|
|
- 한맥가족 다중 소속을 metadata로 유지할 경우 `additionalAppointments`
|
|
- 대표 테넌트 표시값을 traits로 계속 줄 경우 `primaryTenantId`, `primaryTenantSlug`, `primaryTenantName`, `primaryTenantIsOwner`
|
|
|
|
제거 후보:
|
|
|
|
- `displayname`
|
|
- `completeForm`
|
|
- `team`
|
|
- `taxCode`
|
|
- `familyCompany`
|
|
- `familyUniqueKey`
|
|
- `personal`
|
|
- `hanmacFamily`는 이미 `test/kratos_identity_schema_policy_test.sh`에서 금지 필드로 검사 중입니다.
|
|
|
|
## 제안 정책
|
|
|
|
1. Personal 사용자는 사용자별 Personal 테넌트를 생성하지 않고 전역 `personal` 테넌트만 사용합니다.
|
|
2. Kratos traits는 인증/클레임에 필요한 최소 필드만 유지합니다.
|
|
3. 조직도나 연동 전용 확장 데이터는 traits 최상위에 흩뿌리지 않고 Ory에 저장되지 않거나 조회가 불가능한 Backend read model 또는 명시된 metadata 구조로 모읍니다.
|
|
4. `additionalProperties: true`를 바로 `false`로 바꾸면 기존 identity 갱신이 실패할 수 있으므로, 먼저 backend sanitizer와 마이그레이션으로 제거 후보를 정리한 뒤 schema를 닫습니다.
|