# Windows AD → OCI IAM → DDS 권한 매핑 (#744)
> **상태**: Keycloak 기반 Alice 허용/Bob 기본 거부 검증 완료 · OCI IAM AD Bridge 전환 진행 중
> **최종수정**: 2026-08-05
## 한눈에 보기
Windows AD의 계정으로 AIPF MCP에 로그인하고, Oracle Deep Sec(DDS)이 사용자마다 다른 데이터를 보이도록 하는 PoC다. 초기에는 Keycloak이 AD 인증을 OIDC token으로 바꿨다. 현재는 Keycloak을 OCI Identity Domain의 **AD Bridge + delegated authentication**으로 대체하는 중이다.
```mermaid
flowchart LR
U["AD 사용자
Alice / Bob"] --> A["Windows AD DS
계정·비밀번호 원천"]
A <--> B["OCI AD Bridge
동기화·인증 위임"]
B <--> I["OCI Identity Domain
SSO·OIDC token 발급"]
I --> P["AIPF
MCP OAuth 연결"]
P --> M["DDS MCP
JWT 검증·사용자 매핑"]
M --> D["Oracle DDS
DATA GRANT 집행"]
```
이 그림에서 기억할 점: **AD는 비밀번호를 확인하고, OCI Identity Domain은 로그인 화면과 JWT를 발급하며, Oracle DDS는 최종 데이터 권한을 강제한다.** AD Bridge는 그 사이를 연결하는 Windows 서비스다.
## 현재 검증 결과
| 항목 | 결과 |
|---|---|
| Keycloak → MCP → DDS 경로 | 완료 |
| `dds-alice`의 `휴가` 검색 | `휴가 정책 - Alice 전용 테스트` 1건 반환 |
| `dds-bob`의 같은 검색 | DATA GRANT 없음으로 default deny (`ORA-00942` 은닉) |
| OCI AIPF OAuth client | `AIPF_DDS_AD_TEST` 생성 및 OIDC discovery 확인 완료 |
| OCI AD Bridge client / AD 동기화 | 설치 완료 · Alice/Bob 2명과 `DDS-DDS-Users` 1개 import 성공 |
| OCI delegated authentication | AD 비밀번호 테스트·활성화 전 |
## 핵심 결정
1. 사용자 token과 DB service token은 분리한다.
- 사용자 token: 누가 MCP를 호출했는가
- DB service token: MCP service가 DDS context를 열 수 있는가
2. 사람별 권한 키는 검증된 `issuer + sub`이며, UPN/email은 표시·감사용이다.
3. DB 권한은 MCP가 아닌 Oracle DDS DATA ROLE/DATA GRANT에서 default deny로 집행한다.
4. OCI 전환은 기존 Keycloak을 즉시 제거하지 않고, OCI 경로의 Alice/Bob 결과가 같은지 확인한 뒤에만 완료한다.
## 문서 지도
| 필요한 경우 | 읽을 문서 |
|---|---|
| 전체 신뢰 경계, token 두 종류, DB/DDS 매핑 구조를 이해할 때 | [아키텍처 상세](architecture.md) |
| OCI AD Bridge 설치, OCI OAuth client 등록, AIPF/MCP 전환을 수행할 때 | [적용 Cookbook](cookbook.md) |
| 로그인·callback·token·LDAPS·권한 오류를 진단할 때 | [트러블슈팅](troubleshooting.md) |
| 저장소 전체 문서 작성 구조를 확인할 때 | [문서 구조 표준](../../DOCUMENTATION-STANDARDS.md) |
## 전환 완료 기준
- OCI AD Bridge가 `dds-alice`, `dds-bob`과 필요한 AD 그룹을 동기화한다.
- OCI Identity Domain login이 두 사용자의 **AD 비밀번호**로 delegated authentication을 통과한다.
- AIPF가 OCI OAuth login 후 MCP에 연결된다.
- OCI JWT의 `issuer + sub`가 각각 `DDS_U_1`, `DDS_U_2`로 매핑된다.
- 동일한 `휴가` 검색에서 Alice는 1건을 받고 Bob은 default deny가 유지된다.
## 보안 원칙
AD 사용자 비밀번호, OAuth client secret, OCI service client secret, access/refresh token은 문서·Git·대화에 적지 않는다. 위치, rotation 절차, 안전한 입력 방법만 [Cookbook](cookbook.md)에 기록한다.