홈으로 돌아가기

JMatrixPlatform의 상태를 사용한 RBAC

JMatrixPlatform은 RBAC와 객체 상태를 결합하여 세밀한 액세스 제어를 제공합니다. SQL 수준에서 필터링이 적용되며, 상태는 감사됩니다. 역할, 정책 구성 및 승격/강등 메서드 예제가 제공됩니다.

JMatrix의 상태-역할 RBAC: 코드와 실습
Advertisement 728x90

JMatrixPlatform의 상태 기반 RBAC: 라이프사이클 인식 접근 제어

JMatrixPlatform은 권한을 객체의 상태에 직접 연결함으로써 역할 기반 접근 제어(RBAC)를 구현합니다. 모든 객체는 유형과 라이프사이클을 갖는데, 이 라이프사이클은 객체의 현재 상태를 반영하는 정의된 상태 시퀀스입니다. 객체가 생성될 때 그 유형과 연관된 라이프사이클이 지정되며, 초기 상태는 해당 라이프사이클의 첫 번째 상태로 자동 설정되거나 createAction에서 명시적으로 재정의될 수 있습니다.

단일 객체 유형이 여러 라이프사이클을 동시에 지원할 수 있습니다. 예시:

| 객체 | 유형 | 라이프사이클 | 상태 | 가능한 다음 상태 |

Google AdInline article slot

|------|------|--------------|------|-------------------|

| Obj1 | Type1| LC1 | Stat1| Stat1*, Stat2 |

| Obj2 | Type1| LC2 | Stat4| Stat1–4* |

Google AdInline article slot

| Obj3 | Type1| LC3 | Stat2| Stat1–3* |

대표적인 라이프사이클 사례:

  • 문서 관리: 초안 → 게시 → 검토 → 보관 → 발행
  • 참조 데이터: 신규 → 활성 → 사용 중단

상태 전이는 promote(전진) 또는 demote(후퇴) 메서드를 통해 수행되며, 전체 감사 로그는 object_states 테이블에 저장됩니다:

Google AdInline article slot
create table object_states (
    object_id uuid not null,
    policy_state varchar(100) not null,
    user_id uuid not null,
    state_start timestamp not null,
    state_end timestamp
);

감사 로그를 활용해 프로세스 지연 분석이 가능합니다: SELECT user_id FROM object_states WHERE policy_state = ? AND (state_end - state_start) >= ?.

역할 및 정책 구성

역할은 JRole을 확장합니다:

@JModelPart
public final class ARLReferenceAdmin extends JRole {
  public final static ARLReferenceAdmin ROLE = new ARLReferenceAdmin();

  @Override
  public Set<JRole> getParents() {
    return Set.of(ARLRefDesigner.ROLE, ARLRefChangeManagementAdmin.ROLE, ARLRefApprover.ROLE);
  }

  @Override
  public String getDescription() {
    return "참조 데이터 관리자";
  }
}

라이프사이클은 JPolicy를 확장합니다:

@JModelPart
public final class ALCReference extends JPolicy {
  public final static ALCReference POLICY = new ALCReference();

  @Override
  public Set<JType> getTypes() {
    return Set.of(ATPReference.TYPE);
  }
  
  @Override
  public List<JState> getStates() {
    return List.of(New.STATE, Active.STATE, Inactive.STATE);
  }

  public static final class New extends JPolicy.JState {
    public static final New STATE = new New();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.ALL));
    }
  }

  public static final class Active extends JPolicy.JState {
    public static final Active STATE = new Active();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(
        new RoleAccess(JPublic.ROLE, AccessType.READ),
        new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.PROMOTE, AccessType.DEMOTE));
    }
  }

  public static final class Inactive extends JPolicy.JState {
    public static final Inactive STATE = new Inactive();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(
        new RoleAccess(JPublic.ROLE, AccessType.READ),
        new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.DEMOTE));
    }
  }
}

AccessType 값 설명:

  • ALL: 완전한 제어 권한
  • READ: 조회 전용
  • CREATE: 새 인스턴스 생성
  • MODIFY: 기존 데이터 수정
  • DELETE: 객체 삭제
  • RELEASE: 버전 관리
  • PROMOTE: 다음 상태로 전진
  • DEMOTE: 이전 상태로 후퇴
  • CHECKIN: 파일 업로드
  • CHECKOUT: 파일 다운로드

객체 생성 예시:

JDomainObject obj = new JDomainObject();
obj.create(ctx, ATPDocuments.TYPE, ALCDocument.POLICY);

플랫폼은 CREATE 권한을 초기 상태 기준으로 검증합니다. 상태 전이는 다음과 같이 수행합니다:

obj.promote(ctx); // 전진
obj.demote(ctx);  // 후퇴

데이터베이스 수준 권한 부여 메커니즘

JWT 역할은 Keycloak과 통합되며, 행 수준 필터링은 SQL 쿼리 내에서 직접 적용됩니다 — 즉, 인가 없이 데이터가 데이터베이스 외부로 유출되는 일이 절대 없습니다.

최대 접근 권한

JSystemAdmin은 모든 검사를 우회하여 최고 수준의 처리량을 보장합니다.

상태 기반 접근 제어

예시 접근 매트릭스:

| 역할 | 신규 | 활성 | 사용 중단 |

|-----------------------|--------------|---------------------------|---------------|

| ARLReferenceAdmin | ALL | READ, PROMOTE, DEMOTE | READ, DEMOTE |

| JPublic | #NOACCESS | READ | READ |

JPublic의 경우: WHERE policy_state IN ('ALCReference.Active', 'ALCReference.Inactive').

관리자의 경우: 상태 제한 없음. 최적화 참고: 정책당 최대 약 100개 상태; 임시 테이블 기반 필터링 검토 중.

속성 기반 필터링

개발 중. 현재 접근 검사를 위한 재귀적 관계 탐색은 성능상 비효율적입니다.

핵심 요약

  • 상태가 RBAC에 네이티브로 통합되어, 세밀하고 비파괴적인 접근 제어가 가능합니다.
  • object_states 테이블에 완전한 상태 감사 추적이 기록되어 프로세스 분석 및 규정 준수 보고서 작성에 활용됩니다.
  • SQL 수준 필터링을 통해 민감한 데이터는 명시적 인가 없이는 데이터베이스 외부로 유출되지 않습니다.
  • 모든 promote/demote 동작은 사용자 ID와 타임스탬프와 함께 기록됩니다.
  • Keycloak 역할이 JWT 토큰으로 원활하게 동기화됩니다.

— Editorial Team

Advertisement 728x90

다음 읽기