Personal Information Intelligent Leakage Observation Tool
AI 기반 개인정보 유출 탐지 및 보호 플랫폼 — Backend API Server
Swagger UI
·
API Endpoints
·
Getting Started
PIILOT 은 기업 내부의 데이터베이스와 파일 서버에 저장된 **개인정보(PII)**를 AI가 자동으로 탐지하고, 암호화 상태를 점검하며, 마스킹까지 처리하는 통합 관제 플랫폼입니다.
개인정보 보호법, GDPR 등 강화되는 규제 환경에서 기업이 보유한 데이터를 안전하게 관리할 수 있도록 돕습니다.
서비스
기술
포트
역할
Frontend
Next.js 16 + React 19
3000
사용자 인터페이스
Backend
Spring Boot 3.5
8080
REST API, 비즈니스 로직
AI Server
FastAPI + PyTorch
8000
PII 탐지, 마스킹, 챗봇
Database
PostgreSQL 14+
5432
메인 데이터베이스
Cache
Redis 7+
6379
마스킹 결과 캐싱
기업 DB에 연결하여 테이블/컬럼 스키마를 자동 스캔
AI(KoELECTRA NER + RAG)가 이름, 주민번호, 전화번호 등 8종 PII 자동 식별
XGBoost 분류기로 각 컬럼의 암호화 상태 판별
비암호화 데이터 레코드 PK 목록 추출 및 이슈 자동 생성
증분 스캔 으로 변경된 테이블만 재분석 (재스캔 시 99.88% 성능 향상)
SFTP / FTP / WebDAV 파일 서버 연결 지원
멀티모달 PII 탐지 : 문서(PDF/DOCX), 이미지(얼굴 탐지), 음성(STT), 영상
비동기 스캔으로 대규모 파일 서버 처리 (TransactionSynchronization + @Async)
탐지된 PII를 AI가 자동 마스킹 (텍스트 치환, 얼굴 블러, 음성 처리)
"미리보기 → 저장" 2단계 플로우 + Redis 캐싱으로 저장 API 99.71% 단축
원본 파일 ZIP 암호화(AES) 보관 + 마스킹 파일 파일서버 업로드
LangGraph Self-RAG 기반 개인정보 보호 Q&A 챗봇
pgvector + Flashrank 재랭킹으로 법규/규정 의미 검색
DB/파일 스캔 현황 요약 통계
PII 유형별 탐지 트렌드
최근 이슈 목록
┌──────────────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Frontend │──────▶│ Backend │──────▶│ AI Server │ │
│ │ Next.js │ API │ Spring Boot │ HTTP │ FastAPI │ │
│ │ :3000 │ │ :8080 │ │ :8000 │ │
│ └──────────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ┌───────┼──────────┐ ┌─────┴──────┐ │
│ │ │ │ │ pgvector │ │
│ ▼ ▼ ▼ │ (Vector DB) │ │
│ ┌─────────┐ ┌─────┐ ┌──────┐ └────────────┘ │
│ │PostgreSQL│ │Redis│ │AWS S3│ │
│ │ :5432 │ │:6379│ │ │ │
│ └─────────┘ └─────┘ └──────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ Target Data Sources │ │
│ │ ┌─────┐ ┌────┐ ┌───────┐ │ │
│ │ │MySQL│ │SFTP│ │WebDAV │ │ │
│ │ │ DB │ │FTP │ │ S3 │ │ │
│ │ └─────┘ └────┘ └───────┘ │ │
│ └─────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
[DB 스캔 흐름]
Backend → JDBC로 대상 DB 스키마 수집 → AI 서버에 PII 식별 요청
→ AI 서버에 암호화 확인 요청 → Risk Level 계산 → 이슈 자동 생성
[파일 마스킹 흐름]
Frontend → Backend (마스킹 요청) → Redis 캐시 확인
→ [MISS] AI 서버 마스킹 → Redis 저장 (TTL 30분) → 미리보기 반환
→ [HIT] Redis에서 즉시 반환 (12ms)
Frontend → Backend (저장 요청, password만 전송)
→ Redis 조회 → ZIP 암호화 → 파일서버 업로드 → Redis 삭제
기술
버전
용도
Java
21
프로그래밍 언어
Spring Boot
3.5.9
REST API 프레임워크
Spring Security
6.x
인증/인가 (JWT)
Spring Data JPA
3.x
ORM
QueryDSL
5.1.0
타입 안전한 동적 쿼리
Spring Data Redis
3.x
캐시 (Lettuce 클라이언트)
Flyway
10.x
데이터베이스 마이그레이션
WebClient
6.x
AI 서버 비동기 HTTP 통신
AWS SDK v2
2.25.0
S3 Presigned URL
기술
버전
용도
PostgreSQL
14+
메인 데이터베이스
Redis
7+
마스킹 결과 캐싱
Docker
-
컨테이너화
Gradle
8.14.3
빌드 도구
라이브러리
용도
JJWT 0.12.6
JWT 토큰 생성/검증
JSch 0.1.55
SFTP 파일 전송
Apache Commons Net 3.11.1
FTP 파일 전송
Sardine 5.10
WebDAV 파일 전송
zip4j 2.11.5
ZIP AES 암호화
SpringDoc OpenAPI 2.7.0
Swagger API 문서화
기술
용도
KoELECTRA NER
한국어 개인정보 개체명 인식
YOLOv12n-Face
이미지/영상 얼굴 탐지
Whisper Large-v3
음성→텍스트 변환
XGBoost
암호화 여부 판별
LangGraph
Self-RAG 챗봇 워크플로우
pgvector
법규 벡터 검색
Java 21+
PostgreSQL 14+
Redis 7+
Gradle 8.x (Wrapper 포함)
# PostgreSQL에 데이터베이스 생성
createdb piilot_db
# pgvector 확장 설치 (AI 서버 벡터 검색용)
psql piilot_db -c " CREATE EXTENSION IF NOT EXISTS vector;"
export DB_URL=jdbc:postgresql://localhost:5432/piilot_db
export DB_USERNAME=piilot_user
export DB_PASSWORD=piilot_password
export REDIS_HOST=localhost
export REDIS_PORT=6379
export JWT_SECRET=your-256-bit-secret-key
export AES_KEY=piilot-aes-256-secret-key-32by!!
export AI_SERVER_URL=http://localhost:8000
export CORS_ORIGINS=http://localhost:3000
# 빌드
./gradlew build
# 실행 (local 프로필)
./gradlew bootRun
# 또는 JAR 실행
java -jar build/libs/piilot-* .jar --spring.profiles.active=local
# 테스트용 파일 서버 (WebDAV, SFTP, FTP)
docker-compose up -d
# 접속 정보: piilot / piilot123
# WebDAV: localhost:8081
# SFTP: localhost:2222
# FTP: localhost:21
모든 API는 CommonResponse<T> 래퍼로 응답합니다.
{
"success" : true ,
"code" : " COMMON200" ,
"message" : " 요청이 성공했습니다." ,
"result" : { },
"timestamp" : " 2026-02-25T10:30:00"
}
Method
Endpoint
설명
인증
POST
/api/auth/signup
회원가입
-
POST
/api/auth/login
로그인 (JWT 발급)
-
POST
/api/auth/refresh
토큰 갱신
-
Method
Endpoint
설명
POST
/api/db-connections
DB 연결 생성
GET
/api/db-connections
연결 목록 조회
GET
/api/db-connections/{id}
연결 상세 조회
PUT
/api/db-connections/{id}
연결 수정
DELETE
/api/db-connections/{id}
연결 삭제
POST
/api/db-connections/{id}/scan
DB 스캔 시작
GET
/api/db-connections/stats
연결 통계
Method
Endpoint
설명
GET
/api/db-pii/connections
연결 필터 목록
GET
/api/db-pii/connections/{id}/tables
테이블 목록
GET
/api/db-pii/columns
PII 컬럼 목록 (필터/페이징)
GET
/api/db-pii/issues
이슈 목록
GET
/api/db-pii/issues/{id}
이슈 상세 (비암호화 데이터 포함)
PATCH
/api/db-pii/issues/{id}/status
이슈 상태 변경
Method
Endpoint
설명
POST
/api/file-connections
파일 서버 연결 생성
GET
/api/file-connections
연결 목록 조회
GET
/api/file-connections/{id}
연결 상세 조회
PUT
/api/file-connections/{id}
연결 수정
DELETE
/api/file-connections/{id}
연결 삭제
POST
/api/file-connections/{id}/scan
파일 스캔 시작
GET
/api/file-connections/{id}/scan/{historyId}
스캔 상태 조회
GET
/api/file-connections/stats
연결 통계
Method
Endpoint
설명
GET
/api/file-pii/connections
연결 필터 목록
GET
/api/file-pii/files
파일 목록 (필터/페이징)
GET
/api/file-pii/issues
이슈 목록
PATCH
/api/file-pii/issues/{id}/status
이슈 상태 변경
GET
/api/file-masking/files
마스킹 대상 파일 목록
GET
/api/file-masking/files/{id}/preview
원본 파일 미리보기
POST
/api/file-masking/files/{id}/mask
AI 마스킹 요청 (Redis 캐싱)
POST
/api/file-masking/files/{id}/save
마스킹 결과 ZIP 저장
Method
Endpoint
설명
GET
/api/dashboard/summary
대시보드 요약 통계
GET
/api/dashboard/trends
트렌드 데이터
GET
/api/notices
공지사항 목록
POST
/api/admin/notices
공지사항 생성 (관리자)
POST
/api/law-search
법규 검색 (AI 연동)
POST
/api/chatbot
AI 챗봇 질의
GET
/api/notifications
알림 목록
POST
/api/documents/presigned-url
S3 Presigned URL 생성
POST
/api/documents
문서 저장 + AI 임베딩
src/main/java/com/lastcommit/piilot/
│
├── domain/ # 비즈니스 도메인
│ ├── dbscan/ # DB 스캔 & PII 탐지
│ │ ├── controller/ # REST API
│ │ ├── service/ # 스캔 파이프라인, PII/이슈 관리
│ │ ├── repository/ # JPA + QueryDSL
│ │ ├── entity/ # DB 연결, 테이블, PII 컬럼, 이슈
│ │ ├── dto/ # Request/Response DTO
│ │ ├── docs/ # Swagger 문서 인터페이스
│ │ └── exception/ # 도메인 에러 코드
│ │
│ ├── filescan/ # 파일 스캔 & 마스킹
│ │ ├── controller/ # 파일 연결, PII, 마스킹 API
│ │ ├── service/ # 스캔, 다운로드, 업로드, 마스킹
│ │ ├── repository/ # JPA + QueryDSL
│ │ ├── entity/ # 파일 연결, 파일, PII, 이슈, 마스킹 로그
│ │ ├── dto/
│ │ ├── docs/
│ │ └── exception/
│ │
│ ├── dashboard/ # 대시보드 분석
│ ├── document/ # 문서 관리 (S3 + AI 임베딩)
│ ├── notice/ # 공지사항
│ ├── notification/ # 알림
│ ├── regulation/ # 법규 검색
│ ├── chatbot/ # AI 챗봇
│ ├── user/ # 사용자 엔티티
│ └── shared/ # 공유 Enum & BaseEntity
│
├── global/ # 전역 인프라
│ ├── auth/ # JWT 인증 (Filter, Provider, Service)
│ ├── config/ # Spring 설정
│ │ ├── SecurityConfig # Spring Security + CORS
│ │ ├── RedisConfig # Lettuce + JSON 직렬화
│ │ ├── QueryDSLConfig # JPAQueryFactory
│ │ ├── AsyncConfig # 비동기 스레드풀
│ │ ├── WebClientConfig # AI 서버 HTTP 클라이언트
│ │ ├── S3Config # AWS S3 Presigner
│ │ └── SwaggerConfig # OpenAPI 3.0
│ ├── error/ # 전역 예외 처리
│ │ ├── exception/ # GeneralException
│ │ ├── handler/ # @ControllerAdvice
│ │ ├── response/ # CommonResponse<T>
│ │ └── status/ # 에러/성공 코드
│ ├── util/ # AES-256-GCM 암호화
│ └── validation/ # @ValidPage, @ValidSize
│
src/main/resources/
├── application.yml # 공통 설정
├── application-local.yml # 로컬 개발 환경
├── application-dev.yml # 개발 서버
└── db/migration/ # Flyway 마이그레이션 (V1~V14)
원칙
적용
계층 분리
Controller → Service → Repository → Entity
도메인 분리
도메인별 독립적 패키지 (dbscan/, filescan/ 등)
Swagger 분리
Controller와 Docs 인터페이스 분리하여 비즈니스 로직과 문서 분리
SRP
외부 연동 로직을 별도 컴포넌트로 분리 (예: FileDownloader, DbConnectionTester)
Profile 기반 AI 클라이언트
StubAiServerClient (local) / RealAiServerClient (dev, prod)
도메인
테이블
설명
User
users
사용자 (USER/ADMIN)
DB Scan
db_server_connections
DB 서버 연결 정보
db_tables
스캔된 DB 테이블
db_scan_history
DB 스캔 이력
db_pii_columns
DB 개인정보 컬럼
db_pii_issues
DB 개인정보 이슈
File Scan
file_server_connections
파일 서버 연결 정보
files
스캔된 파일
file_scan_history
파일 스캔 이력
file_pii
파일 개인정보
file_pii_issues
파일 개인정보 이슈
masking_logs
마스킹 처리 로그
Shared
pii_types
PII 유형 8종 (이름, 주민번호, 전화번호 등)
dbms_types
DBMS 유형 (PostgreSQL, MySQL, Oracle)
file_server_types
파일 서버 유형 (FTP, SFTP, WebDAV)
file_type
파일 유형 (문서, 사진, 음성, 영상)
Other
notices
공지사항
document
문서 (법규, DB 용어사전)
notifications
알림
코드
한글명
AI 코드
위험 가중치
NM
이름
p_nm
0.7
RRN
주민번호
p_rrn
1.0
ADD
주소
p_add
0.5
IP
IP주소
p_ip
0.3
PH
전화번호
p_ph
0.7
ACN
계좌번호
p_acn
0.9
PP
여권번호
p_pp
0.8
EM
이메일
p_em
0.5
버전
설명
V1
전체 테이블 생성 + 인덱스 + 트리거
V2
초기 데이터 (DBMS 유형, PII 유형, 파일 유형)
V3
FTP/SFTP 서버 유형 추가
V4
DB/파일 연결 유니크 제약 추가
V5
files 테이블 file_size 컬럼 추가
V6
pgvector 벡터 테이블 생성 (법규, 용어사전)
V7
files 테이블 이슈 관련 컬럼 추가
V8
WebDAV 서버 유형 추가
V9
파일 스캔 is_scanning 상태 컬럼 추가
V10
ZIP 파일 타입 추가
V11
db_pii_columns PK 컬럼명 추가
V12
알림(notifications) 테이블 생성
V13
DocumentType ENUM 수정
V14
파일 서버 유형 업데이트
상세 문서: project_docs/tech-decision-redis-masking-cache.md
문제 : 마스킹 "미리보기 → 저장" 2단계 플로우에서 마스킹 결과를 어디에 보관할 것인가?
5개 저장소 후보 검토 :
후보
결과
탈락 사유
HttpSession
탈락
JWT STATELESS 정책과 충돌
로컬 캐시 (Caffeine)
탈락
스케일아웃 시 캐시 공유 불가 + GC 부담
Redis
채택
분산 공유 + TTL + 기존 인프라 활용
파일시스템
탈락
분산 불가 + 정리 로직 부담
DB (BYTEA)
탈락
임시 데이터에 과도한 I/O 비용
성과 :
지표
Before
After
마스킹 재요청 (85MB 영상)
214,892ms
89ms (99.96%)
저장 API (85MB 영상)
23,194ms
68ms (99.71%)
저장 시 네트워크 전송량
Base64 ~113MB
password 수 KB
상세 문서: project_docs/DB_SCAN_PERFORMANCE_REPORT.md
문제 : 전체 재스캔 시 206초 소요
해결 : 테이블별 change_signature 비교로 변경된 테이블만 AI 서버에 전송
시나리오
Before
After
개선율
변경 없는 재스캔
206초
0.24초
99.88%
1개 테이블 변경
206초
14.9초
92.8%
Phase 3(비동기)도 시도했으나 AI 서버의 순차 처리로 인해 10~29% 느려져 Phase 2 유지
3. S3 Presigned URL (파일 업로드)
상세 문서: project_docs/feat-53-file-upload-and-presignedUrl.md
문제 : 대용량 문서(법규 PDF) 업로드 시 백엔드 메모리/대역폭 낭비
해결 : 백엔드가 서명된 URL만 발급 → 프론트엔드가 S3에 직접 업로드
4. 비동기 파일 스캔 (TransactionSynchronization)
문제 : @Async 호출 시 트랜잭션 커밋 전에 다른 스레드가 데이터를 조회하면 NULL
해결 : TransactionSynchronization.afterCommit()으로 커밋 후 비동기 실행 보장
변수
설명
기본값
DB_URL
PostgreSQL JDBC URL
jdbc:postgresql://localhost:5432/piilot_db
DB_USERNAME
DB 사용자명
piilot_user
DB_PASSWORD
DB 비밀번호
piilot_password
REDIS_HOST
Redis 호스트
localhost
REDIS_PORT
Redis 포트
6379
JWT_SECRET
JWT 서명 비밀키 (256bit+)
-
AES_KEY
AES-256-GCM 암호화 키 (32byte)
-
AI_SERVER_URL
AI 서버 URL
http://localhost:8000
CORS_ORIGINS
허용 Origin
http://localhost:3000
AWS_ACCESS_KEY
AWS S3 Access Key
-
AWS_SECRET_KEY
AWS S3 Secret Key
-
S3_BUCKET_NAME
S3 버킷명
piilot-documents
프로필
용도
local
로컬 개발 (기본 활성화)
dev
개발 서버
prod
운영 서버
stub
AI 서버 없이 Stub 응답으로 테스트
Built with ❤️ by Team LastCommit (KT AIVLE School 7기 3조)