37 lines
1.5 KiB
Markdown
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`, 행, 컬럼이 각각 맞는지 확인한다.
|