Cute Light Pink Flying Butterfly 사용자 권한을 데이터로 관리하기 | RBAC 엔진 구현하기 :: 놀면서 돈벌기
본문 바로가기
IT/Architecture

사용자 권한을 데이터로 관리하기 | RBAC 엔진 구현하기

by esclife_ 2026. 1. 25.
반응형

 

RBAC(역할 기반 접근 제어)이란?

사용자에게 직접 권한을 부여하는 대신, 역할(Role)을 정의하고 그 역할에 권한(Permission)을 설정한 뒤, 사용자에게 역할을 할당하는 방식입니다.

  • 장점: 사용자가 수천 명으로 늘어나도 설정 파일로 'Role'만 관리하면 되므로 유지보수가 매우 쉽습니다. (.json, .xml)
  • 실제 구현: 사용자.json에서 사용자의 역할을 정의하고, 권한.json에서 각 역할의 세부 권한을 정의하여 Model로 연결합니다.

정책 설계: JSON 기반의 선언적 권한 관리

코드 내에 권한을 하드코딩하지 않고 외부에 설정파일로 분리합니다. 이는 서버 재시작 없이도 정책을 변경할 수 있는 확장성을 제공합니다.

아래는 Behind 역할(외부 기기)은 C드라이브는 절대 불가(Deny), D드라이브는 허용(Allow)한다는 정책을 수립했습니다.

- 사용자.json

{
  "out_program_company1": {
    "Description": " Out Application System1",
    "Roles": [ "Behind" ]
  },
  "out_program_company2": {
    "Description": "Out Application System2",
    "Roles": [ "Behind" ]
  },
  "Administrator": {
    "Description": "Developer Manager Device",
    "Roles": [ "Admin" ]
  }
}

 

- 권한.json

{
  "Admin": {
    "Description": "관리자: 모든 권한을 가집니다.",
    "Permissions": [
      {
        "Effect": "Allow",
        "Action": [ "*" ],
        "Resource": "*"
      }
    ]
  },
  "Behind": {
    "Description": "외부 접근자: 명시적으로 허용된 작업을 제외한 모든 파일 시스템 접근이 금지됩니다.",
    "Permissions": [
      {
        "Effect": "Deny",
        "Action": [ "file:*" ],
        "Resource": "C:\\*"
      },
      {
        "Effect": "Allow",
        "Action": [ "file:*" ],
        "Resource": "D:\\*"
      }
    ]
  },
  "Guest": {
    "Description": "미인증 사용자: 모든 권한이 거부됩니다.",
    "Permissions": [
      {
        "Effect": "Deny",
        "Action": [ "*" ],
        "Resource": "*"
      }
    ]
  }
}

 

- Model

using Newtonsoft.Json;
using System.Collections.Generic;

namespace SecurityDemoProject.AccessControl.Models
{
    public class RolePolicy
    {
        [JsonProperty("Description")]
        public string Description { get; set; }

        [JsonProperty("Permissions")]
        public List<PermissionRule> Permissions { get; set; }
    }

    public class PermissionRule
    {
        [JsonProperty("Effect")]
        public string Effect { get; set; }

        [JsonProperty("Action")]
        public List<string> Action { get; set; }

        [JsonProperty("Resource")]
        public string Resource { get; set; }
    }

    public class UserPolicy
    {
        [JsonProperty("Description")]
        public string Description { get; set; }

        [JsonProperty("Roles")]
        public List<string> Roles { get; set; }
    }
}

 

 


기술적 핵심: 와일드카드와 정규표현식(Regex)

권한 검사 시 C:\Data\*와 같이 광범위한 경로를 처리하기 위해 와일드카드를 정규표현식으로 변환하는 로직을 추가 구현했습니다.

C:\\a.txt, C:\\system\b.txt.... 이렇게 모든 파일접근을 설정파일에 다 선언하는 것은 비효율적이기 때문에, 와일드카드를 이용해서 하위 접근경로는 모두 제한할 수 있도록 작성했습니다.

private Regex WildcardToRegex(string pattern)
{
    // '*'를 '.*'로 바꾸어 정규표현식 패턴을 생성 (예: D:\* -> ^D:\\.*$)
    string regexPattern = Regex.Escape(pattern).Replace("\\*", ".*");
    return new Regex($"^{regexPattern}$", RegexOptions.IgnoreCase);
}

 


권한 결정 알고리즘: Deny-First Strategy

보안 시스템에서 가장 중요한 원칙은 명시적 거부(Deny)는 허용(Allow)보다 우선한다는 것입니다.

  1. 사용자의 모든 역할에 대한 권한 리스트를 수집합니다.
  2. 그중 하나라도 Deny에 매칭되면 즉시 차단합니다.
  3. Deny가 없고 하나라도 Allow에 매칭되면 통과시킵니다.
  4. 둘 다 없으면 기본적으로 차단(Default Deny)합니다.

RBAC의 특징 및 장점

- 역할 기반 관리
- 최소 권한 원칙
- 업무 분리
- 유연한 권한 변경
- 규정 준수 지원

 

RBAC의 핵심 요소

역할(Role): 시스템, 직무, 부서 단위 등의 역할 이름을 지어줍니다.
권한(Permission): 역할 별로 가능한 접근 권한 설정입니다. 보통 쓰기/읽기 기준으로 설정합니다.
사용자(User): 역할-권한을 사진 사용자 단위입니다.
범위(Scope): 리소스 범위입니다. 권한이 주어지는 데이터 범위를 말해요

반응형