AI 모델로 프롬프트 데이터가 유출되는 것을 방지하기 위해 프라이버시 스크러버(Privacy Scrubber)를 만들었습니다
요약
AI 모델 사용 시 발생할 수 있는 프롬프트 내 민감 정보 유출을 방지하기 위한 '프라이버시 스크러버' 개발 사례를 소개합니다. 클라이언트 사이드에서 PII를 식별해 플레이스홀더로 교체하고, 로컬에서 이를 복구하는 방식으로 데이터 보안을 강화합니다.
핵심 포인트
- 민감 정보가 브라우저를 떠나기 전 클라이언트 사이드에서 스크러빙 수행
- 이름, 이메일 등 PII를 중립적 플레이스홀더로 교체하여 데이터 유출 방지
- 로컬 금고(vault)를 통해 AI 응답 내 플레이스홀더를 실제 값으로 복구 가능
- 순수 JavaScript로 구현하여 코드 투명성과 감사 가능성 확보
I Built a Privacy Scrubber So My Prompts Stop Leaking Data to AI Models
태그: #privacy #javascript #webdev #buildinpublic
AI 모델로 보내는 모든 프롬프트는 잠재적인 데이터 유출 사고의 위험을 안고 있습니다. 이 문장은 누군가가 "그냥 핵심 조항만 빠르게 요약해줘"라며 고객의 NDA(비밀유지계약서)를 ChatGPT에 붙여넣는 것을 실제로 목격하기 전까지는 다소 극적으로 들릴 수 있습니다. 이름, 거래 금액, 관할권 조항, 서명 — 엔터를 누르는 순간 이 모든 정보가 제3자 서버에 남게 됩니다. 누구도 악의를 가진 것은 아닙니다. 바로 그것이 문제입니다. 유출은 악의적인 의도가 아니라, 단지 편리함 때문에 발생합니다.
저는 제 자신의 워크플로우, 동료들의 Slack 메시지("이 계약서 GPT로 확인 좀 해줄래?"), 그리고 무작위 트위터 스레드 등 모든 곳에서 이러한 패턴을 계속 목격했습니다. 그래서 이런 일이 발생하기 전에 막기 위한 무언가를 만들었고, 왜 그리고 어떻게 만들었는지 설명해 드리고자 합니다.
문제점 세 가지
- 기업 IP(지식재산권) 유출. 내부 문서, 독점 코드, 제품 로드맵 — 프롬프트에 붙여넣는 순간, 해당 텍스트가 어디에 저장되는지, 그리고 누가(또는 무엇이) 이를 학습하는지에 대한 통제권을 상실하게 됩니다.
- 규제 리스크. 챗봇에 환자 노트를 붙여넣으면 HIPAA(미국 의료정보보호법)를 위반했을 가능성이 있습니다. 고객의 법적 서류를 붙여넣으면 특권 및 비밀 유지 의무와 관련된 더 모호한 영역에 발을 들이게 됩니다. 대부분의 사람들은 이미 선을 넘기 전까지는 자신이 선을 넘었다는 사실조차 깨닫지 못합니다.
- 단순한 데이터 유출. 이메일, 전화번호, 주소, ID 번호 — PII(개인식별정보)가 평문(plaintext) 상태로 통제 범위를 벗어난 서버로 전송되며, 이를 되돌릴 수 있는 버튼도 없습니다.
해결책: 보낸 후가 아니라, 보내기 전에 스크러빙(scrub)하세요
핵심 아이디어는 간단합니다. 민감한 정보는 절대로 브라우저를 떠나서는 안 된다는 것입니다. 따라서 예외 없이 모든 과정은 클라이언트 사이드(client-side)에서 실행됩니다. 흐름은 다음과 같습니다:
[ 프롬프트 붙여넣기 ]
|
v
...
텍스트를 붙여넣으면 스캐너가 이름, 이메일, 전화번호, ID 또는 주소처럼 보이는 모든 항목을 식별(flag)하고, 이를 중립적인 플레이스홀더(placeholder)로 교체합니다. 그러면 원하는 곳 어디든 보낼 수 있는 깨끗한 프롬프트를 얻게 되며, 플레이스홀더와 실제 값 사이의 매핑(mapping)을 보관하는 로컬 "금고(vault)" 파일도 생성됩니다. 따라서 AI의 응답이 "[PERSON_1]"을 참조하더라도, 나중에 사용자의 기기 내에서 완전히 암호화 해제하여 실제 이름으로 복구할 수 있습니다.
내부 동작 원리 (What's under the hood)
특별한 기술을 사용하지 않았으며, 이는 의도된 설계입니다. 프레임워크, 빌드 단계, 씨름해야 할 번들러(bundler)가 없는 순수 JavaScript (vanilla JavaScript)로 작성되었습니다. 덕분에 전체 과정을 감사(auditable)할 수 있습니다. 즉, 블랙박스를 신뢰하는 대신 소스 파일을 열어 데이터에 접촉하는 모든 코드를 한 줄씩 읽을 수 있습니다. 내보내기(export)의 경우, jsPDF를 사용하여 깨끗하게 스크러빙된 프롬프트 PDF를 생성하며, localStorage는 세션 복구를 처리하여 스크러빙 도중 실수로 탭을 닫더라도 작업 내용을 잃지 않도록 합니다.
향후 계획 (What's next)
정규 표현식(Regex)으로도 많은 것을 할 수 있지만 한계가 있습니다. 문맥에 의존적인 개인정보(PII)를 놓치거나, 때로는 식별하지 말아야 할 항목을 식별하기도 합니다. 다음 단계는 이 도구의 본질을 해치는 서버 사이드(server-side) 도구로 만들지 않으면서도 더 미묘한 사례들을 잡아낼 수 있는 NER(개체명 인식, named entity recognition) 기반 탐지입니다. 그 이후에는 사용자가 타이핑하는 곳 어디에서나 인라인(inline)으로 스크러빙이 이루어질 수 있도록 브라우저 확장 프로그램을 개발할 예정이며, 최종적으로는 모든 직원이 수동으로 실행하는 것을 기억할 필요 없이 내부 도구에 이 기능을 내장하고 싶은 팀들을 위한 경량 API를 제공할 계획입니다.
직접 체험해 보세요 (Try it)
앱은 현재 라이브 상태이며 코드는 공개되어 있습니다. 저는 사람들이 조용히 신뢰를 거두는 것보다 차라리 "X를 놓쳤다"라는 피드백을 듣는 것을 진심으로 선호합니다. 라이브 앱과 GitHub 리포지토리 링크는 아래에 있습니다. 무언가 작동하지 않거나 제가 고려하지 못한 PII 패턴이 있다면 이슈(issue)를 열어주세요.
[라이브 앱 링크 https://aiscrubber.vercel.app/] · [GitHub 리포지토리 링크 https://github.com/prvthmpcypher/aiscrubber]
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기