4.1 KiB
4.1 KiB
설계서: 전체 벡터 접근 역할의 ALL predicate 정규화 (#573)
상태: Implemented · QA passed 작성: [AI] Architect · 최종수정: 2026-06-30 추적성 — Redmine: #573 · 선행 기능: #558, #570, #572 · 구현 파일:
32_dds_vector_tag_setup.sql,38_agent_ords_vector_all_permission_normalization.sql,29_agent_ords_vector_search_ords.sql,OrdsProbeService· 테스트:OrdsProbeServiceTest,GuidedFlowTemplateTest,mvn test, 운영 vector probe
1. 목적
기본 벡터 접근은 역할 기반 whitelist다. 기본 역할(10·20·30)에 CB_VECTOR_SEARCH_DOCUMENTS / SELECT / ALLOW / ALL을 저장하고, 그 역할을 가진 사용자는 전체 벡터 청크를 조회한다. 역할 권한이 없는 사용자는 VPD의 fail-closed predicate 1 = 0으로 차단한다.
TAG, 부서, 소유자 같은 행 조건은 관리자가 ALL rule이 없는 제한 역할에 실제로 등록했을 때만 추가한다. 기본 예제 역할에 임의의 TAG rule을 넣지 않는다.
| 역할 | permission rule | VPD predicate | effective SQL 권한 조건 |
|---|---|---|---|
HR_DEPT_ROLE |
ALL |
1 = 1 |
조건 생략 |
FIN_SELF_ROLE |
ALL |
1 = 1 |
조건 생략 |
ALL_DOC_ROLE |
ALL |
1 = 1 |
조건 생략 |
| 관리자가 TAG rule을 준 역할 | TAG: ... |
TAG OR | AND (REGEXP_LIKE(...)) |
| 권한 없음 | allow rule 없음 | 1 = 0 |
AND (1 = 0) |
2. 범위
- 초기화 SQL에서 기본 역할 10·20·30의 개별 TAG rule을 제거하고
ALLrule을 보장. - 이미 설치된 DB를 위한 idempotent migration SQL 제공 및 운영 적용.
- vector ORDS/백오피스 effective SQL trace에서 predicate가
1 = 1이면AND절을 출력하지 않음. - 특정 TAG role의
REGEXP_LIKEfilter와 fail-closed1 = 0은 유지.
3. 인수조건
- 기본 whitelist 역할 사용자(
이에이치알,박파이넨스,김어드민)의 VPD predicate가 정확히1 = 1이다. - 기본 whitelist 역할의 vector effective SQL에
REGEXP_LIKE와AND (1 = 1)이 없다. - 관리자가 TAG rule을 실제로 부여한 역할만 해당 TAG predicate를 포함한다.
- 기본 역할 10·20·30의 기존 vector TAG rule은 migration 후 제거되고 ALL rule은 각 한 개만 존재한다.
- 권한 없는 사용자 결과는 기존 fail-closed semantics를 유지한다.
- SQL trace에 Bearer 원문·임베딩 숫자가 포함되지 않는다.
4. 구현 흐름
whitelist role
→ CB_PERMISSION (CB_VECTOR_SEARCH_DOCUMENTS / SELECT / ALLOW)
→ CB_PERMISSION_RULE (ALL)
→ CB_AGENT_DOC_VPD_FILTER = 1 = 1
→ vector effective SQL: base VECTOR_DISTANCE query only
기존 기본 역할의 TAG rule은 현재 fixture의 태그만 허용할 뿐 이후 추가되는 청크를 불필요하게 막는다. 기본 whitelist는 ALL rule로 유지하고, 제한이 필요한 역할에만 명시적 행 rule을 부여한다.
5. 검증
vectorEffectiveSql(..., "1 = 1")가AND (1 = 1)을 만들지 않는 단위 테스트.- setup/migration source가 role 30의 ALL rule과 TAG rule 정리를 포함하는 템플릿/소스 테스트.
mvn test.- 운영 smoke:
tempUserId=101,102,103으로 vector/probe를 실행해 모두VPD predicate = 1 = 1,REGEXP_LIKE없는 effective SQL,SCORETop-K를 확인한다. 권한 없는 별도 사용자는1 = 0인지 확인한다.
6. 구현·QA 결과
38_agent_ords_vector_all_permission_normalization.sql을 운영 DB에 적용해 기본 role 10·20·30의 legacy TAG rule을 제거하고ALLrule을 보장했다.- ORDS vector handler(29)를 재등록하고 백오피스를 배포했다.
mvn test: 59 tests, 0 failures.- 운영
/probesmoke(2026-06-30):이에이치알(101),박파이넨스(102),김어드민(103)모두1 = 1 (ALL: 추가 행 필터 없음)및WHERE d.embedding IS NOT NULL ORDER BY score를 반환했다. 세 결과에REGEXP_LIKE와AND (1 = 1)은 없었다. - 권한 없는 역할의 VPD 함수 경로는 변경하지 않아 기존
1 = 0fail-closed 동작을 유지한다.