임베딩 역전 공격
벡터 DB에 저장한 임베딩에서 원문을 되살리는 공격의 동작 원리와 복원율 실측치, 양자화와 노이즈 방어가 듣는 범위를 정리합니다.
임베딩은 정보를 버리도록 설계된 적이 없으므로, 벡터 스토어 유출은 원문 유출과 같은 등급으로 다뤄야 합니다.
벡터 스토어를 안전한 파생물로 본 가정
검색 증강 생성(Retrieval-Augmented Generation, RAG)을 붙일 때 자주 나오는 배치가 있습니다. 원문 문서는 사내 저장소에 두고, 임베딩 벡터만 외부 관리형 벡터 데이터베이스로 보내는 구성입니다. 임베딩은 사람이 읽을 수 없는 부동소수 배열이니 비식별 파생물이라는 판단이 이 배치를 받쳐 왔습니다.
이 판단은 해시와 임베딩을 같은 종류로 본 데서 나옵니다. 암호학적 해시는 입력 정보를 의도적으로 버리도록 설계됩니다. 반면 임베딩 모델은 의미가 가까운 문장이 벡터 공간에서도 가깝게 놓이도록 학습됩니다. 검색이 동작하려면 입력의 의미가 벡터에 남아야 하고, 남은 만큼이 복원의 재료가 됩니다.
용량으로 따져도 여유가 있습니다. 널리 쓰이는 문장 임베딩은 수백에서 수천 차원의 부동소수 벡터입니다. 짧은 문장 하나가 담은 정보량은 그 벡터가 실을 수 있는 양보다 작습니다. 복원을 막는 것은 정보의 부재가 아니라 역함수를 찾는 난이도입니다.
2023년 이후 그 난이도는 계속 낮아졌습니다. 공격자가 요구하는 가정은 약해지고, 복원 정확도는 올라가고, 한 문장을 되살리는 비용은 떨어졌습니다. 지금 시점에서 외부 벡터 DB에 임베딩을 저장하는 일은 약화된 평문을 저장하는 일에 가깝습니다.
임베딩에서 텍스트로 돌아가는 세 경로
임베딩 역전(embedding inversion)은 임베딩 벡터를 입력으로 받아 원문 텍스트를 되살리는 공격입니다. 지금까지 나온 방법은 복원을 어떤 문제로 바꿔 푸는지에 따라 세 갈래로 나뉩니다.
- 생성형 주입. GEIA(arXiv 2305.03010, EMNLP 2023)는 사전학습 디코더 언어모델의 첫 토큰 은닉 표현 자리에 문장 임베딩을 밀어 넣고 자유 생성을 시킵니다. 공격자는 (텍스트, 임베딩) 학습쌍과 인코더 질의 권한만 있으면 됩니다.
- 반복 교정. Vec2Text(Morris 등, arXiv 2310.06816)는 후보 문장을 다시 임베딩해 타깃 벡터와의 차이를 재료로 후보를 고칩니다. 인코더에 왕복 질의를 계속 던질 수 있어야 합니다.
- 적대적 디코딩. ZSinvert(arXiv 2504.00147)는 빔 서치의 점수 함수를 언어모델 확률에서 타깃 임베딩과의 코사인 유사도로 바꿉니다. 인코더별 공격 모델을 학습하지 않아도 됩니다.
세 갈래의 실질적 차이는 공격 준비 비용입니다. GEIA와 Vec2Text는 인코더마다 공격 모델을 새로 학습해야 해서 타깃이 바뀌면 준비를 다시 합니다. ZSinvert는 합성 데이터로 한 번 학습한 보정 모델을 재사용하고 타깃 인코더에는 접근하지 않습니다. A40 GPU에서 9회 반복에 회당 10초, 문장당 약 90초로 복원이 끝납니다(arXiv 2504.00147).
Zero2Text(arXiv 2602.01757)는 여기서 도메인 가정까지 걷어냅니다. 정적 데이터셋으로 학습하는 대신 매 반복마다 언어모델이 후보를 생성합니다. 후보 임베딩과 타깃 임베딩의 차이를 릿지 회귀(ridge regression)로 분석해, 다음 반복의 프롬프트에 보정 신호를 넣습니다. 타깃 도메인의 학습쌍이 없어도 동작하므로, 우리 데이터가 특수해서 안전하다는 가정이 깨집니다.
복원율이 실제로 어디까지 갔는가
복원 성능은 지표마다 뜻이 다릅니다. F1은 원문 토큰을 얼마나 회수했는지, NERR(Named Entity Recovery Rate)은 개체명을 얼마나 회수했는지 잽니다. BLEU는 n-gram 일치도라 문자열이 얼마나 똑같은지에 가깝고, 코사인 유사도는 임베딩 공간에서의 근접도입니다.
| 공격 | 대상 인코더와 데이터 | 복원 지표 | 출처 |
|---|---|---|---|
| GEIA | SimCSE-BERT / PersonaChat | 토큰 F1 63.11%, 개체명 회수 55.57% | arXiv 2305.03010 |
| GEIA 재현 | SimCSE-BERT / PersonaChat | 토큰 F1 63.22%, 개체명 회수 51.00% | arXiv 2504.16609 |
| Vec2Text | GTR-NQ 32토큰, 학습 도메인 안 | BLEU 98.5, 코사인 0.99 | arXiv 2507.07700 |
| Vec2Text | OpenAI 임베딩 / MS MARCO 81토큰 | BLEU 54.3, 코사인 0.99 | arXiv 2507.07700 |
| ZSinvert | Contriever·GTE·GTR 등 / MS MARCO | 토큰 F1 50 | arXiv 2504.00147 |
| Zero2Text | text-embedding-3 / MS MARCO | 기준선 대비 ROUGE-L 1.8배, BLEU-2 6.4배 | arXiv 2602.01757 |
GEIA 결과는 재현으로 확인됐습니다. SIGIR 2025 재현 연구(arXiv 2504.16609)에서 SRoBERTa 기준 F1은 53.24%에서 52.78%로 나왔습니다. SimCSE-BERT 기준은 63.11%에서 63.22%로 재현됐습니다. 개체명 회수율만 다소 낮게 나왔고 결론은 그대로였습니다.
원문 그대로의 복원이 성립하는 조건은 Vec2Text 재현 연구(arXiv 2507.07700)가 갈랐습니다. GTR-NQ 32토큰 구간에서 기본 디코딩은 BLEU 34.4에 그쳤지만, 50스텝 반복 교정과 시퀀스 빔 서치를 붙이면 BLEU 98.5까지 올라갑니다. 이 값은 사실상 문자열 일치입니다. 다만 학습 시퀀스 길이를 벗어나면 성능이 급락해, 128토큰으로 학습한 모델은 32토큰 입력에서 무너집니다.
복원 대상이 의미 없는 문자열이어도 결과가 남습니다. 같은 연구는 Password Strength 데이터셋에서 쉬운 비밀번호의 36%, 중간 난도의 22%, 어려운 난도의 4%를 정확히 복원했습니다. 사용자 입력을 그대로 임베딩해 색인했다면 토큰이나 키 조각이 벡터에서 되살아날 수 있다는 뜻입니다.
토큰 일치율이 낮다고 안전한 것도 아닙니다. ZSinvert는 Enron 이메일에서 토큰 F1 21.60%에 그쳤지만, GPT-4로 판정한 정보 누출률은 92%였습니다. 표면 문자열은 달라도 누가 누구에게 무엇을 말했는지는 거의 그대로 회수됐다는 뜻입니다. 방어 효과를 BLEU 하락만으로 판단하면 실제 위험을 놓칩니다.
가정이 약해질수록 강해지는 공격
앞의 공격은 모두 인코더에 질의할 수 있다는 가정을 깔았습니다. 실제 침해는 다르게 일어납니다. 데이터베이스 덤프나 백업 탈취로 임베딩만 넘어가고, 인코더 접근 권한은 없는 경우가 더 흔합니다.
Transferable Embedding Inversion(arXiv 2406.10280)은 이 조건에서 동작합니다. 공격자는 자기 인코더에 MLP 어댑터를 붙이고 두 손실로 학습해 대리 모델(surrogate)을 만듭니다. 같은 문장에 대한 대리 임베딩과 유출 임베딩의 오차를 줄이는 손실, 그리고 문장 쌍 사이의 유사도 관계를 보존하는 손실입니다. 대리 모델이 피해 인코더의 행동을 흉내 내면 그 뒤로는 표준 역전 기법을 그대로 적용합니다.
임상 기록으로 측정한 결과가 위험의 크기를 보여줍니다. MIMIC-III 문서 4,000건이 유출된 조건에서 나이는 98.84%, 성별은 99.47% 정확도로 추론됐습니다. 질병 79.07%, 증상 79.45%, 병력 65.36%로 임상 속성도 대부분 회수됐습니다. 원문 한 줄 없이 임베딩만으로 환자 프로필이 재구성되는 셈입니다.
임베딩 역전은 모델 역전(model inversion)과 표적이 다릅니다. 모델 역전은 파라미터나 출력에서 학습에 쓰인 데이터를 되살립니다. 임베딩 역전은 인코더의 출력 표현에서 입력을 되살리므로, 표적이 학습 데이터가 아니라 지금 색인된 운영 데이터입니다.
두 공격이 만나는 지점도 있습니다. 앞의 재현 연구는 GLM-4와 SRoBERTa 조합에서 원문과 변형 문장의 로그 우도 차이가 28.17%까지 벌어지는 것을 관측했습니다. 같은 공격 인프라가 복원뿐 아니라 학습 포함 여부의 신호까지 낸다는 뜻입니다.
| 시나리오 | 공격자가 가진 것 | 복원 수준 | 대표 연구 |
|---|---|---|---|
| 벡터 DB 유출 | 임베딩만, 모델과 키 없음 | 민감 속성 추론 최대 99% | Transferable |
| 인코더 질의 가능 | 질의 권한, 가중치 없음 | 학습 없이 토큰 F1 50~60% | ZSinvert |
| 도메인 불일치 | 다른 도메인 데이터만 | 기준선 대비 ROUGE-L 1.8배 | Zero2Text |
| 인코더 왕복 가능 | 반복 질의 권한 | 학습 길이 안에서 문자열 복원 | Vec2Text |
가정이 약할수록 공격도 약할 것 같지만 실측은 반대로 나왔습니다. 안전 판정선이 해마다 더 약한 쪽으로 밀리고 있습니다.
방어가 듣는 지점과 듣지 않는 지점
방어 수단은 검색 품질과 맞바꿔야 합니다. 실측치가 있는 항목만 모으면 다음과 같습니다.
| 방어 | 공격에 대한 효과 | 검색 품질 손실 | 출처 |
|---|---|---|---|
| 8비트 양자화 | BLEU 35 | nDCG@10 1% 이내 | arXiv 2507.07700 |
| 노이즈 σ=0.01 | 반복 교정에는 유효, 적대적 디코딩에는 미미 | 거의 없음 | arXiv 2507.07700, 2504.00147 |
| 노이즈 σ=0.1 | 공격 무력화 | 검색 자체가 망가짐 | arXiv 2504.00147 |
| 차등 프라이버시 | 적응형 공격에 무력 | 큼 | arXiv 2602.01757 |
| 임베딩 저장 회피 | 완전 | RAG 구성 불가 | — |
비용 대비 효과가 가장 확실한 항목은 8비트 양자화입니다. Vec2Text 재현 연구는 5개 데이터셋에서 BLEU를 3563에서 1627로 낮추면서 nDCG@10 변동을 1% 이내로 유지했습니다. 저장 비용도 함께 줄어 도입 장벽이 낮습니다. 임베딩 저장 전 기본값으로 둘 만합니다.
가우시안 노이즈는 두 논문의 결과가 엇갈립니다. Vec2Text 재현 연구는 σ=0.01에서 BLEU가 크게 떨어지고 검색 품질은 유지된다고 보고했습니다. ZSinvert는 같은 σ=0.01에서 공격이 거의 무력화되지 않는다고 보고했습니다. 차이는 공격 방식에 있습니다. 반복 교정은 노이즈에 흔들리지만, 코사인 유사도로 직접 탐색하는 적대적 디코딩은 덜 흔들립니다.
노이즈를 σ=0.1로 올리면 공격은 막히지만 검색 자체가 망가집니다. 노이즈만으로는 유용성과 프라이버시의 경계선을 넘지 못한다는 뜻입니다. Zero2Text는 차등 프라이버시(Differential Privacy, DP)도 적응형 공격을 막지 못한다고 명시합니다. 공격이 매 반복마다 보정 신호를 다시 계산하므로 고정된 노이즈를 우회합니다.
남는 방어는 접근 제어 쪽입니다. 임베딩 저장소의 권한을 원문 데이터베이스와 같은 등급으로 올리고, 백업도 같은 수준으로 암호화합니다. 임베딩과 원문을 잇는 매핑 테이블은 권한을 따로 분리해, 벡터만 유출됐을 때 원문 조회로 이어지지 않게 합니다.
외부 임베딩 API를 쓰면 방어 순서가 하나 앞당겨집니다. 원문이 벤더 서버로 평문 전송되므로, 벡터를 보호하기 전에 송신 단계에서 이미 노출됩니다. 학습 미사용과 무보존을 계약으로 확정하거나, 사내 추론 인프라에 인코더를 직접 올리는 편이 근본에 가깝습니다.
운영 체크리스트
데이터 분류에 따라 저장 위치를 먼저 정합니다.
| 데이터 분류 | 벡터 저장 위치 | 추가 처리 |
|---|---|---|
| 공개 | 관리형 벡터 DB 허용 | 없음 |
| 내부 | 관리형 벡터 DB 허용 | 8비트 양자화, 접근 토큰 단기 만료 |
| 기밀 | VPC 안에 자체 호스팅 | 양자화와 소량 노이즈 |
| 제한(개인정보·의료·금융) | 자체 호스팅 전용 | 노이즈와 패러프레이즈 전처리, 가능하면 임베딩 저장 회피 |
- 임베딩 저장 시 8비트 양자화를 기본값으로 둡니다.
- σ=0.005~0.01 노이즈는 검색 품질 영향을 측정한 뒤에만 켭니다.
- 제한 등급 데이터의 임베딩은 외부 벡터 DB로 내보내지 않습니다.
- 임베딩 백업을 키 관리 서비스로 암호화합니다.
- 유출 신고 트리거 정책(개인정보보호법 제34조, GDPR 제33조)의 대상에 임베딩을 포함합니다.
- 임베딩과 원문의 매핑 테이블에 별도 권한을 겁니다.
- 자체 데이터로 ZSinvert나 Vec2Text를 주기적으로 돌려 회귀 테스트를 합니다.
마지막 항목이 실무에서 가장 자주 빠집니다. 방어 설정은 인코더 교체나 색인 파이프라인 변경으로 조용히 무력화됩니다. 자체 데이터로 복원 지표를 정기 측정해 두면 그 변화를 숫자로 잡을 수 있습니다.
정리
임베딩은 의미를 보존하도록 학습된 표현이라 원문 복원의 재료를 그대로 담고 있습니다. 2023년 GEIA가 문장 생성 가능성을 보인 뒤, Vec2Text 재현 연구는 학습 시퀀스 길이 안에서 BLEU 98.5의 문자열 복원을 확인했습니다. ZSinvert와 Zero2Text는 인코더별 학습과 도메인 가정까지 걷어내 문장당 90초 수준으로 비용을 낮췄습니다.
유출된 임베딩만 쥔 공격자도 MIMIC-III에서 나이와 성별을 99% 가까이 추론했습니다. 방어 쪽에서 비용 대비 효과가 확인된 것은 8비트 양자화뿐이고, 노이즈와 차등 프라이버시는 적응형 공격 앞에서 흔들립니다. 임베딩 저장소를 원문과 같은 등급으로 분류하고 매핑 테이블 권한을 분리하는 조치가 지금 확실하게 남는 방어입니다.