<!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/layout :: head('보호 대상 관리')}"></head>
<body>
<nav th:replace="~{fragments/layout :: nav}"></nav>

<main class="container py-4">
  <header class="hero">
    <span class="eyebrow">DEEP DATA SECURITY · KNOWLEDGE POLICY</span>
    <h1>보호 대상 관리</h1>
    <p class="lead">벡터화된 지식자료와 접근 분류값을 기준으로 접근 범위를 관리합니다.</p>
    <details class="explanation">
      <summary>도움말</summary>
      <p>세일즈 사용자의 Bearer 토큰은 공통 권한 테이블의 <code>agent_sales</code>로 매핑됩니다. 역할에 <code>ALLOW TAG SALES</code>가 있으면 보호 VIEW의 <code>TECH_TAG</code> 값에 SALES가 포함된 청크만 DDS Data Grant를 통과합니다.</p>
      <p class="mb-0">문서가 벡터로 검색된다는 점은 검색 방식이고, 어떤 사용자가 볼 수 있는지는 청크에 저장된 분류값과 권한 규칙이 결정합니다.</p>
    </details>
  </header>

  <section th:replace="~{fragments/layout :: architectureStrip('search')}"></section>

  <section class="flow-grid" aria-label="DDS 지식 접근 흐름">
    <article class="flow-card">
      <div><span class="eyebrow">IDENTITY</span><h2>업무 사용자 토큰</h2><p>Bearer 토큰을 세일즈 업무 사용자로 매핑합니다.</p></div>
    </article>
    <article class="flow-card">
      <div><span class="eyebrow">POLICY</span><h2>보호 규칙</h2><p>보호 VIEW의 접근 조건과 컬럼 범위를 선언합니다.</p></div>
    </article>
    <article class="flow-card">
      <div><span class="eyebrow">VALUE</span><h2>접근 분류값</h2><p>허용된 분류값이 붙은 자료만 남깁니다.</p></div>
    </article>
  </section>

  <section class="panel">
    <div class="panel-heading">
      <div>
        <span class="eyebrow">BUSINESS SCENARIO</span>
        <h2>업무 사용자 검색 예시</h2>
        <p>권한 관리에서 정의한 사용자·역할·규칙이 벡터 지식 검색 결과에 어떻게 적용되는지 확인합니다.</p>
      </div>
      <a class="btn btn-primary" href="/vector-knowledge">토큰 지식 검색 열기</a>
    </div>
    <div class="matrix-grid">
      <div class="matrix-card"><strong>업무 사용자</strong><span>agent_sales</span><small>SALES 부서 · Bearer 토큰으로 식별</small></div>
      <div class="matrix-card"><strong>역할</strong><span>SALES_KNOWLEDGE_ROLE</span><small>세일즈 지식 접근 역할</small></div>
      <div class="matrix-card"><strong>접근 규칙</strong><span>SALES 허용</span><small>접근 분류값에 SALES 포함</small></div>
      <div class="matrix-card"><strong>결과</strong><span>청크 28004</span><small>세일즈 파이프라인 운영 가이드만 반환</small></div>
    </div>
  </section>

  <section class="panel">
    <div class="panel-heading">
      <div>
        <span class="eyebrow">PROTECTED OBJECT</span>
        <h2>보호 범위</h2>
        <p>지식 검색 VIEW와 그 안의 분류 컬럼 값을 기준으로 판단합니다.</p>
      </div>
    </div>
    <div class="table-responsive">
      <table class="table align-middle">
        <thead><tr><th>구성</th><th>현재 예제</th><th>권한 판단</th></tr></thead>
        <tbody>
        <tr><td>보호 객체</td><td><code th:text="${vectorObject}">ADMIN.CB_DDS_VECTOR_SEARCH_DOCUMENTS</code></td><td>객체별 보호 규칙</td></tr>
        <tr><td>접근 분류 컬럼</td><td><code>TECH_TAG</code></td><td>허용된 분류값 포함 여부</td></tr>
        <tr><td>업무 규칙</td><td><code>ALLOW TAG SALES</code></td><td>공통 CB_PERMISSION_RULE에서 조회</td></tr>
        <tr><td>검색 컬럼</td><td><code>EMBEDDING</code></td><td>거리 계산에 사용하며 응답에는 반환하지 않음</td></tr>
        </tbody>
      </table>
    </div>
  </section>

  <section class="panel">
    <div class="panel-heading">
      <div>
        <span class="eyebrow">IMPLEMENTATION</span>
        <h2>보호 범위 변경 기준</h2>
      </div>
    </div>
    <ol>
      <li>문서 청킹·임베딩 시 청크에 업무 분류값을 저장합니다. 예: <code>SALES</code>, <code>HR</code>, <code>FINANCE</code>.</li>
      <li>권한 관리에서 역할에 허용할 분류값을 <code>TAG</code> 규칙으로 등록합니다.</li>
      <li>보호 VIEW별 Data Grant predicate가 해당 컬럼 값을 공통 권한체계와 비교합니다.</li>
      <li>허용·차단·만료된 토큰으로 결과를 확인합니다.</li>
    </ol>
    <p class="mb-0"><a href="/permissions">권한 관리</a>에서 규칙을 확인하고, <a href="/vector-knowledge">지식 검색</a>에서 실제 반환 청크를 확인하세요.</p>
  </section>
</main>
</body>
</html>
