RBAC는 역할 기반 접근 제어(Role-Based Access Control)의 약자로, 이는 시스템 내에서 사용자에게 역할을 부여하고, 그 역할에 따라 접근 권한을 부여하는 접근 제어 방법이다. 이를 통해 보안 관리가 용이해지고, 권한 관리가 체계적으로 이루어진다.
예를 들어, 한 회사에 다양한 직원들이 있다고 가정했을때, 이 회사의 직원들은 다음과 같은 역할을 가질수 있다.
관리자(Admin) : 모든 권한을 가짐. 시스템 설정, 사용자 관리 등 모든 작업 수행 가능매니저(Manager) : 특정 부서의 데이터를 관리하고 보고서를 생성할 수 있다.직원(Employee) : 자기 자신의 데이터를 볼 수 있고, 기본적인 작업만 수행할 수 있다.RBAC를 사용하면, 각 지원에게 역할을 부여하고 그 역할에 따른 권한을 부여한다.
NestJS에는 RBAC를 구현하기 위한 유용한 도구와 패턴을 제공한다.
export enum Role {
Admin = 'admin',
Manager = 'manager',
Employee = 'employee',
}
import { Role } from './role.enum';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@Column()
password: string;
@Column()
role: Role;
}
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Role } from './role.enum';
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const roles = this.reflector.get<Role[]>('roles', context.getHandler());
if (!roles) {
return true;
}
const request = context.switchToHttp().getRequest();
const user = request.user;
return roles.includes(user.role);
}
}
import { SetMetadata } from '@nestjs/common';
export const Roles = (...roles: Role[]) => SetMetadata('roles', roles);
import { Controller, Get, UseGuards } from '@nestjs/common';
import { Roles } from './roles.decorator';
import { RolesGuard } from './roles.guard';
import { Role } from './role.enum';
@Controller('users')
@UseGuards(RolesGuard)
export class UsersController {
@Get()
@Roles(Role.Admin)
findAll() {
// Only admins can access this route
}
@Get('me')
@Roles(Role.Employee, Role.Manager, Role.Admin)
findMe() {
// Employees, Managers, and Admins can access this route
}
}
RBAC는 시스템 보안을 강화하고 효율적인 권한 관리를 가능하게 하는 중요한 접근 제어 방식이다. 이를 통해 회사의 데이터와 기능을 안전하게 보호할 수 있다. NestJS를 사용하면 데코레이터와 가드를 활용해 간단하고 효율적으로 RBAC를 구현할 수 있다.