# 유저 그룹 기반 ReBAC 권한 아키텍처 (User Group-based ReBAC) 이 문서는 Baron SSO의 이슈 #239를 통해 구현된 유저 그룹 중심의 권한 체계와 Ory Keto를 이용한 ReBAC(Relationship-Based Access Control) 설계 방식을 설명합니다. ## 1. 개요 기존의 '테넌트 그룹(Tenant Group)' 방식에서 '유저 그룹(User Group)' 방식으로 전환하여, 권한 부여의 주체(Subject)를 그룹화하고 자원(Tenant)에 대한 권한을 상속받는 구조로 설계되었습니다. ## 2. 권한 상속 다이어그램 ```mermaid graph TD %% Entities subgraph Identity [사용자 계정] U1[User: A] U2[User: B] end subgraph Subjects [권한 부여 주체] UG[User Group: 개발팀] end subgraph Resources [보호 대상 자원] T1[Tenant: Project Alpha] T2[Tenant: Project Beta] RP[Relying Party: Auth App] end %% Relationships U1 -- "is member of" --> UG U2 -- "is member of" --> UG UG -- "assigned role: manage" --> T1 UG -- "assigned role: view" --> T2 %% Inheritance Logic (Keto ReBAC) T1 -- "owns" --> RP %% Direct Inheritance U1 -. "inherits: manage" .-> T1 U1 -. "inherits: view" .-> T2 U2 -. "inherits: manage" .-> T1 %% Recursive Permission T1 -. "allows access" .-> RP U1 -. "can manage" .-> RP %% Styles style Identity fill:#f9f,stroke:#333,stroke-width:2px style Subjects fill:#bbf,stroke:#333,stroke-width:2px style Resources fill:#dfd,stroke:#333,stroke-width:2px linkStyle 4,5,6,7,8,9 stroke:#ff944d,stroke-width:2px,stroke-dasharray: 5 5 ``` ## 3. 기술적 관계 설계 (Ory Keto Tuples) Ory Keto 내부적으로는 다음과 같은 관계 튜플(Relationship Tuples)을 통해 권한을 관리합니다. ### 3.1 그룹 멤버십 (Group Membership) 사용자를 특정 유저 그룹의 멤버로 등록합니다. - **Tuple:** `Tenant:#members@User:` - **의미:** `GroupID`에 해당하는 유저 그룹 tenant의 멤버로 `UserID` 사용자를 등록한다. ### 3.2 테넌트 권한 할당 (Tenant Role Assignment) 유저 그룹 전체에 특정 테넌트에 대한 역할을 부여합니다. - **Tuple:** `Tenant:#@Tenant:#members` - **의미:** `GroupID` 유저 그룹 tenant의 모든 멤버는 `TenantID` 테넌트에 대해 ``(예: `view`, `manage`, `admins`) 권한을 가진다. ### 3.3 자원 소유 및 전파 (Resource Ownership) 테넌트가 소유한 하위 자원(RP, API Key 등)에 대한 권한 전파 규칙입니다. - **Tuple:** `RelyingParty:#parents@Tenant:` - **검증 논리:** 사용자가 `ClientID`에 대한 `view` 권한을 요청하면, Keto는 해당 사용자가 부모인 `TenantID`에 대해 `view` 권한이 있는지 역추적하여 승인합니다. ## 4. 주요 장점 1. **중앙 집중식 관리:** 사용자의 부서 이동이나 퇴사 시, 개별 테넌트의 권한을 수정할 필요 없이 유저 그룹의 멤버십만 변경하면 모든 연관 권한이 즉시 회수/부여됩니다. 2. **복합 권한 구성:** 하나의 그룹이 여러 테넌트에 대해 서로 다른 수준의 권한을 가질 수 있어, 실제 조직 구조와 프로젝트 협업 모델을 유연하게 반영할 수 있습니다. 3. **Zanzibar 스타일 확장성:** Google Zanzibar 논리를 따르는 Ory Keto를 활용함으로써, 향후 수만 명의 사용자와 수천 개의 테넌트 환경에서도 성능 저하 없이 정교한 권한 체크가 가능합니다. ## 5. 현재 구현 기준 주의사항 - 현재 Baron SSO는 별도 `UserGroup` namespace를 사용하지 않습니다. - 유저 그룹은 `Tenant` namespace 내부의 특수 tenant(`type = USER_GROUP`)로 표현합니다. - 따라서 group membership과 group-based role assignment는 모두 `Tenant:#members` subject set을 기준으로 해석해야 합니다. ## 6. 관련 구현 파일 - **Backend Service:** `backend/internal/service/user_group_service.go` - **Backend Handler:** `backend/internal/handler/user_group_handler.go` - **Frontend API:** `adminfront/src/lib/adminApi.ts` - **Frontend UI:** `adminfront/src/features/user-groups/`