1. CDS 뷰의 데이터 접근 제어(DCL) 기본 구조
ABAP CDS(Core Data Services) 뷰는 데이터 모델링의 핵심 요소이며, 보안 관점에서 DCL(Data Control Language)을 통해 행 수준(Row-level)의 접근 제어를 정의할 수 있습니다. DCL은 사용자의 권한 컨텍스트에 따라 조회 결과를 자동으로 필터링하여 민감한 데이터 노출을 방지하는 선언형 보안 메커니즘입니다.
1.1 완전 접근 권한(Full Access)
특정 조건 없이 뷰의 전체 데이터를 허용하는 가장基础的인 형태입니다. 주로 내부 테스트 또는 공개 데이터셋에 사용됩니다.
@AbapCatalog.sqlViewName: 'ZCDS_ALN_FULL'
@AccessControl.authorizationCheck: #CHECK
define view z_cds_airline_full
as select from scarr
{
key airline_id,
airline_name,
currency_code,
web_url
};
@MappingRole: true
define role z_dcl_airline_full {
grant select on z_cds_airline_full;
}
1.2 고정 값 조건(Literal Condition)
DCL 내에 직접 조건식을 명시하여 특정 값만 조회 가능하도록 제한합니다. 이는 개발 환경에서의 데이터 샘플링이나 고정된 마스터 데이터 접근에 유용합니다.
@AbapCatalog.sqlViewName: 'ZCDS_ALN_LIT'
@AccessControl.authorizationCheck: #CHECK
define view z_cds_airline_literal
as select from scarr
{
key airline_id,
airline_name,
currency_code,
web_url
};
@MappingRole: true
define role z_dcl_airline_literal {
grant select on z_cds_airline_literal
where airline_id = 'LH';
}
1.3 사용자 세션 기반 제어
현재 로그인한 사용자의 ID(` `user` `)와 매칭되는 레코드만 반환하도록 설정합니다. 개인별 설정 데이터나 작업 목록 조회 시 빈번히 활용됩니다.
@AbapCatalog.sqlViewName: 'ZCDS_USR_PROF'
@AccessControl.authorizationCheck: #CHECK
define view z_cds_user_profile
as select from usr21
{
key user_name,
logon_lang,
flag
};
@MappingRole: true
define role z_dcl_user_profile {
grant select on z_cds_user_profile
where user_name ?= aspect user;
}
2. PFCG 권한 객체 연동 및 커스텀 적용
실무에서는 정적 조건보다는 SAP의 표준 권한 관리 도구(PFCG)와 연동하는 방식을 선호합니다. 이를 위해서는 SU21 트랜잭션을 통해 권한 객체(Authorization Object)를 먼저 정의해야 합니다.
- 권한 객체 생성: SU21에서 클래스 BC_C 내에 객체(예: `ZS_ALN_AUTH`)를 생성하고, 필드(`AIRLINE_ID`) 및 활동 코드(`ACTVT: 03 조회`)를 정의합니다.
- CDS 뷰 정의:
@AbapCatalog.sqlViewName: 'ZCDS_ALN_PFCG'
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '항공사 마스터 데이터'
define view z_cds_airline_pfcg
as select from scarr
{
key airline_id,
airline_name,
currency_code,
web_url
};
- DCL 권한 매핑: ` `aspect pfcg_auth` ` 함수를 통해 시스템 권한을 참조합니다.
@MappingRole: true
define role z_dcl_airline_pfcg {
grant select on z_cds_airline_pfcg
where (airline_id) =
aspect pfcg_auth( 'ZS_ALN_AUTH', AIRLINE_ID, actvt = '03' );
}
- PFCG 역할 할당: 생성된 객체를 PFCG 트랜잭션의 커스텀 역할에 추가하고, 사용자에 할당합니다.
이제 해당 뷰에 접근할 때 PFCG에서 정의한 항공사 코드 범위 내에서만 데이터가 필터링됩니다. 단, ABAP Dictionary(SE11)를 통한 직접 조회는 DCL을 우회할 수 있으므로 주의가 필요합니다. 또한 ` `@AccessControl.authorizationCheck: #NOT_ALLOWED` `로 변경하면 보안 검사가 완전히 비활성화됩니다.
3. 분석형 뷰(Analytical View)의 권한 처리
S/4HANA 환경에서는 데이터 분석을 위해 ` `@Analytics.dataCategory: #CUBE` ` 또는 ` `#CONSUMPTION` ` 뷰를 활용합니다. 이러한 뷰의 권한 동작 방식은 표준 조회와 차이가 있습니다.
3.1 Cube 뷰에 대한 DCL 적용
분석 쿼리(Consumption View)의 하위 레이어인 Cube/Entity 뷰에 권한을 정의하는 것이 일반적입니다. OLAP 엔진은 런타임에 해당 레이어의 DCL을 참조하여 결과를 집계합니다.
@AbapCatalog.sqlViewName: 'ZCUBE_FLIGHT_D'
@AccessControl.authorizationCheck: #CHECK
@Analytics.dataCategory: #CUBE
define view z_cube_flight_data
as select from sflight
{
key airline_id,
flight_conn_id,
flight_date,
currency_code,
flight_price,
max_seats,
occupied_seats
};
@MappingRole: true
define role z_dcl_flight_analytics {
grant select on z_cube_flight_data
where (airline_id) =
aspect pfcg_auth( 'ZS_ALN_AUTH', AIRLINE_ID, actvt = '03' );
}
3.2 Consumption Query 뷰의 동작
소비자 뷰(Consumption Query) 자체에 별도의 DCL을 정의하지 않더라도, 상위 레이어인 Cube 뷰에 적용된 권한이 자동으로 계승됩니다. SAP HANA Studio의 데이터 미리보기에서는 필터링이 적용되지 않은 전체 데이터가 표시될 수 있으나, RSRT 트랜잭션이나 BO Analysis for Excel과 같은 실제 OLAP 기반 도구에서는 Cube 레이어의 권한이 정확하게 반영됩니다.
4. 복합 권한 로직(교집합, 합집합, 상속)
실제 비즈니스 요구사항은 단일 조건보다 복잡한 경우가 많습니다. DCL에서는 논리 연산자를 통해 다중 권한 객체를 결합할 수 있습니다.
4.1 교집합(AND 조건)
두 가지 권한 조건을 모두 만족해야 데이터를 조회할 수 있습니다. 예를 들어, 특정 항공사 코드와 특정 기간(예: `ZS_FL_DATE`)을 동시에 검증합니다.
@MappingRole: true
define role z_dcl_flight_and {
grant select on z_cube_flight_data
where (airline_id) =
aspect pfcg_auth( 'ZS_ALN_AUTH', AIRLINE_ID, actvt = '03' )
and (flight_date) =
aspect pfcg_auth( 'ZS_FL_DATE', FLIGHT_DATE, actvt = '03' );
}
4.2 합집합(OR 조건)
조건 중 하나라도 만족하면 조회가 허용됩니다. 이는 데이터 접근 범위를 확대할 때 유용합니다.
@MappingRole: true
define role z_dcl_flight_or {
grant select on z_cube_flight_data
where (airline_id) =
aspect pfcg_auth( 'ZS_ALN_AUTH', AIRLINE_ID, actvt = '03' )
or (flight_date) =
aspect pfcg_auth( 'ZS_FL_DATE', FLIGHT_DATE, actvt = '03' );
}
4.3 권한 상속(Inheritance)
기존에 정의된 DCL 역할을 그대로 수용하되, 추가적인 조건을 부가하거나 확장할 수 있습니다. 기존 역할에서 허용하지 않는 특정 통화를 추가 허용하는 경우를 예로 들 수 있습니다.
@MappingRole: true
define role z_dcl_flight_extended {
grant select on z_cube_flight_data
inherit z_dcl_flight_and or currency_code = 'USD';
}
5. 구현 시 주의사항 및 모범 사례
- 레이어별 권한 정의 위치: 분석용 데이터 모델링 시, 권한은 반드시 가장 하위에 위치한 CUBE 또는 ENTITY 뷰에서 정의해야 합니다. 상위의 QUERY 뷰에 동일하게 중복 정의할 경우, OLAP 엔진이 기대한 대로 동작하지 않거나 성능 저하가 발생할 수 있습니다.
- 미리보기 vs 런타임: 개발 도구상에서의 데이터 샘플링은 보안 컨텍스트를 완전히 시뮬레이션하지 않을 수 있습니다. 최종 검증은 실제 비즈니스 툴(SAC, BOBJ, FIORI) 또는 RSRT를 통해 수행해야 합니다.
- 권한 객체 설계: 필드 매핑 시 CDS 뷰의 컬럼명과 PFCG 객체 필드명이 정확히 일치해야 하며, 활동 코드(ACTVT)는 일반적으로 '03(조회)' 또는 '05(출력)'로 설정됩니다.
DCL을 활용하면 ABAP CDS 뷰에서 데이터 보안과 비즈니스 필터링을 선언형으로 처리할 수 있어, 복잡한 ABAP 코드 작성 없이도 유연하고 유지보수하기 쉬운 권한 체계를 구축할 수 있습니다.