# Ory Keto 관계 튜플 샘플 가이드 (Relationship Tuple Samples)

이 문서는 Baron SSO의 **유저 그룹 중심 통합 권한 정책**을 구현하기 위해 Ory Keto에 저장되는 실제 데이터 샘플을 제공합니다.

## 1. 기본 명명 규칙 (Naming Convention)
- **Namespace:** `Tenant`, `UserGroup`, `RelyingParty`, `User`
- **Format:** `namespace:object_id#relation@subject` (subject는 `user_id`이거나 `namespace:object_id#relation` 형태의 Subject Set임)

---

## 2. 유저 그룹 및 멤버십 샘플 (User Group & Membership)

### 2.1 그룹 멤버 추가
"한맥 IT 개발팀(`hanmac-it-dev`) 그룹에 사용자 `alice`를 멤버로 추가"
- **Tuple:** `UserGroup:hanmac-it-dev#members@User:alice-uuid`
- **설명:** alice는 이제 해당 그룹의 권한을 상속받을 준비가 됨.

### 2.2 그룹장(Leader) 임명
"사용자 `bob`을 `hanmac-it-dev` 그룹의 그룹장으로 임명"
- **Tuple:** `UserGroup:hanmac-it-dev#owners@User:bob-uuid`
- **설명:** bob은 그룹의 소유권을 가지며, 정책에 따라 해당 테넌트의 어드민이 됨.

---

## 3. 정책 기반 자동 권한 상속 (Policy Bridges)

### 3.1 그룹장 -> 테넌트 어드민 승격
"그룹장은 해당 그룹(테넌트)의 어드민 권한을 가진다" (**핵심 정책**)
- **Tuple:** `Tenant:hanmac-it-dev#admins@UserGroup:hanmac-it-dev#owners`
- **설명:** 이 튜플 하나로 인해 `UserGroup:hanmac-it-dev#owners`에 속한 `bob`은 `Tenant:hanmac-it-dev`의 `admins` 자격을 얻음.

### 3.2 그룹 멤버 -> 테넌트 일반 권한
"그룹 멤버들은 해당 테넌트의 조회(view) 권한을 가진다"
- **Tuple:** `Tenant:hanmac-it-dev#members@UserGroup:hanmac-it-dev#members`
- **설명:** 그룹에 속한 모든 사용자가 테넌트 자원을 볼 수 있게 함.

---

## 4. 테넌트 간 권한 상속 및 자원 소유 (Hierarchy)

### 4.1 타 테넌트 관리 권한 부여
"개발팀 그룹(`hanmac-it-dev`)에게 `alpha-project` 테넌트의 관리 권한을 부여"
- **Tuple:** `Tenant:alpha-project#manage@UserGroup:hanmac-it-dev#members`
- **설명:** 이제 개발팀 멤버 전원이 `alpha-project`를 요리할 수 있음.

### 4.2 테넌트-자원(RP) 연결
"인증 앱(`messenger-app`)은 `hanmac-it-dev` 테넌트 소속이다"
- **Tuple:** `RelyingParty:messenger-app#parents@Tenant:hanmac-it-dev`
- **설명:** `hanmac-it-dev`를 관리하는 사람은 부모 관계를 통해 `messenger-app`도 관리할 수 있게 됨.

---

## 5. 종합 시나리오 예제: Hanmac Family

| 대상 리소스 | 관계 | 주체 (Subject) | 비고 |
| :--- | :--- | :--- | :--- |
| `UserGroup:hanmac-it` | `members` | `User:alice` | Alice는 IT팀 멤버 |
| `UserGroup:hanmac-it` | `owners` | `User:bob` | Bob은 IT팀 그룹장 |
| `Tenant:hanmac-it` | `admins` | `UserGroup:hanmac-it#owners` | **정책:** Bob은 IT 테넌트 어드민 |
| `Tenant:project-x` | `manage` | `UserGroup:hanmac-it#members` | IT팀 전체가 Project-X 관리 |
| `RelyingParty:rp-01` | `parents` | `Tenant:project-x` | rp-01은 Project-X 소속 |

### 🔍 권한 확인 (Check API) 결과:
1.  **Bob은 `rp-01`을 관리할 수 있는가?**
    - `bob` -> `UserGroup:hanmac-it#owners` -> `Tenant:hanmac-it#admins` -> (상속 시) -> `rp-01`
    - **결과: YES**
2.  **Alice는 `rp-01`을 관리할 수 있는가?**
    - `alice` -> `UserGroup:hanmac-it#members` -> `Tenant:project-x#manage` -> (부모 관계) -> `rp-01`
    - **결과: YES**
3.  **Alice는 `Tenant:hanmac-it`의 설정을 바꿀 수 있는가?**
    - Alice는 `members`일 뿐 `admins`가 아님.
    - **결과: NO**
