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

1.5 KiB

함수 명세: 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, 행, 컬럼이 각각 맞는지 확인한다.