# 가족사 테넌트 가입 및 관리 정책 (인증 기반 수정안)

이 문서는 보안 강화를 위해 **이메일 인증 성공 시에만 가족사 소속을 선택**할 수 있도록 변경된 가입 흐름을 설명합니다.

## 회원가입 및 권한 관리 흐름도

```mermaid
graph TD
    %% 시작점
    A([사용자 회원가입 시작]) --> B[이메일 입력 및 인증 코드 발송]
    B --> C{이메일 인증 성공?}
    
    C -- No --> B
    C -- Yes --> D{인증된 이메일이<br>내부/가족사 도메인인가?}
    
    %% 일반 도메인 (gmail, naver 등)
    D -- No<br>(External) --> E[개인 테넌트 자동 할당<br>Type: PERSONAL]
    E --> J
    
    %% 내부 도메인 (hanmaceng.co.kr 등)
    D -- Yes<br>(Internal) --> F[가족사 목록 노출 및 선택<br>Select Company Code]
    F --> G{선택한 코드가<br>ACTIVE 상태인가?}
    
    G -- No --> F
    G -- Yes --> J[Ory Kratos 계정 생성]
    
    %% 유저 생성 및 권한 할당
    J --> K[(Backend read model 레코드 생성)]
    K --> N[기본 권한 할당: user<br>Keto: members 부여]
    
    N --> O([회원가입 완료])

    %% 관리자 수동 개입 (별도 흐름)
    P((최고 관리자<br>Super Admin)) -.-> Q[사용자 역할 변경<br>user -> tenant_admin]
    Q -.-> R[(Keto 권한 수동 할당<br>owners, admins 부여)]

    %% 스타일링
    classDef process fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
    classDef decision fill:#fff3e0,stroke:#e65100,stroke-width:2px;
    classDef db fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px;
    classDef startend fill:#f3e5f5,stroke:#4a148c,stroke-width:2px;
    classDef admin fill:#f5f5f5,stroke:#616161,stroke-width:2px,stroke-dasharray: 5 5;
    
    class A,O startend;
    class B,F,J,N,Q process;
    class C,D,G decision;
    class E,K,R db;
    class P admin;
```

## 핵심 정책 변경 사항

1. **선(先)인증 후(後)선택:** 사용자는 이메일 소유권 인증(OTP 또는 인증 링크)을 완료하기 전까지는 어떠한 가족사 소속도 선택할 수 없습니다. 
2. **도메인 기반 노출 제어:** 
   - 인증된 이메일 도메인이 시스템에 등록된 가족사 도메인(`hanmaceng.co.kr` 등)일 경우에만 소속 선택 UI가 활성화됩니다.
   - 일반 외부 도메인(gmail, naver 등)은 `PERSONAL` 테넌트로 강제 배정되어 가족사 리스트 자체가 노출되지 않습니다.
3. **이메일 도메인 중복 방지:** 같은 도메인을 쓰더라도 다른 소속일 수 있는 경우(예: 협력사 등)를 대비하여, 인증 성공 후에도 사용자가 직접 본인의 정확한 소속(`Company Code`)을 선택하게 하여 데이터 무결성을 확보합니다.
4. **수동 권한 위임 유지:** 모든 가입자는 기본적으로 `user` 권한을 부여받으며, 테넌트 관리자(`tenant_admin`)나 오너(`owner`) 권한은 지주사 관리자가 사용자의 신원을 최종 확인한 후 수동으로 부여합니다.
5. **실시간 상태 검증:** 가입 시점에 선택한 테넌트가 `ACTIVE` 상태가 아닐 경우 가입 진행을 차단합니다.
