Image rights / copyright detection system: SQLite store, HTTP app, search integrations (Naver, Google Custom Search, Google Cloud Vision web detection), image analysis (fingerprints, face/person detection, evidence enrichment, risk scoring), an admin/review layer, governance and retention policies, batch jobs, and a browser-based operator GUI. This baseline incorporates a full code-review remediation pass (46 fixes; 358 tests passing). Highlights: CRITICAL - Prevent evidence cascade-delete during the schema-constraint migration by disabling FK enforcement around the table rebuild. Security - Sandbox served media (neutralize stored XSS from uploaded/collected SVGs) via CSP + nosniff on the untrusted media routes. - Strip embedded EXIF/GPS from external image derivatives before they are sent to third-party APIs. - Return a clean 404 (not an uncaught StopIteration) for PATCH on an unknown provider. Correctness - LLM-summary failures no longer add +30 to the risk score. - Decode only explicit JS escapes so Korean image URLs are not mangled. - Consume search quota only after a successful request. - Naver/Google adapters map responses inside the failure boundary, so a malformed response degrades to evidence instead of crashing enrichment. - Domain-aware provider attribution; face-box IoU de-duplication; count searches (not result items); per-box crop isolation; clamp evidence confidence and Google CSE num; real submittedEpoch; and more. Robustness - Offline LLM connect fast-fails (short connect timeout) so seed/reload requests are not stalled; full read timeout preserved for generation. - Malformed numeric env vars fall back to defaults instead of crashing startup. Performance - Per-submission evidence reads (no full-table scan per rescore), audit-log LIMIT, lazy active-store lookup, hoisted timestamps. Tests - ~24 regression tests added pinning the above fixes. Runtime data (data/, outputs/, *.sqlite3, *.log), secrets (.env), and node_modules are gitignored.
257 lines
12 KiB
HTML
257 lines
12 KiB
HTML
<!doctype html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Copyrighter | 저작권 검수 소개</title>
|
|
<link rel="stylesheet" href="pitch.css">
|
|
</head>
|
|
<body>
|
|
<header class="site-header" aria-label="Copyrighter 소개 내비게이션">
|
|
<a class="brand" href="pitch.html" aria-label="Copyrighter 소개 상단">
|
|
<span class="brand-mark">CR</span>
|
|
<span>
|
|
<strong>Copyrighter</strong>
|
|
<small>저작권 검수 플랫폼</small>
|
|
</span>
|
|
</a>
|
|
<nav class="top-nav" aria-label="페이지 섹션">
|
|
<a href="#pipeline">판별 방식</a>
|
|
<a href="#operator">운영 화면</a>
|
|
<a href="#loop">DB 성장</a>
|
|
<a href="#governance">거버넌스</a>
|
|
</nav>
|
|
<a class="console-link" href="index.html">운영 콘솔 열기</a>
|
|
</header>
|
|
|
|
<main>
|
|
<section class="hero section-band">
|
|
<div class="hero-copy reveal">
|
|
<p class="eyebrow">Evidence-led copyright review</p>
|
|
<h1>이미지 저작권 심사를<br>검색 결과가 아니라,<br>판정 가능한 증거 체계로<br>바꿉니다.</h1>
|
|
<p class="lead">
|
|
Copyrighter는 로컬 이미지 지문, Google 웹 탐지, Naver 텍스트 검색, 내부 LLM 요약,
|
|
운영자 판정 이력을 한 화면에서 묶어 저작권 위험을 빠르게 걸러냅니다.
|
|
</p>
|
|
<div class="hero-actions" aria-label="주요 행동">
|
|
<a class="primary-action" href="#pipeline">판별 흐름 보기</a>
|
|
<a class="secondary-action" href="index.html">실제 콘솔 보기</a>
|
|
</div>
|
|
</div>
|
|
<figure class="hero-visual reveal">
|
|
<img src="pitch-assets/case-review.png" alt="Copyrighter 케이스 심사 화면 캡처">
|
|
<figcaption>실제 9500 운영 콘솔: 제출 이미지, 검색 근거, 위험 점수, 운영자 판정이 한 화면에 결합됩니다.</figcaption>
|
|
</figure>
|
|
<aside class="metric-rail reveal" aria-label="현재 로컬 운영 상태">
|
|
<div>
|
|
<strong id="metric-submissions">-</strong>
|
|
<span>제출 케이스</span>
|
|
</div>
|
|
<div>
|
|
<strong id="metric-evidence">-</strong>
|
|
<span>저장 증거</span>
|
|
</div>
|
|
<div>
|
|
<strong id="metric-knowledge">-</strong>
|
|
<span>기준 DB</span>
|
|
</div>
|
|
<div>
|
|
<strong id="metric-providers">-</strong>
|
|
<span>활성 외부 검색 tool</span>
|
|
</div>
|
|
</aside>
|
|
</section>
|
|
|
|
<section id="pipeline" class="section-band narrative">
|
|
<div class="section-heading reveal">
|
|
<p class="eyebrow">판별 방식</p>
|
|
<h2>위험 점수는 단일 모델이 아니라, 여러 근거를 결합한 운영자용 triage 신호입니다.</h2>
|
|
<p>
|
|
원본 이미지는 로컬 저장소에 두고, 내부 분석과 승인된 외부 API 결과를 각각 증거로 저장합니다.
|
|
점수는 판정자를 돕는 신호이며 승인, 보류, 반려는 운영자가 기록합니다.
|
|
</p>
|
|
</div>
|
|
<div class="diagram-shell reveal">
|
|
<img src="pitch-assets/risk-pipeline.svg" alt="제출 이미지에서 운영자 판정까지 이어지는 저작권 위험 판별 파이프라인">
|
|
</div>
|
|
<details class="mermaid-source reveal">
|
|
<summary>Mermaid 원본 보기</summary>
|
|
<pre><code>flowchart LR
|
|
A[제출 이미지] --> B[로컬 분석]
|
|
B --> C[이미지 지문]
|
|
B --> D[얼굴/인물 감지]
|
|
B --> E[Google Web Detection]
|
|
B --> F[Naver 텍스트 검색]
|
|
C --> G[기준 DB / 주의 후보 유사도]
|
|
D --> H[증거 보드]
|
|
E --> H
|
|
F --> H
|
|
G --> H
|
|
H --> I[위험 점수]
|
|
I --> J[운영자 승인/보류/반려]</code></pre>
|
|
</details>
|
|
</section>
|
|
|
|
<section id="operator" class="section-band proof-section">
|
|
<div class="section-heading reveal">
|
|
<p class="eyebrow">운영 화면</p>
|
|
<h2>판정자는 점수 하나가 아니라, 이미지와 출처가 연결된 증거 묶음을 봅니다.</h2>
|
|
</div>
|
|
<div class="proof-grid">
|
|
<figure class="product-shot wide reveal">
|
|
<img src="pitch-assets/case-review.png" alt="케이스 심사 증거 보드">
|
|
<figcaption>상위 근거를 먼저 보여주고, 낮은 증거는 자세히 보기로 접어 검토 피로를 줄입니다.</figcaption>
|
|
</figure>
|
|
<div class="proof-notes reveal">
|
|
<article>
|
|
<h3>상위 근거 우선</h3>
|
|
<p>동일 이미지, 부분 매칭, 출처 페이지, 얼굴 영역 웹 근거를 그룹화해 판단 순서를 만듭니다.</p>
|
|
</article>
|
|
<article>
|
|
<h3>증거 상태 기록</h3>
|
|
<p>판단에 사용, 무관, 오탐, 보류 표시가 케이스 기록과 점수 반영 여부를 분리합니다.</p>
|
|
</article>
|
|
<article>
|
|
<h3>이미지 중심 확인</h3>
|
|
<p>검색 결과는 썸네일, 출처 링크, 검색 tool 점수와 함께 보여 판단자가 탭을 오가지 않게 합니다.</p>
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="section-band split-proof">
|
|
<div class="section-heading reveal">
|
|
<p class="eyebrow">외부 검색 연결</p>
|
|
<h2>Google과 Naver는 같은 의미가 아닙니다. 이미지는 Google, 키워드는 Naver가 보강합니다.</h2>
|
|
</div>
|
|
<figure class="product-shot reveal">
|
|
<img src="pitch-assets/evidence-search.png" alt="검색 증거 화면">
|
|
<figcaption>Google Web Detection과 Naver Image Search API 결과를 증거로 쌓고 운영자가 확인합니다.</figcaption>
|
|
</figure>
|
|
<div class="boundary-list reveal" aria-label="외부 API 경계">
|
|
<article>
|
|
<span>Google</span>
|
|
<strong>승인된 파생 이미지 기반 웹 탐지</strong>
|
|
<p>동일 이미지, 부분 매칭, 포함 페이지, 유사 이미지 근거를 가져옵니다.</p>
|
|
</article>
|
|
<article>
|
|
<span>Naver</span>
|
|
<strong>텍스트 쿼리 기반 이미지 검색</strong>
|
|
<p>원본 이미지나 파생 이미지를 Naver에 보내지 않고 키워드만 전송합니다.</p>
|
|
</article>
|
|
<article>
|
|
<span>Ollama</span>
|
|
<strong>출처 연결 요약만 수행</strong>
|
|
<p>LLM은 단독 판정, 점수 산정, 출처 없는 유명인 단정을 하지 않습니다.</p>
|
|
</article>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="loop" class="section-band narrative">
|
|
<div class="section-heading reveal">
|
|
<p class="eyebrow">DB 성장 루프</p>
|
|
<h2>보류와 반려는 끝이 아니라, 다음 검출을 강화하는 주의 후보가 됩니다.</h2>
|
|
<p>
|
|
증거 상태만으로는 후보가 생기지 않습니다. 케이스 판정이 보류 또는 반려일 때만 주의 후보가 생성되고,
|
|
이후 운영자가 확정 DB 편입 또는 오탐 제외를 선택합니다.
|
|
</p>
|
|
</div>
|
|
<div class="diagram-shell reveal">
|
|
<img src="pitch-assets/decision-loop.svg" alt="보류와 반려 케이스가 주의 후보로 이어지고 다음 제출에서 재검출되는 피드백 루프">
|
|
</div>
|
|
<details class="mermaid-source reveal">
|
|
<summary>Mermaid 원본 보기</summary>
|
|
<pre><code>flowchart TB
|
|
A[증거 상태 표시] --> B{케이스 판정}
|
|
B -->|승인| C[자동 후보 없음]
|
|
B -->|보류| D[주의 후보 생성]
|
|
B -->|반려| D
|
|
D --> E[다음 제출 내부 유사도 분석]
|
|
E --> F[주의 후보 근거로 별도 표시]
|
|
F --> G{운영자 검토}
|
|
G -->|확정| H[확정 DB 편입]
|
|
G -->|오탐| I[후보 제외]</code></pre>
|
|
</details>
|
|
</section>
|
|
|
|
<section class="section-band proof-section">
|
|
<div class="section-heading reveal">
|
|
<p class="eyebrow">기준 데이터베이스</p>
|
|
<h2>확정 DB, 주의 후보, 제외 후보를 분리해 높은 recall과 오탐 통제를 동시에 잡습니다.</h2>
|
|
</div>
|
|
<div class="proof-grid reverse">
|
|
<figure class="product-shot wide reveal">
|
|
<img src="pitch-assets/knowledge-db.png" alt="기준 DB 관리 화면">
|
|
<figcaption>키워드 후보 수집, 수동 이미지 등록, 기준 DB 편입, 후보 제외 흐름을 한 화면에서 관리합니다.</figcaption>
|
|
</figure>
|
|
<div class="status-model reveal">
|
|
<article class="watch">
|
|
<strong>주의 후보</strong>
|
|
<p>보류/반려 판정에서 생성되며 미래 유사도 분석에 강하게 반영됩니다.</p>
|
|
</article>
|
|
<article class="confirmed">
|
|
<strong>확정 DB</strong>
|
|
<p>운영자가 재사용 기준으로 승격한 항목입니다.</p>
|
|
</article>
|
|
<article class="excluded">
|
|
<strong>오탐 제외</strong>
|
|
<p>잘못된 후보는 다음 분석에서 제외해 장기 오탐을 막습니다.</p>
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="governance" class="section-band split-proof governance">
|
|
<div class="section-heading reveal">
|
|
<p class="eyebrow">운영 거버넌스</p>
|
|
<h2>외부 검색 tool 활용, 감사 로그, 금지 경계를 제품 안에 넣었습니다.</h2>
|
|
</div>
|
|
<figure class="product-shot reveal">
|
|
<img src="pitch-assets/provider-controls.png" alt="외부 검색 tool 활용 화면">
|
|
<figcaption>외부 검색 tool 연결 상태와 실패 사유를 운영 화면에서 확인하고 필요 시 즉시 중지할 수 있습니다.</figcaption>
|
|
</figure>
|
|
<div class="boundary-list reveal">
|
|
<article>
|
|
<span>보호</span>
|
|
<strong>원본 이미지는 로컬 기준</strong>
|
|
<p>Naver에는 텍스트만, Google에는 승인된 파생 이미지만 사용합니다.</p>
|
|
</article>
|
|
<article>
|
|
<span>금지</span>
|
|
<strong>얼굴 인식 DB를 만들지 않음</strong>
|
|
<p>얼굴 임베딩, 동일인 판정, 생체 템플릿 저장을 하지 않습니다.</p>
|
|
</article>
|
|
<article>
|
|
<span>감사</span>
|
|
<strong>운영 변경 이력 추적</strong>
|
|
<p>판정, 증거 상태, 외부 검색 tool 변경은 audit event로 남습니다.</p>
|
|
</article>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="closing section-band">
|
|
<p class="eyebrow reveal">Commercial case</p>
|
|
<h2 class="reveal">더 빨리 보고, 더 많이 잡고, 더 적게 되돌립니다.</h2>
|
|
<div class="value-bridge reveal">
|
|
<article>
|
|
<strong>검토 시간 절감</strong>
|
|
<p>상위 근거, 이미지 미리보기, 출처 링크를 한 화면에 배치합니다.</p>
|
|
</article>
|
|
<article>
|
|
<strong>과소검출 축소</strong>
|
|
<p>Google, Naver, 로컬 지문, 주의 후보가 서로 다른 실패 지점을 보완합니다.</p>
|
|
</article>
|
|
<article>
|
|
<strong>운영 비용 방어</strong>
|
|
<p>보류/반려 이력이 다음 제출 검출 기준으로 누적됩니다.</p>
|
|
</article>
|
|
</div>
|
|
<p class="closing-line reveal">
|
|
Copyrighter는 자동 반려 시스템이 아니라, 운영자의 저작권 판단을 강하게 만드는 증거·기준·감사 플랫폼입니다.
|
|
</p>
|
|
</section>
|
|
</main>
|
|
|
|
<script src="pitch.js"></script>
|
|
</body>
|
|
</html>
|