RBAC 이해하기

SEUNGJUN·2024년 6월 13일

RBAC는 역할 기반 접근 제어(Role-Based Access Control)의 약자로, 이는 시스템 내에서 사용자에게 역할을 부여하고, 그 역할에 따라 접근 권한을 부여하는 접근 제어 방법이다. 이를 통해 보안 관리가 용이해지고, 권한 관리가 체계적으로 이루어진다.

RBAC의 중요성

1. 보안강화

  • 사용자가 시스템에서 수행할 수 있는 작업을 제한하여 보안을 강화한다. 권한이 없는 사용자가 중요한 데이터나 기능에 접근하지 못하도록 한다.

2. 관리 효율성

  • 역할 기반으로 권한을 관리하면 개별 사용자에 대한 권한 설정보다 훨씬 효율적이다. 새로운 사용자가 추가되거나 역할이 변경될 때 간편하게 관리할 수 있다.

3. 규정 준수

  • 많은 산업에서 요구되는 규정 준수를 더 쉽게 달성할 수 있다. RBAC는 역할과 권한을 명확하게 정의하고 이를 문서화하기 때문에 감사 및 보고가 용이하다.

예를 들어, 한 회사에 다양한 직원들이 있다고 가정했을때, 이 회사의 직원들은 다음과 같은 역할을 가질수 있다.

  • 관리자(Admin) : 모든 권한을 가짐. 시스템 설정, 사용자 관리 등 모든 작업 수행 가능
  • 매니저(Manager) : 특정 부서의 데이터를 관리하고 보고서를 생성할 수 있다.
  • 직원(Employee) : 자기 자신의 데이터를 볼 수 있고, 기본적인 작업만 수행할 수 있다.

RBAC를 사용하면, 각 지원에게 역할을 부여하고 그 역할에 따른 권한을 부여한다.

NestJS에서 RBAC 구현 예시

NestJS에는 RBAC를 구현하기 위한 유용한 도구와 패턴을 제공한다.

1. 역할 정의

export enum Role {
  Admin = 'admin',
  Manager = 'manager',
  Employee = 'employee',
}

2. 사용자 엔티티에 역할 추가

import { Role } from './role.enum';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  @Column()
  password: string;

  @Column()
  role: Role;
}

3. 역할 기반 가드 작성

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);
  }
}

4. 데코레이터를 사용해 역할 지정

import { SetMetadata } from '@nestjs/common';

export const Roles = (...roles: Role[]) => SetMetadata('roles', roles);

5. 컨트롤러에서 역할 기반 접근 제어 적용

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를 구현할 수 있다.

profile
RECORD DEVELOPER

0개의 댓글