RBAC & ABAC & ReBAC

RBAC (Role-Based Access Control)

// 1. User (사용자)
interface User {
  id: string;
  name: string;
  roles: Role[];  // 사용자는 여러 역할을 가질 수 있음
}

// 2. Role (역할)
interface Role {
  id: string;
  name: string;  // 'admin', 'editor', 'user' 등
  permissions: Permission[];  // 역할은 여러 권한을 가짐
}

// 3. Permission (권한)
interface Permission {
  id: string;
  action: string;  // 'create', 'read', 'update', 'delete'
  resource: string;  // 'posts', 'users', 'comments' 등
}

ABAC(Attribute-Based Access Control)

// 속성들을 기반으로 접근 제어를 결정
interface AccessAttributes {
  user: {
    department: string;
    role: string;
    clearanceLevel: number;
    location: string;
  };
  resource: {
    type: string;
    sensitivity: string;
    department: string;
  };
  environment: {
    time: Date;
    ipAddress: string;
    deviceType: string;
  };
}

// ABAC 정책 예시
const policy = {
  canAccess: (attributes: AccessAttributes): boolean => {
    const { user, resource, environment } = attributes;
    
    // 복잡한 조건들을 조합하여 접근 제어
    return (
      user.department === resource.department &&
      user.clearanceLevel >= 3 &&
      environment.time.getHours() >= 9 &&
      environment.time.getHours() <= 17 &&
      environment.ipAddress.startsWith('10.0')
    );
  }
};

ReBAC (Relationship-Based Access Control)

// 엔티티 간의 관계를 기반으로 접근 제어
interface Document {
  id: string;
  ownerId: string;
  teamId: string;
  sharedWith: string[];
}

interface User {
  id: string;
  teamId: string;
  managedTeams: string[];
}

// ReBAC 정책 예시
class RelationshipChecker {
  static canAccess(user: User, document: Document): boolean {
    return (
      user.id === document.ownerId || // 소유자
      document.sharedWith.includes(user.id) || // 직접 공유
      user.teamId === document.teamId || // 같은 팀
      user.managedTeams.includes(document.teamId) // 관리자
    );
  }
}