XSUAA OAuth2 설정에서 자주 발생하는 3가지 실수
SAP BTP XSUAA(Extended Services for User Account and Authentication)는 BTP 애플리케이션의 인증/인가를 담당합니다. OAuth2 기반으로 동작하며, xs-security.json 설정이 잘못되면 앱이 아예 실행되지 않거나, 권한 체크가 동작하지 않거나, 토큰이 너무 빨리 만료됩니다.
실수 1: xsappname 중복 또는 특수문자 포함
# 잘못된 xs-security.json
{
"xsappname": "My Sales App 2026", # 공백 포함 — 오류 발생
"tenant-mode": "dedicated"
}
# 또 다른 오류: 같은 서브어카운트에 동일 xsappname 사용
# 두 번째 XSUAA 인스턴스 생성 시 실패
# 올바른 방법: 영문 소문자, 숫자, 하이픈만 사용
{
"xsappname": "my-salesapp-prod-2026", # 허용
"tenant-mode": "dedicated",
"description": "My Sales App Production"
}
# xsappname 규칙:
# - 영문 소문자 + 숫자 + 하이픈(-) + 언더스코어(_)만 허용
# - 공백, 특수문자 금지
# - 서브어카운트 내 유일해야 함
# - 최대 100자
실수 2: Scope 이름과 Role Template 불일치
# 잘못된 설정: scope 이름과 role-template scope-references 불일치
{
"xsappname": "salesapp",
"scopes": [
{ "name": "$XSAPPNAME.SalesOrder_Read" } # 언더스코어
],
"role-templates": [
{
"name": "SalesViewer",
"scope-references": ["$XSAPPNAME.SalesOrderRead"] # 언더스코어 없음
}
]
}
# role-template이 존재하지 않는 scope를 참조 → 권한 체크 항상 실패
# 올바른 설정: scope 이름과 scope-references 완전 일치
{
"xsappname": "salesapp",
"scopes": [
{
"name": "$XSAPPNAME.SalesOrder.Read",
"description": "판매 주문 조회"
},
{
"name": "$XSAPPNAME.SalesOrder.Write",
"description": "판매 주문 생성/수정"
},
{
"name": "$XSAPPNAME.Admin",
"description": "관리자 전체 권한"
}
],
"role-templates": [
{
"name": "SalesViewer",
"description": "주문 조회 전용",
"scope-references": ["$XSAPPNAME.SalesOrder.Read"] # 정확히 일치
},
{
"name": "SalesManager",
"description": "주문 관리",
"scope-references": [
"$XSAPPNAME.SalesOrder.Read",
"$XSAPPNAME.SalesOrder.Write"
]
}
]
}
실수 3: 토큰 유효시간 설정 오류
# 잘못된 설정 1: token-validity 너무 짧음
{
"oauth2-configuration": {
"token-validity": 300 # 5분 — 세션이 너무 빨리 만료됨
}
}
# 잘못된 설정 2: refresh-token-validity 없음
{
"oauth2-configuration": {
"token-validity": 43200 # 12시간
# refresh-token-validity 없음 → 12시간마다 재로그인
}
}
# 올바른 설정: 업무 패턴에 맞는 토큰 유효시간
{
"xsappname": "salesapp",
"oauth2-configuration": {
"token-validity": 43200, # 12시간 (업무 시간 커버)
"refresh-token-validity": 604800, # 7일 (주중 재로그인 불필요)
"autoapprove": true # 사용자 동의 화면 스킵 (내부 앱)
}
}
# 타입별 권장 유효시간:
# 인터널 업무용: access=12h, refresh=7d
# 고객 포털: access=1h, refresh=1d
# API 전용: access=1h, refresh 없음
# 배치 프로세스: access=24h, 별도 기술 사용자 권장
XSUAA 설정 검증 방법
# XSUAA 토큰 내용 확인 (디버깅)
# 1. 앱 로그인 후 JWT 토큰 추출
# 2. jwt.io에서 디코딩 (운영 토큰은 절대 외부 사이트에 붙여넣기 금지!)
# 로컬 디코딩:
python3 -c "
import base64, json, sys
token = sys.argv[1].split('.')[1]
padding = 4 - len(token) % 4
token += '=' * padding
print(json.dumps(json.loads(base64.b64decode(token)), indent=2, ensure_ascii=False))
" YOUR_JWT_TOKEN
# 확인 항목:
# - scope: ["salesapp!t12345.SalesOrder.Read"] 형태로 포함되어 있는가
# - exp: 만료 시간이 적절한가
# - iss: 올바른 XSUAA 인스턴스 URL인가
CDS에서 XSUAA 스코프 연결
# service.cds
service SalesService @(requires: 'authenticated-user') {
@(restrict: [
{ grant: 'READ', to: 'SalesViewer' },
{ grant: 'CREATE', to: 'SalesManager' },
{ grant: 'UPDATE', to: 'SalesManager' }
])
entity Orders as projection on db.Orders;
}
# xs-security.json의 role-template 이름과 일치해야 함
공식 문서
XSUAA xs-security.json 전체 스펙은 SAP BTP XSUAA 공식 문서에서 확인하세요.
댓글 0
아직 댓글이 없습니다.