본문으로 건너뛰기
TLDR AI Feed조회 1

코사인 유사도는 RAG 보안을 보장하지 않는다

임베딩 유사도는 진실이 아니라 거리만 측정하므로 RAG 검색과 벡터 저장소를 별도로 보호해야 합니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

코사인 유사도는 질의와 문서 임베딩의 기하학적 거리를 계산할 뿐, 문서의 진실성·권위·출처를 판단하지 않으므로 RAG 보안 속성이 될 수 없습니다. 공격자는 질의 어휘와 권위 신호를 조작한 문서를 삽입해 진짜 문서를 검색 상위권 밖으로 밀어낼 수 있으며, 글의 실험에서는 방어되지 않은 파이프라인에서 20회 중 95% 성공률이 관찰됐습니다. 기존 문서와의 유사도와 신규 문서 간 군집 유사도를 함께 검사하면 공격 성공률이 95%에서 20%로 낮아졌지만, 임계값은 데이터 분포와 임베딩 모델에 맞춰 재설정해야 합니다. 또한 임베딩 벡터는 원문과 무관한 불투명한 숫자가 아니며, Vec2Text·ALGEN·LAGO 연구처럼 벡터 저장소가 유출되면 문서 내용이 부분적으로 복원될 수 있으므로 접근 통제와 암호화, 사고 대응 분류를 함께 강화해야 합니다.

섹션별 상세

01
코사인 유사도와 ChromaDB의 최근접 검색은 문서가 질의와 얼마나 비슷한지 계산할 뿐, 내용이 사실인지 권위 있는지 판별하지 않습니다. sentence-transformers/all-MiniLM-L6-v2는 문자열을 384차원 실수 벡터로 바꾸고 ChromaDB는 저장된 벡터 중 질의와 가까운 항목을 반환하지만, “Revenue was $8.3M”과 “Revenue was $24.7M”처럼 숫자만 다른 문장은 거의 같은 위치에 놓일 수 있습니다. 따라서 높은 유사도 점수는 정확성의 증거가 아니며, ChromaDB에서 cosine을 사용하려면 컬렉션 생성 시 metadata={"hnsw:space": "cosine"}를 명시해야 합니다.
python
# The entire retrieval mechanism, conceptually
query_vector = embed("What was Q4 2025 revenue?")  # 384 floats
results = collection.query(query_embeddings=[query_vector], n_results=3)  # The 3 stored vectors with smallest cosine distance.

질의를 임베딩한 뒤 ChromaDB에서 가장 가까운 벡터 세 개를 검색하는 기본 흐름입니다.

02
공격자는 벡터 데이터베이스를 침입하지 않고도 예상 질의와 가까운 문서를 작성해 검색 결과를 오염시킬 수 있습니다. PoisonedRAG가 다룬 gradient-based 공격은 목표 질의 벡터와의 cosine distance를 줄이는 텍스트를 찾아 2.6 million개 코퍼스에 다섯 개 문서를 삽입하고 90%를 넘는 성공률을 기록했습니다. 글의 간이 실험에서는 “Q4 2025 Financial Results — CORRECTED FIGURES (Board Update)” 같은 제목과 CFO 승인 신호, 서로의 숫자를 반복하는 세 문서가 진짜 보고서를 top-3 밖으로 밀어내며 방어되지 않은 파이프라인에서 95% 성공률을 냈습니다.
03
문서 오염 탐지는 검색 유사도와 군집 유사도를 함께 확인하는 방식으로 구성됩니다. 새 문서가 기존 문서와 0.85 이상 유사하고, 같은 배치의 문서끼리 0.90 이상 유사하면 각각 기존 문서 덮어쓰기와 협력형 주입 신호로 표시하는 구조입니다. 세 문서 공격에 이 단일 계층을 적용하자 성공률이 95%에서 20%로 낮아졌지만, 공격자가 어휘를 바꿔 유사도를 0.78에서 0.82 수준으로 낮추면 검색 가능성을 유지하면서 임계값을 피할 수 있습니다.
python
for i, e_i in enumerate(new_embeddings):
    for j in range(i + 1, len(new_embeddings)):
        if cosine_similarity(e_i, new_embeddings[j]) > CLUSTER_THRESHOLD:  # 0.90
            flag("TIGHT_CLUSTER — possible coordinated injection")

새로 들어온 임베딩끼리의 높은 쌍별 유사도를 검사해 협력형 문서 주입을 탐지합니다.

04
임계값은 보편적인 보안 상수가 아니라 컬렉션과 임베딩 모델에 종속된 운영값입니다. 글은 평균에 표준편차 두 배를 더한 수준을 출발점으로 삼되, 문서가 누적되는 방식과 정상적인 수정·정정 문서의 유사도 분포를 측정한 뒤 다시 조정하라고 권고합니다. all-MiniLM-L6-v2에서 Qwen3-Embedding이나 BGE-M3로 모델을 교체하면 임베딩 공간과 분포가 달라지므로, 모델 버전과 임계값을 함께 고정하고 마이그레이션 때 재기준화해야 합니다.
python
# Vulnerable: no notion of who is asking
results = collection.query(query_embeddings=[query_embedding], n_results=3)

# Hardened: retrieval scoped to the requester's clearances
results = collection.query(
    query_embeddings=[query_embedding],
    n_results=3,
    where={"classification": {"$in": user_permitted_classifications}},
);

사용자에게 허용된 문서 분류를 where 조건으로 제한해 검색 단계에서 권한 밖의 문서가 컨텍스트에 들어오지 않게 합니다.

05
권한 제어는 검색 이후의 출력 감시보다 먼저 적용되어야 하며, 모든 검색 경로에 사용자 권한과 문서 분류를 연결해야 합니다. 필터 없이 salary data, litigation detail, M&A pipeline을 보관한 실험용 컬렉션을 일반 engineering user로 질의하자 20회 중 20회 confidential content가 반환됐지만, where={"classification": {"$in": user_permitted_classifications}} 조건은 권한 밖 문서가 컨텍스트 창에 들어오는 것을 차단합니다. 메인 채팅 경로만 보호하고 요약 작업이나 평가 하네스에 비필터 검색을 남겨 두면 접근 통제가 완성된 것처럼 보이면서 실제로는 누출 경로가 유지되므로 모든 retrieval call을 점검해야 합니다.
06
임베딩 벡터가 원문을 복원할 수 없다는 가정도 현재 연구와 맞지 않습니다. Vec2Text는 32-token 입력의 92%를 정확히 복원했고 임상 노트 데이터셋에서 전체 이름도 복원했으며, ALGEN은 공격자가 수백만 개의 텍스트·임베딩 쌍을 확보해야 한다는 전제를 약 1,000쌍 수준으로 줄이고 ROUGE-L 최대 약 46을 보고했습니다. LAGO는 언어 유사도 그래프 최적화로 언어별 최소 10개 샘플을 사용해 ALGEN보다 ROUGE-L을 10~20% 높였으므로, 원문을 저장하지 않았다는 이유만으로 벡터 저장소 유출을 metadata leak으로 분류하기 어렵습니다.
07
벡터 저장소는 모델 파이프라인의 부속물이 아니라 문서와 같은 민감도로 보호해야 하는 보안 자산입니다. 인증된 API, 최소 권한 서비스 계정, 별도 보관·순환하는 관리자 자격 증명, 원문 민감도에 맞춘 분류, 대량 임베딩 조회와 대규모 ingestion 감시, 동일한 접근 통제를 가진 point-in-time snapshot이 필요합니다. 다중 테넌트 환경에서는 IronCore Labs의 Cloaked AI처럼 테넌트별 키를 사용하는 property-preserving encryption을 검토할 수 있지만, 검색 지연과 키 관리 비용을 감수해야 하며 임베딩 모델 교체와 이상 탐지 임계값도 함께 관리해야 합니다.

용어 해설

코사인 유사도(Cosine Similarity)
두 벡터가 이루는 각도의 유사성을 측정하는 값으로, 값이 높을수록 임베딩 공간에서 방향이 가깝다는 뜻입니다. 그러나 문서의 진실성, 출처, 권위, 정확성을 판별하지는 못하므로 검색 순위와 사실 여부를 동일하게 취급하면 안 됩니다.
밀집 검색(Dense Retrieval)
문서와 질의를 고정 길이 벡터로 변환한 뒤 임베딩 공간에서 가까운 벡터를 찾는 검색 방식입니다. 의미적으로 비슷한 문서를 빠르게 모을 수 있지만, 검색 결과의 사실성이나 접근 권한까지 자동으로 보장하지는 않습니다.
임베딩 역변환(Embedding Inversion)
저장된 임베딩 벡터에서 원문이나 원문에 가까운 텍스트를 복원하는 공격 기법입니다. Vec2Text와 ALGEN 같은 연구는 벡터가 완전히 비가역적인 값이라는 통념에 의문을 제기하며, 공격자가 확보해야 할 학습 쌍의 수를 줄여 왔습니다.
벡터 데이터베이스 오염(Vector Poisoning)
공격자가 특정 질의와 가까운 임베딩을 갖도록 조작한 문서를 벡터 저장소에 삽입하는 공격입니다. 조작 문서가 검색 상위권을 차지하면 진짜 문서가 컨텍스트 창에 들어오지 못해 RAG 모델의 답변이 허위 정보 쪽으로 기울 수 있습니다.
속성 보존 암호화(Property-Preserving Encryption)
암호화된 데이터의 특정 비교 속성을 유지해 원문을 복호화하지 않고도 최근접 이웃 검색을 수행하게 하는 암호화 방식입니다. 이 글에서는 테넌트별 키로 암호화된 벡터를 검색하는 접근으로 소개되지만, 검색 지연과 키 관리 비용이 함께 발생합니다.

기술

  • sentence-transformers/all-MiniLM-L6-v2
  • EmbeddingGemma-300M
  • Qwen3-Embedding
  • BGE-M3
  • ChromaDB
  • Qwen2.5-7B-Instruct
  • Vec2Text
  • ALGEN
  • LAGO
  • Cloaked AI

활용 사례

  • RAG 지식베이스의 문서 오염 탐지
  • 다중 테넌트 SaaS의 검색 권한 분리
  • 벡터 저장소 유출 사고 대응과 민감도 평가
  • 임베딩 역변환 위험을 포함한 벡터 데이터베이스 보안 점검
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 09. 08.수집 2026. 09. 09.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.