JMatrixPlatform의 상태 기반 RBAC: 라이프사이클 인식 접근 제어
JMatrixPlatform은 권한을 객체의 상태에 직접 연결함으로써 역할 기반 접근 제어(RBAC)를 구현합니다. 모든 객체는 유형과 라이프사이클을 갖는데, 이 라이프사이클은 객체의 현재 상태를 반영하는 정의된 상태 시퀀스입니다. 객체가 생성될 때 그 유형과 연관된 라이프사이클이 지정되며, 초기 상태는 해당 라이프사이클의 첫 번째 상태로 자동 설정되거나 createAction에서 명시적으로 재정의될 수 있습니다.
단일 객체 유형이 여러 라이프사이클을 동시에 지원할 수 있습니다. 예시:
| 객체 | 유형 | 라이프사이클 | 상태 | 가능한 다음 상태 |
|------|------|--------------|------|-------------------|
| Obj1 | Type1| LC1 | Stat1| Stat1*, Stat2 |
| Obj2 | Type1| LC2 | Stat4| Stat1–4* |
| Obj3 | Type1| LC3 | Stat2| Stat1–3* |
대표적인 라이프사이클 사례:
- 문서 관리: 초안 → 게시 → 검토 → 보관 → 발행
- 참조 데이터: 신규 → 활성 → 사용 중단
상태 전이는 promote(전진) 또는 demote(후퇴) 메서드를 통해 수행되며, 전체 감사 로그는 object_states 테이블에 저장됩니다:
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
아직 댓글이 없습니다.