# HMM 휴가 팀 계층 VPD 적용·검증 보고서

- 일자: 2026-07-23
- Redmine: #707
- 브랜치: `hmm-backoffice`
- 대상 DB: HMMAIPOC `ADMIN`
- 대상 서비스: `https://hmm-backoffice.cloud-handson.com`

## 적용 결과

`database/adb/72_hmm_leave_team_vpd.sql`을 적용해 다음 구성을 활성화했다.

| 구성 | 결과 |
|---|---|
| 신뢰 컨텍스트 | `HMM_ACCESS_CTX` |
| 토큰 검증 패키지 | `HMM_ACCESS_CTX_PKG` / `VALID` |
| 정책 함수 | `HMM_LEAVE_VPD_FILTER` / `VALID` |
| 휴가 잔여 정책 | `HMM_LEAVE_BALANCES.HMM_LEAVE_SCOPE_POLICY` / `ENABLE=YES` |
| 휴가 신청 정책 | `HMM_LEAVE_REQUESTS.HMM_LEAVE_SCOPE_POLICY` / `ENABLE=YES` |
| 팀장 역할 | E1001 → `HMM_HR_MANAGER` |
| 팀원 역할 | E1002~E1007 → `HMM_HR_VIEWER` |
| 저장 권한 | 두 객체 × `ALL`, `MANAGED_TEAM`, `SELF` = 6건 |

## 실제 행 접근 검증

`ADMIN`에는 `EXEMPT ACCESS POLICY`가 있으므로 이를 결과 검증에 사용하지 않았다. 별도의 비면제
임시 DB 사용자를 만들고, SHA-256 해시만 DB에 저장한 임시 E1001/E1002 토큰으로 조회한 뒤
사용자와 토큰을 즉시 제거했다.

| 검증 세션 | 휴가 잔여 | 휴가 신청 | 교차 사용자 조건 조회 |
|---|---:|---:|---:|
| 컨텍스트 없음 | 0 | 0 | - |
| E1001 팀장 | 7 | 8 | 직접 보고 팀원 포함 |
| E1002 팀원 | 1 | 1 | E1003 신청 0 |
| 무효 토큰 | 0 | - | 컨텍스트 초기화·차단 |

결과: `VPD_VERIFY=PASS`

## 애플리케이션 검증

- Maven: 105 tests, 0 failures, 0 errors
- 배포 JAR SHA-256:
  `1b10582e72e4639902ea8f65156af1067941af3ef50cde1d9f767c88f048fb85`
- systemd: `vpd-backoffice.service` active
- 공개 로그인: HTTP 200
- 실제 브라우저 전수 검사:
  - 관리 화면 26개: 실패 0
  - HMM 정형 원장 6개: 실패 0
  - `ORA-*`, 데이터 처리 오류, KB/POC 잔존 문구: 0
  - page error: 0
  - console error: 0

특히 `/roles`, `/permissions`, `/vpd-policies`, `/vpd-filter-runtime`에서 HMM 역할 3개,
휴가 원장 권한 6개, 정책 2개와 `HMM_LEAVE_VPD_FILTER`가 표시되는 것을 화면으로 확인했다.

## 보안 정리

- DB 비밀번호, 토큰 원문, 해시는 Git·Redmine·보고서에 기록하지 않았다.
- 임시 비면제 DB 사용자는 검증 종료 시 `DROP USER ... CASCADE`로 제거했다.
- 임시 토큰 2건은 검증 종료 시 삭제했다.
- HR 관리자 역할은 전체 접근 규칙만 준비하고 데모 사용자에게 자동 부여하지 않았다.
