Files
BaronSSO/baron-sso/docs/tenant-visibility-exposure-policy.md

5.0 KiB

Tenant visibility exposure policy

목적

hanmac-family 하위 조직의 config.visibility 값이 호출 위치별로 어디까지 노출되는지 정리한다. 현재 정책에서 완전 공개 조직도는 없다고 본다. 따라서 public은 인터넷 전체 공개가 아니라 인증/공유 경계 안에서의 기본 노출값이다.

Visibility 값

의미 기본값 여부
public 인증된 사용자 화면과 통제된 공유 경계에서 기본 노출 가능한 조직. 현재 정책상 인터넷 완전 공개를 의미하지 않음 visibility가 없거나 빈 값이면 public
internal Baron 로그인 세션 또는 M2M API Key를 가진 내부/연동 경계에는 노출하지만, 외부 공유 경계에는 노출하지 않는 조직 명시 설정 필요
private 기본 조직도 노출 대상에서 제외하는 조직. 해당 조직의 하위 조직도 함께 제외 명시 설정 필요

visibilityorgUnitType 설정은 현재 hanmac-family descendant tenant에만 허용된다. hanmac-family root 자체에는 org config를 두지 않는 정책이다.

호출 위치별 노출 기준

호출 위치 인증/권한 경계 public internal private
OrgFront 일반 조직도 /chart 로그인 세션, backend /api/v1/admin/tenants 기반 노출 노출 권한 없는 사용자는 미노출
OrgFront embed picker /embed/picker 로그인 세션 또는 picker 자동 로그인 경로 노출 노출 권한 없는 사용자는 미노출
공유 링크 /api/v1/public/orgchart?token=... share token. 완전 공개가 아니라 통제된 공유 경계 노출 미노출 미노출
M2M 조직 Context JSON API /api/v1/integrations/org-context API Key + org-context:read 노출 노출 미노출
AdminFront 테넌트 관리 /api/v1/admin/tenants 사용자 role/Keto 관리 경계 노출 노출 super_admin, 해당 private subtree owner/admin/manage 가능 사용자, 또는 명시적 private 조회 권한자만 노출
AdminFront CSV export 사용자 role/Keto 관리 경계 노출 노출 /api/v1/admin/tenants와 동일
AdminFront CSV import 권한 있는 관리자 작업 입력값 검증 대상 입력값 검증 대상 입력값 검증 대상

핵심 판단

internal은 현재 “특정 조직 권한자에게만 보이는 조직”이 아니다. 로그인된 OrgFront 사용자가 backend에서 해당 tenant family를 받을 수 있는 경우, OrgFront 기본 조직도와 picker에는 internal 조직이 기본 노출된다.

다만 internal은 공개 공유 링크에서는 제외된다. 외부 M2M JSON API에서는 API Key 자체가 신뢰 경계이므로 internal을 포함한다.

private은 기본적으로 일반 조직도, picker, 공유 링크, M2M JSON API에서 제외된다. 또한 private 조직 아래의 descendant도 함께 제외된다. AdminFront 테넌트 관리와 CSV export에서도 권한 없는 사용자에게는 제외된다.

private 노출이 허용되는 사용자는 다음 중 하나다.

  • super_admin
  • 해당 private 조직 또는 ancestor를 ManageableTenants로 가진 owner/admin/manage 가능 사용자
  • Keto/ReBAC에서 해당 private 조직에 view_private, view_private_descendants, view, manage 중 하나를 가진 사용자
  • ancestor tenant에 view_private_descendants를 가진 사용자

구현 근거

  • backend tenantVisibilityinternal, private만 별도 값으로 인정하고 나머지는 public으로 처리한다.
  • backend filterPublicTenantsinternal, private, 그리고 그 descendant를 공개 공유 링크 노출에서 제외한다.
  • backend filterOrgContextSubtreeprivate과 그 descendant만 M2M 조직 Context에서 제외한다. 따라서 internal은 포함된다.
  • backend /api/v1/admin/tenants와 CSV export는 사용자 profile과 Keto 권한을 기준으로 private root 및 descendant를 필터링한다.
  • OrgFront filterTenantsByVisibility(..., "internal")private만 제외한다. 일반 /chart/embed/picker는 backend에서 이미 권한 필터링된 tenant 목록 위에서 이 기준을 사용한다.
  • OrgFront filterTenantsByVisibility(..., "public")internal, private를 제외한다. share token 기반 공개 조직도가 이 기준을 사용한다.

회색지대

현재 이름만 보면 public이 인터넷 완전 공개라는 의미로 해석될 수 있지만, 정책상 완전 공개 조직도는 없고 public은 기본 노출값이다.

현재 이름만 보면 internal이 “조직 내부 구성원 또는 특정 권한자만”이라는 의미로 해석될 수 있지만, 구현은 “공유 링크에는 숨기고, 로그인/M2M 경계에는 노출”이다.

특정 권한자에게만 보이는 조직은 private과 Keto/ReBAC 권한으로 표현한다. internal을 제한 공개 권한 모델로 확장하려면 별도 정책 변경이 필요하다.