尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗외부 AI에 보내는 문장에서 민감한 값만 커튼 뒤로 가리는 정보 유출 방지 게이트웨이.
직원이 ChatGPT 같은 외부 생성형 AI에 업무 내용을 붙여 넣으면, 문장이 나가기 전에 검사한다. 전화번호 같은 개인정보와 회사 기밀은 가명으로 바꿔 보내고, 돌아온 답에서 원래 값으로 되돌린다. 비밀번호와 API 키는 아예 보내지 않는다. 가상 회사(HTH)와 가짜 데이터로 만든 개인 프로젝트이다.
공개 시연 열어 보기 (설치가 필요 없다. 무료 서버라 첫 접속은 1분쯤 걸릴 수 있다.)
| 처리 | 조건 | 동작 |
|---|---|---|
| 허용 | 탐지된 값이 없다 | 그대로 보낸다 |
| 가림 | 개인정보, 회사 코드명, 고객사 이름이 있다 | [전화1] 같은 가명으로 바꿔 보내고, 돌아온 답에서 원래 값으로 되돌린다 |
| 경고 | 개인정보가 20개 이상이다 | 확인을 받은 뒤 가려서 보낸다 |
| 차단 | 비밀번호, API 키, 보안 등급 표시가 있다 | 보내지 않고 이유를 알린다 |
공일공 같은 한글 숫자와 한 글자씩 띄운 숫자 변환). 원문과 사본 양쪽에서 찾고, 위치는 원문 기준으로 되돌리므로 보내는 문장은 원문에서 만든다.| 방법 | 내용 |
|---|---|
| 바로 체험하기 | 예시 버튼을 누르면 가림, 차단, 경고, 허용을 확인할 수 있다. 외부 AI를 부르지 않는 시연 모드이며, 미리 써 둔 답 속 가명은 실제로 복원된다 |
| 내 키로 써 보기 | 내 Gemini 키(Google AI Studio에서 무료 발급)를 넣으면 실제 Gemini의 답을 받는다 |
| 내 앱에 연결하기 | Chatbox 같은 OpenAI 방식 앱의 API 호스트에 사이트 주소, API 키에 내 Gemini 키, 모델에 curtain을 넣으면 앱의 모든 대화가 Curtain을 거친다 |
가림이 일어나면 답마다 커튼 기록이 붙어, 내가 쓴 문장과 AI가 받은 문장과 되돌린 값을 비교해 볼 수 있다.
POST /v1/chat/completions와 GET /v1/models이다. 글자만 받으므로 Chatbox에서는 이미지와 도구 사용 설정을 꺼 둔다.596개의 합성 문장(생성형 AI가 만든 업무 요청 틀에 코드가 만든 가짜 값을 채운 문장)으로 측정했다. 평가 세트와 탐지 설정은 측정 전에 해시로 고정했고, 결과를 보고 규칙을 바꾸지 않았다. 입력 정규화를 넣은 뒤에도 같은 세트의 결과는 같았다. 재현 방법은 평가 자료에 있다.
| 지표 | 결과 |
|---|---|
| 개인정보 탐지율 | 98.1% |
| 자격증명 탐지율 | 81.7% |
| 회사 기밀 탐지율 | 100% (사전과 같은 값을 넣은 결과이다) |
| 정상 문장 오탐 | 0 / 106 |
| 처리 지연 | 서버 중앙값 0ms, 95백분위 1ms 이하 |
| 가려도 답을 쓸 수 있는 비율 | 91.7% (사람이 판정한 45쌍 중, 원문으로 쓸 수 있던 답 36개 가운데 33개) |
| 우회 문장 탐지율 | 정규화 전 26%(변형 96문장 중 25개). 정규화 후 79.8%(알려진 유형 480문장), 48.3%(처음 보는 변형 240문장) |
상세 수치와 신뢰구간은 탐지 보고서, 우회 보고서, 입력 정규화 보고서, 가림 후 유용성 보고서에 있다.
한계
O와 l을 쓴 값처럼 처음 보는 변형은 절반 넘게 놓친다.JDK 25, Maven 3.9, Python 3이 필요하다. API 키 없이 시연과 시험이 된다.
# 키 없이 시연 (http://localhost:8080)
cd backend
mvn spring-boot:run "-Dspring-boot.run.arguments=--gateway.demo-answer=true"
# 서버 키로 실제 Gemini (환경변수 GEMINI_API_KEY 필요)
mvn spring-boot:run
# 자동 시험: Java 207건, Python 95건
mvn -B test
cd scripts && python -m unittest test_fake_values test_measure test_build_eval_set test_build_bypass_set test_z_measure test_build_blind_set test_freeze_v2 test_norm_report
공개 사이트는 저장소의 Dockerfile로 Render에 배포하며, main에 올리면 자동으로 다시 배포된다.
backend/src/main/java/com/promptgateway/
detect/ 탐지와 처리 결정
mask/ 가명 만들기와 복원
gateway/ 처리 순서
controller/ 포털 API
compat/ OpenAI 호환 입구
service/ 응답 모델(서버 키 Gemini, 방문자 키 Gemini, 시연 응답)
log/ 원문 없는 감사 로그
backend/src/main/resources/static/ 포털 화면 한 장(외부 라이브러리 없음)
backend/scripts/ 평가 세트 생성과 측정 도구(Python)
docs/ 문제 정의, 정책, 명세, 설계, 평가 자료
명세를 먼저 쓰고(SDD) 실패하는 시험을 먼저 만든 뒤 구현했다(TDD). 문서 순서는 문제 정의, 정책, 명세, 설계이다. 탐지율처럼 확률적인 품질은 시험이 아니라 측정으로 검증했다.
코드의 대부분은 Claude Code가 작성했다. 나는 주제와 범위, 설계 방향, 검토, 실제 Gemini와 Chatbox와 공개 사이트에서의 동작 확인, 사람 판정을 맡았다.
처음에는 사내 HR 챗봇의 프롬프트 주입 방어 게이트웨이를 만들다가 2026-10-29에 지금 주제로 바꿨다. 결정의 근거(DECISIONS.md)와 전체 작업 기록, 이전 주제의 자료는 dev 브랜치에 있다.
글꼴(Pretendard, Jua)은 SIL Open Font License 1.1이고, 그림은 직접 그린 SVG이며, 평가 데이터의 값은 코드가 만든 가짜 값이다. 자세한 내용은 THIRD_PARTY_NOTICES.md에 있다. 코드는 열람용으로 공개하며 별도의 라이선스 파일은 없다.