피드로 돌아가기
Dev.toBackend
원문 읽기
SAP CAP Java가 XSUAA 기반 JWT 인증과 CDS 선언형 권한 모델(@requires, @restrict)을 통합하여 멀티테넌트 환경에서 역할 기반 및 인스턴스 기반 접근 제어 구현
CAP Security & Authorization — XSUAA, @restrict & Multi-Tenant Auth
AI 요약
Context
엔터프라이즈 애플리케이션에서 복잡한 권한 관리를 프로그래매틱하게 구현하면 비즈니스 로직과 보안이 혼재되어 유지보수가 어렵다. 멀티테넌트 환경에서 테넌트 간 데이터 격리와 사용자별 행 수준 접근 제어를 동시에 처리해야 한다.
Technical Solution
- JWT 기반 인증 흐름 도입: 브라우저 → Approuter → XSUAA → CAP Java 서버로 토큰 발급 및 검증 파이프라인 구성
- @requires 어노테이션으로 역할 기반 서비스/엔티티 전체 접근 제어: 'authenticated-user', 'Admin', 'Viewer' 등 역할명으로 선언
- @restrict 어노테이션으로 작업 단위 세분화된 권한 제어: grant(READ/WRITE/*) + to(역할) + where(조건식) 조합으로 구성
- 인스턴스 기반 권한 제어 구현: $user, $user.<attr>, $now 의사변수를 활용하여 WHERE 절에서 행 수준 필터링(예: createdBy = $user)
- 속성 기반 접근 제어(ABAC) 지원: JWT의 xs.user.attributes에서 Country, CostCenter 등 사용자 속성을 추출하여 데이터 필터링
- xs-security.json으로 스코프-역할 매핑 관리: XSUAA 스코프(my-app!t12345.Viewer)를 비즈니스 역할(Viewer)로 변환하는 role-templates 정의
- 프로그래매틱 권한 검증 API 제공: CdsCreateEventContext.getUserInfo()로 핸들러 내에서 사용자 ID, 역할, 속성에 접근 가능
- 테스트용 모의 사용자 설정: application.yaml의 mock.users에서 개발 시 인증 모드를 dummy로 설정하여 테스트 사용자 정의
- @WithMockUser 어노테이션으로 권한 통합 테스트: 특정 역할과 속성을 가진 모의 사용자로 API 엔드포인트 테스트
Key Takeaway
CAP의 선언형 권한 모델은 CDS 정의에서 보안 규칙을 코드로 분산시키지 않고 중앙화하여 감시, 감사, 유지보수를 용이하게 한다. 멀티테넌트 시스템에서 CAP은 zid 클레임으로 자동 테넌트 격리를 제공하므로 핸들러에서 manual WHERE 절을 작성하는 것을 피해야 한다.
실천 포인트
CAP Java 기반 엔터프라이즈 서비스 개발 시 모든 데이터 접근을 CDS의 @requires(역할 기반) 또는 @restrict(세분화된 작업 + 조건식)로 선언하면, 비즈니스 로직에서 권한 검증 코드를 제거하고 xs-security.json의 역할 정의 변경만으로 권한 정책을 동적으로 관리할 수 있다. 특히 instance-based authorization(where: 'createdBy = $user')과 attribute-based authorization(where: 'country = $user.Country')을 조합하면 행 수준 접근 제어를 복잡한 프로그래밍 없이 구현할 수 있다.