[Developer] #617 apply DDS MCP end-user authorization
This commit is contained in:
@@ -1,28 +1,23 @@
|
||||
# 함수 명세: `authenticateMcpBearer` (#617)
|
||||
|
||||
> **상태**: Draft · **분류**: 복잡 — 인증 저장소 I/O 및 fail-closed 경계
|
||||
> **상태**: Implemented · 구현: `DdsMcpBearerAuthenticator`
|
||||
|
||||
## 책임
|
||||
|
||||
MCP Tool 호출의 Bearer를 기존 애플리케이션 사용자로 해석한다. DDS 역할·DDL을 결정하지 않는다.
|
||||
|
||||
## 시그니처
|
||||
|
||||
`BearerToken -> AuthenticatedAppUser`
|
||||
MCP Tool 요청의 opaque Bearer를 활성 `CB_APP_USER`로 해석하고 해당 사용자의 게시된 local DDS principal을 반환한다. OCI IAM client-credentials token을 업무 사용자 token으로 해석하지 않는다.
|
||||
|
||||
## 입력과 출력
|
||||
|
||||
- 입력: `Authorization: Bearer <opaque-token>`에서 추출한 원문 token.
|
||||
- 출력: 활성 `CB_APP_USER`의 `userId`, 표시명, token 식별자, 검증 시각.
|
||||
- 입력: `Authorization: Bearer <opaque-token>`
|
||||
- 출력: `applicationUserId`, 표시 사용자명, `DDS_U_<id>`, data role 이름, lookup-key 참조
|
||||
|
||||
## 규칙
|
||||
|
||||
1. token 형식·길이를 먼저 검증한다.
|
||||
2. 해시 비교, 만료, 회수, 활성 사용자 여부를 한 트랜잭션에서 검증한다.
|
||||
3. token이 없거나 하나의 활성 사용자로 해석되지 않으면 동일한 권한 없음 결과를 반환한다.
|
||||
4. 원문 token, 해시, 사용자 상세를 로그·MCP 응답에 넣지 않는다.
|
||||
5. 각 Tool 호출마다 재검증한다. SSE 연결 생성 시점의 결과를 재사용하지 않는다.
|
||||
1. `CB_AGENT_BEARER_KEY`의 해시 일치, 만료·회수 여부와 `CB_APP_USER.active`를 매 Tool 요청마다 확인한다.
|
||||
2. `CB_DDS_END_USER_MAP`에서 `PUBLISHED` 상태의 사용자 매핑을 반드시 찾는다.
|
||||
3. 하나라도 없으면 `AUTHORIZATION_DENIED`로 끝내며 context attach 또는 보호 SQL을 호출하지 않는다.
|
||||
4. raw bearer와 hash는 로그·MCP 응답에 노출하지 않는다.
|
||||
|
||||
## 실패
|
||||
## 주의
|
||||
|
||||
`AUTHORIZATION_DENIED`로 fail-closed한다. DDS Context 부착과 DB Tool SQL을 호출하지 않는다.
|
||||
현재 opaque Bearer의 사용자 매핑이 DDS 집행 주체를 결정한다. OCI IAM JWT의 사람 claim을 직접 사용하는 기능은 별도 OBO/authorization-code 확장이다.
|
||||
|
||||
Reference in New Issue
Block a user