RBAC/ABAC 기반 권한 평가의 필요성

RBAC/ABAC

1. 예전 프로젝트에서의 권한 평가

예전에 했던 프로젝트를 확인해보면 이커머스 사이트에 판매자와 구매자 기능만 만들어놓고 나중에 관리자도 필요하고 여러 역할 추가가 있어야 하니까 추후 업데이트를 생각하고 데이터 모델에 유저 역할을 만들어놓고 유저가 역할 타입을 가지도록 설계했었다.

prisma/schema.prisma

enum UserRole {
  BUYER
  SELLER
}
 
model User {
  type UserRole @default(BUYER)
}

arc/middlewares/role.middleware.ts

import { UserRole } from '@prisma/client'
import type { NextFunction, Request, Response } from 'express'
 
import { HttpException } from '../utils/http-exception.js'
 
export const requireBuyer = (
  req: Request,
  res: Response,
  next: NextFunction
): void => {
  if (req.user?.type !== UserRole.BUYER) {
    return next(
      new HttpException({
        status: 403,
        message: '구매자만 접근할 수 있습니다.'
      })
    )
  }
 
  next()
}
 
export const requireSeller = (
  req: Request,
  res: Response,
  next: NextFunction
): void => {
  if (req.user?.type !== UserRole.SELLER) {
    return next(
      new HttpException({
        status: 403,
        message: '판매자만 접근할 수 있습니다.'
      })
    )
  }
 
  next()
}

권한을 확인하는 미들웨어를 따로 만들고 라우터에서 호출해서 확인하는 방식으로 구조를 잡았었다.

src/routes/store.router.ts

import { requireSeller } from '../middlewares/role.middleware.js'
 
export const storeRouter = express.Router()
 
// 새 스토어 등록
storeRouter
  .route('/')
  .post(
    authMiddleware,
    requireSeller,
    validateMiddleware(storeDto.create),
    storeController.create
  )

어떤 역할이 어떤 권한을 가지고 있는지 확인 및 수정을 하려면 각각의 라우터 코드를 열어봐야했다. 그리고 역할이 추가될 때 마다 미들웨어 함수를 추가해야한다. 또한 여러 역할을 가지고 있는 사용자를 만들려면 코드가 복잡해질 것을 예상할 수 있다.

API 요청마다 사용자의 역할 조회 SQL이 추가되기 때문에 DB의 부하가 증가하기도 한다.

지금은 역할이 2개 뿐이고 권한도 단순하게 나눴지만 판매자 중에서도 가게의 이름 수정이나 가게 삭제같은 권한은 절대 가질 수 없지만 일반 상품 등록 및 관리를 하는 직원, 배송과 재고 관리를 하는 직원이 나뉠 수 있다. 구매자의 경우에도 대량으로 구매를 원하는 사람의 경우 필요에 따라 권한과 역할이 필요할 것이다. 관리자를 생각해봐도 신고 관리하는 직원, 잘못된 리뷰나 상품을 삭제하는 직원, 계정 관리하는 직원이 각각 다른 권한을 필요로 하고

권한에 다른 사람이 접근할 수 없도록 철저하게 관리 되어야 한다.

지금 짧게 생각해봐도 10개의 다른 권한을 필요로 하는데 실제 서비스되는 프로그램에서는 얼마나 더 많은 역할과 권한이 있을까. 그리고 지금 이 구조로 들어간다면 확장성과 관리 측면에서 문제가 발생할 것이다.

때문에 권한과 역할을 분리한 구조 설계가 필요하다.

© kimbogyeong