RBAC (Role-Based Access Control)
- 역할 기반 authorization check 시스템
- 즉, 직접적으로 사용자에게 권한을 부여하는게 아니라 역할(Role)을 통해서 권한을 관리하는 방식
- 따라서 역할 권한 변경만으로 해당 역할 사용자의 권한이 업데이트 됨
- 같은 역할을 가진 사용자들은 항상 동일한 권한을 가질 수 있음.
// 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)
- 관계 기반 접근 제어
- 엔티티 간의 관계를 기반으로 접근을 제어함
- 아래의 예시에서는 document 와 user 의 관계를 기반으로 정책이 결정됨.
// 엔티티 간의 관계를 기반으로 접근 제어
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) // 관리자
);
}
}