Files
vpd-permission-poc/docs/design/617-dds-mcp-end-user-context/fn-with-dds-end-user-context.md

37 lines
1.5 KiB
Markdown

# 함수 명세: `withDdsEndUserContext` (#617)
> **상태**: Draft · **분류**: 복잡 — 연결 풀 보안 경계
## 책임
한 DB 작업을 정확히 하나의 local DDS END USER Context 안에서 실행하고, 어떤 종료 경로에서도 Context를 해제한다.
## 시그니처
`(DdsPrincipal, SqlWork<T>) -> T`
## 입력
- `DdsPrincipal`: 게시된 DDS END USER 이름, lookup key 참조, 사용자 ID, 게시 version.
- `SqlWork<T>`: 보호 객체를 읽거나 쓰는 제한된 Tool DB 작업.
## 알고리즘
1. `DdsPrincipal`이 활성·게시 완료 상태인지 확인한다.
2. 공용 연결을 획득하고 서비스 database-access token을 얻는다.
3. local END USER 이름과 lookup key로 DDS Context를 부착한다.
4. `SqlWork`를 실행한다. Repository는 Context 설정/해제를 직접 호출할 수 없다.
5. 성공·실패·취소·시간초과와 무관하게 `finally`에서 Context를 해제한다.
6. 해제 실패는 연결을 풀에 반환하지 않고 폐기한다.
## 보안 불변식
- 하나의 Tool DB 작업에는 하나의 DDS END USER만 존재한다.
- 이전 Tool의 Context가 다음 Tool에 남아서는 안 된다.
- Context 부착 이전과 해제 이후에는 보호 SQL을 실행하지 않는다.
- local END USER의 DATA ROLE은 payload로 임의 추가하지 않고, 게시된 DDS DDL에서만 얻는다.
## 스파이크 확인
동일 풀 연결에서 사용자 A → B → A와 동시 요청을 실행해 `ORA_END_USER_CONTEXT.username`, 행, 컬럼이 각각 맞는지 확인한다.