尚未偵測到更新。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에 있다. 코드는 열람용으로 공개하며 별도의 라이선스 파일은 없다.