ReRAG: 관계 기반 접근 제어(ReBAC)를 통합한 안전한 RAG 시스템

ReRAG 소개

ReRAG은 Retrieval-Augmented Generation (RAG) 시스템에 관계 기반 접근 제어(ReBAC, Relationship-Based Access Control) 를 결합한 새로운 형태의 LLM 기반 데이터 접근 프레임워크입니다. 기존 RAG 시스템은 대형 언어 모델(LLM)이 외부 문서에서 정보를 검색하고 이를 응답에 활용할 수 있게 하지만, 다중 사용자 환경에서는 보안과 권한 관리 측면에서 한계가 있습니다. 예를 들어, 한 사용자가 접근할 수 없는 문서의 내용이 다른 사용자의 질문을 통해 우연히 노출될 수 있는 ‘데이터 누출’ 문제가 발생할 수 있습니다.

ReRAG은 이런 문제를 Ory Keto(Google Zanzibar 기반의 오픈소스 ReBAC 시스템)Ollama(로컬에서 실행 가능한 LLM 플랫폼)를 활용해 해결합니다. 즉, 단순히 문서를 검색해 LLM에게 넘기기 전에 사용자 권한을 검증하고 필터링하는 계층을 삽입함으로써, LLM이 오직 접근이 허용된 데이터만을 학습 맥락(Context)에 포함하도록 설계되어 있습니다.

ReRAG 프로젝트는 단순한 예시나 데모 수준이 아니라, 실제 기업 환경에서도 RAG 시스템의 보안성을 강화할 수 있는 ‘권한 인식(permission-aware)’ RAG 아키텍처의 표준 레퍼런스 구현체입니다.


기존 RAG 시스템은 사용자 요청에 맞는 문서를 검색하고, 그 결과를 LLM 프롬프트에 삽입하여 응답을 생성합니다. 문제는 이 과정에서 모든 검색 결과가 단일 사용자 권한을 고려하지 않은 채 전달된다는 점입니다. 예를 들어, “환불 금액이 얼마였나?”라는 질문에 대해, 한 사용자는 자신이 접근할 수 없는 다른 고객의 데이터까지 응답으로 받을 수 있습니다.

ReRAG은 이 구조를 다음과 같이 변경합니다:

  1. 사용자가 요청을 보낼 때, 시스템은 Ory Keto를 통해 사용자의 권한을 검증합니다.

  2. 검색 단계에서 sqlite-vec을 이용해 빠른 벡터 검색을 수행하되, 권한이 없는 문서는 결과 집합에서 제거됩니다.

  3. Ollama 등이 제공하는 LLM은 오직 허용된 문서에만 접근하여 응답을 생성합니다.

이로써 LLM은 한 번도 비인가 데이터를 ‘보거나 기억할’ 수 없는 구조가 되며, 프롬프트 인젝션(prompt injection)이나 권한 우회를 통한 데이터 누출 위험이 원천 차단됩니다.

ReRAG의 주요 기술 구성요소

ReRAG의 기술 스택은 완전히 오픈소스로 구성되어 있으며, 로컬 환경에서도 손쉽게 실행할 수 있습니다.

  • Ory Keto: Google Zanzibar 기반의 관계형 접근 제어 시스템 (ReBAC)

  • Ollama: 로컬에서 실행되는 LLM 서버 (예: llama3.2:1b, nomic-embed-text)

  • SQLite + sqlite-vec: 문서 임베딩과 벡터 검색을 위한 고성능 저장소

  • Go 언어: 백엔드 서버 구현 (CGO 기반 빌드 필요)

  • Docker: Ollama 컨테이너 실행 및 의존성 관리

  • TLS/HTTPS: 전송 구간 암호화 지원

ReRAG의 작동 원리

graph TD

    %% ------------------------
    %% Add documents flow
    %% ------------------------
    subgraph ADD["📥 Document Management"]
      AA["New Document (POST /documents)"]
      AA --> H["Permission Assignment (Ory Keto)"]
      AA --> DD["Generate Embeddings (Ollama)"]
      DD --> I
    end

    %% ------------------------
    %% Query flow
    %% ------------------------
    subgraph QUERY["🔎 Query Documents"]
      A["📝 User Query"]
      A --> B["🔒 Auth Middleware"]
      B --> D["🔍 Vector KNN Search (sqlite-vec)"]
      D --> E["🛂 Permission Check (Ory Keto)"]
      E --> F["🤖 LLM Processing (Ollama)"]
      F --> G["✅ Secure Response"]
      I["SQLite vec0 Virtual Table"]
      J["Ollama / LLM"]
    end

    %% Wiring external systems
    H --> E
    I --> D
    J --> F

ReRAG의 작동 흐름은 크게 문서 업로드 단계질의 처리 단계로 나뉩니다:

  • 문서 업로드 단계: 사용자가 문서를 업로드를 하면, 문서의 소유자 및 접근 가능한 관계 정보를 Ory Keto에 등록합니다. 이후, Ollama를 사용하여 해당 문서의 임베딩 벡터를 생성하고 sqlite-vec에 저장합니다.

  • 질의 처리 단계: 사용자가 궁금한 것을 물어보면, 인증 미들웨어가 사용자의 신원을 확인하고 권한 정보를 가져옵니다. 이 때 sqlite-vec에서 벡터 검색을 수행하되, Keto로부터 받은 권한 정보를 기반으로 결과를 필터링합니다. 이후, 필터링된 문서만을 기반으로 Ollama가 답변을 생성합니다.

이러한 구조는 데이터 누출 방지, 권한별 결과 제공, 프롬프트 공격 방지, 감사 추적성 확보의 장점을 제공합니다.

Vector Search 성능 및 알고리즘

ReRAG의 벡터 검색은 sqlite-vec의 KNN(K-Nearest Neighbors) 알고리즘을 기반으로 합니다. 데이터베이스 내부에서 벡터 연산이 수행되므로 메모리 로드 오버헤드가 적고, SQL 수준에서 직접 검색이 가능합니다. ReRAG은 권한 기반 필터링을 효율적으로 수행하기 위해 Adaptive Recursive Search Algorithm을 사용합니다:

  1. 초기 후보 결과(topK × 2)를 검색합니다.

  2. 권한 필터를 적용해 접근 가능한 문서만 남깁니다.

  3. 만약 결과가 부족하면 후보 수를 2배로 늘려 다시 검색합니다.

  4. 최대 10회 반복하며 충분한 결과를 얻으면 종료합니다.

이 방식은 사용자의 접근 가능한 문서 비율이 낮더라도 효율적으로 작동하며, 전체 문서를 불필요하게 읽어들이지 않아 성능을 유지합니다.

설정 및 실행 방법

필수 구성요소

  • Docker (Ollama 컨테이너 실행용)
  • Go 1.22+
  • tmux (선택사항, make dev 시 사용)
  • C Compiler (CGO용)

실행 예시

git clone https://github.com/ory/rerag-rebac.git
cd rerag-rebac
make install    # Ollama, Keto, 모델 설치
make dev        # tmux를 이용해 Keto와 앱 동시 실행
make demo       # 권한별 질의 데모 실행

주요 구성 옵션 (config.yaml 예시)

server:
  host: 'localhost'
  port: 4477
services:
  ollama:
    base_url: 'http://localhost:11434'
    llm_model: 'llama3.2:1b'
  keto:
    read_url: 'http://localhost:4466'
    write_url: 'http://localhost:4467'
security:
  auth_mode: 'mock' # JWT 기반 인증도 가능
database:
  encryption:
    enabled: true
    key: 'your-32-character-encryption-key'

TLS 인증서나 DB 암호화를 설정하면 HTTPS 통신과 데이터 보호가 강화됩니다.

라이선스

ReRAG 프로젝트는 Apache 2.0 License로 배포되고 있습니다. 상업적 이용과 수정이 가능하나, 저작권 고지를 유지해야 합니다.

:github: ReRAG 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: