BTP

사용자 ID 전달 안 하면 큰일 — Principal Propagation #shorts #SAP #BTP

▶ YouTube에서 보기

Principal Propagation이란

SAP BTP에서 애플리케이션이 백엔드 시스템(S/4HANA, SAP SuccessFactors 등)을 호출할 때, 실제 로그인한 사용자의 신원을 그대로 전달해야 하는 경우가 있습니다. 애플리케이션 자신의 기술 사용자(Service Account)가 아닌 실제 사용자 ID로 백엔드를 호출해야 권한 체크, 감사 로그, 개인화 데이터가 올바르게 동작합니다. 이 메커니즘을 Principal Propagation이라 합니다.

Principal Propagation이 없으면 무슨 일이 생기는가

Principal Propagation을 구성하지 않으면, BTP 앱이 S/4HANA를 호출할 때 항상 하나의 기술 사용자(예: SAP_BAPI_USER)로 요청이 갑니다. 이 경우 발생하는 문제:

  • S/4HANA 권한 체크가 실제 사용자 기반으로 동작하지 않음
  • 감사 로그에 기술 사용자만 기록되어 Who Did What 추적 불가
  • 개인화 설정(사용자별 언어, 회사 코드 등) 무시됨

BTP Connectivity 서비스를 통한 Principal Propagation 설정

BTP에서 Principal Propagation은 Destination 서비스와 Cloud Connector를 통해 구성합니다. Destination 설정에서 핵심 속성은 다음과 같습니다.

# Destination 설정 (BTP Cockpit)
Name: S4HANA_PROD
Type: HTTP
URL: https://s4hana.internal.company.com
Authentication: PrincipalPropagation
ProxyType: OnPremise
CloudConnectorVersion: 2

# Cloud Connector Location ID: CORP_DATACENTER

Authentication: PrincipalPropagation으로 설정하면, Connectivity 서비스가 BTP의 JWT 토큰에서 사용자 정보를 추출해 S/4HANA로 전달합니다.

CAP for Node.js에서 Principal Propagation 사용

// CDS 서비스 핸들러에서 Destination 호출
const cds = require('@sap/cds');

module.exports = cds.service.impl(async function() {
  this.on('getEmployeeData', async (req) => {
    // Destination 서비스는 현재 요청의 사용자 토큰을 자동으로 전달
    const S4 = await cds.connect.to('S4HANA_PROD');

    // Principal Propagation: 현재 로그인 사용자 ID로 S/4HANA 호출
    const empData = await S4.run(
      SELECT.from('A_BusinessPartner')
        .where({ BusinessPartner: req.data.partnerId })
    );

    return empData;
  });
});

CAP에서 cds.connect.to()로 Destination을 사용하면 현재 요청의 JWT 토큰이 자동으로 전달됩니다. Destination이 PrincipalPropagation으로 설정되어 있으면 S/4HANA는 실제 사용자 ID를 받습니다.

SAP Java SDK에서 Principal Propagation

import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
import com.sap.cloud.sdk.cloudplatform.connectivity.DestinationAccessor;
import com.sap.cloud.sdk.s4hana.connectivity.DefaultErpHttpDestination;

@GetMapping("/employee/{partnerId}")
public ResponseEntity<String> getEmployee(
    @PathVariable String partnerId
) {
    // PrincipalPropagation Destination 조회
    Destination destination = DestinationAccessor
        .getDestination("S4HANA_PROD")
        .asHttp();

    // 현재 요청 컨텍스트의 사용자 토큰이 자동 전달됨
    HttpClient client = HttpClientAccessor.getHttpClient(destination);
    // ... HTTP 호출 실행
}

Cloud Connector 설정에서 확인해야 할 사항

# Cloud Connector에서 Principal Propagation 활성화
# 1. Cloud Connector 관리 콘솔 접속
# 2. On-Premise to Cloud Connector → Principal Propagation 탭
# 3. X.509 인증서 기반 설정 또는 Kerberos/SPNEGO 설정
# 4. S/4HANA 시스템에서 신뢰하는 인증서 등록

# S/4HANA 측 설정 (SM59, STRUST)
# - BTP 서브어카운트 인증서를 신뢰 목록에 추가
# - ABAP 사용자 매핑 규칙 설정

JWT 토큰에서 사용자 정보 수동 추출 (디버깅용)

// CAP에서 현재 요청 사용자 확인
this.on('*', (req, next) => {
  const user = req.user;
  console.log('User ID:', user.id);
  console.log('Tenant:', req.tenant);
  console.log('Is Authenticated:', user.is('authenticated-user'));
  return next();
});

자주 발생하는 오류와 해결

  • 401 Unauthorized: Cloud Connector의 Principal Propagation 인증서가 S/4HANA에 등록되지 않음
  • 사용자 매핑 실패: BTP 이메일과 S/4HANA 사용자 ID 매핑 규칙 미설정
  • 기술 사용자로 호출됨: Destination Authentication 타입이 BasicAuthentication으로 설정되어 있음

공식 문서

Principal Propagation 전체 설정 가이드는 SAP BTP Connectivity 공식 문서에서 확인하세요. Cloud Connector와 BTP 서브어카운트 간 신뢰 설정 절차가 상세히 안내되어 있습니다.

댓글 0

아직 댓글이 없습니다.