본문으로 건너뛰기
메뉴

제품

솔루션

연동

개발자

언어

제품

무엇을 저장하고, 무엇이 컴퓨터 밖으로 나가는가

기본 설치는 자신의 머신에서만 연결을 받고 텔레메트리가 없습니다. 캡처한 텍스트를 저장하기 전에 인식한 자격 증명을 마스킹하지만 민감한 정보를 놓칠 수 있습니다. 원격 서버나 선택 사항인 클라우드 제공업체를 쓰면 데이터의 전송 위치가 달라집니다.

기본값은 로컬입니다.

설치하고 실행하면, 서버와 통신할 수 있는 것은 내 컴퓨터뿐입니다.

  • 루프백 전용

    서버는 127.0.0.1:49374에 바인드합니다. 컴퓨터 밖의 어떤 프로세스도 접근할 수 없습니다. 새로 설치하면 Bearer 토큰을 소유자만 읽을 수 있는 파일에 만들고 훅과 CLI가 그 파일을 읽으므로, 루프백에서도 열려 있는 곳이 없습니다.

  • 텔레메트리 없음

    ai-memory 바이너리에는 분석, 크래시 보고, 사용 추적이 없습니다. 기본 로컬 캡처와 검색은 프로젝트 내용을 외부 모델 제공업체에 보내지 않습니다.

  • 내가 소유한 디렉터리 하나

    위키 페이지와 SQLite 파일은 데이터 디렉터리 하나 아래에 있습니다. Unix에서는 새 디렉터리를 0700, 새 파일을 0600으로 만듭니다.

  • 저장 데이터 암호화 없음

    저장된 데이터의 보호는 파일시스템 권한에 의존합니다. 기존 설치의 권한을 자동으로 바꾸지는 않습니다. 머신이 꺼져 있을 때 보호가 필요하면 디스크 암호화를 사용하세요.

캡처한 텍스트는 저장 전에 필터링합니다.

훅 페이로드는 신뢰할 수 없는 텍스트입니다. 새니타이저를 거쳐 인식한 자격 증명을 마스킹하고 크기를 제한합니다. 민감한 정보를 놓칠 수 있습니다.

훅 페이로드

sanitize()

시크릿 제거

저장

크기 제한

훅 페이로드가 스토어로 들어가는 경로는 새니타이저뿐입니다.
  • 입구는 하나

    저장되는 타입은 sanitize()로만 만들 수 있습니다. 프라이버시 제거 단계를 건너뛰는 코드는 컴파일되지 않습니다.

  • 시크릿은 치환됩니다

    일치하는 부분은 [REDACTED:github_token]이나 [REDACTED:jwt] 같은 타입이 붙은 마커로 바뀝니다. JSON 안의 시크릿과 Windows 자격 증명 경로도 대상이고, 터미널 이스케이프 시퀀스는 제거됩니다. 이 제거는 best effort입니다.

  • 크기에 상한이 있습니다

    도구 출력 발췌는 2 KB, 프롬프트는 16 KiB에서 잘립니다. 마스킹이 끝난 뒤 저장되는 모든 본문에는 16 KiB 상한이 한 번 더 적용됩니다.

  • 도구 입력은 남기지 않습니다

    PreToolUse 이벤트는 명령, 인자, 경로, 입력 본문을 절대 보관하지 않습니다. 관찰 기록은 감사 추적이며 전체 트랜스크립트가 되는 일은 없습니다. 선택해서 켜는 [ingest] index_file_paths만 필드 하나를 더합니다. 보관된 파일 도구 호출이 지목한 파일 하나의 체크아웃 기준 상대 경로이며, 내용은 아닙니다. 제외된 경로는 여전히 아무것도 보내지 않습니다.

특정 경로나 저장소 제외하기

  • .ai-memory.toml의 [capture] 블록에 무시할 경로를 나열합니다. 일치하는 이벤트는 스풀, 네트워크, 로그에 닿기 전에 내 컴퓨터에서 버려집니다.
  • allowlist 모드는 이를 뒤집습니다. 이 파일이 없는 저장소는 이벤트를 전혀 내보내지 않습니다.
  • 규칙 세트가 유효하지 않으면 메타데이터만 남기는 방식으로 돌아갑니다. 정책을 절반만 적용하는 일은 없습니다.
  • 파일 경로와 인식 가능한 셸 인수를 어휘적으로 검사합니다. 심볼릭 링크, 셸 변수, 파일에서 읽는 스크립트는 검사를 피할 수 있으며, 프롬프트는 경로로 필터링하지 않습니다. 캡처 필터링에는 한계가 있으며 완전한 DLP를 제공하지 않습니다.
  • 어시스턴트 출력은 기본적으로 저장되지 않습니다. 서버 플래그와 클라이언트 플래그를 함께 켜야 합니다.
  • 백필과 관리형 워크스트림 가져오기에도 도구 호출과 결과에 같은 캡처 규칙을 적용합니다. 제외된 호출은 가져오지 않으며, 정책상 안전한지 확인할 수 없는 호출은 도구 종류의 메타데이터만 남깁니다.
저장소별 캡처 규칙
# 저장소 안의 .ai-memory.toml
[capture]
ignore_paths = ["private/**", "~/personal-notes/**"]

# 또는 옵트인한 저장소만 캡처
ai-memory install-hooks --apply --capture-mode allowlist

배포 구성에 맞는 보호

원격 접근에는 LAN에서도 인증과 TLS가 모두 필요합니다. 클라이언트를 연결하기 전에 구성에 해당하는 모든 요구 사항을 적용하세요.

  1. 한 사람, 컴퓨터 한 대

    루프백, 파일에 저장된 토큰

    ai-memory init이 <data_dir>/auth-tokens/default에 토큰을 만들고, 훅, CLI, MCP 브리지가 거기서 읽습니다. 3.0 이전에 설치한 환경은 ai-memory auth enable을 실행하기 전까지 인증 없이 계속 동작하며, 이 명령이 토큰을 발급하고 모든 클라이언트를 다시 등록합니다.

  2. 홈랩 서버나 두 번째 컴퓨터

    LAN용 Bearer 토큰

    ai-memory generate-auth-token으로 토큰을 만들고 AI_MEMORY_AUTH_TOKEN에 설정하세요. 토큰은 상수 시간으로 비교되며 /mcp, /hook, /handoff와 관리자, API 라우트를 보호합니다. AI_MEMORY_ALLOWED_HOSTS도 함께 설정하세요. DNS 리바인딩을 막아 주지만 토큰을 대신하지는 못합니다.

  3. 루프백을 벗어나는 모든 경우

    리버스 프록시를 통한 TLS

    ai-memory는 의도적으로 TLS를 종단하지 않습니다. Bearer 토큰은 전송 구간에서 암호화되지 않으므로 Caddy, nginx, Cloudflare Tunnel 중 하나를 앞에 두세요. 저장소에 Caddy와 cloudflared용 compose 템플릿이 있습니다. 다른 컴퓨터에서 로그인하는 사람이 있다면 AI_MEMORY_AUTH__SECURE_COOKIE=true를 설정하세요.

  4. 쓰는 사람이 둘 이상

    계정과 API 키

    비밀번호는 Argon2id 해시로 저장됩니다. 컴퓨터마다 aim_ 키를 발급하며, 키는 한 번만 출력되고 다시 보여 주지 않습니다. ai-memory api-key rotate <id>를 실행하면 이전 키는 즉시 401을 받습니다. 첫 계정을 만들면 모든 /admin/* 라우트가 루트 전용이 됩니다.

  5. 팀이 이미 Keycloak, Okta, Entra ID를 쓰는 경우

    훅을 위한 OIDC 디바이스 인증

    네이티브 훅과 CLI는 ai-memory auth login oidc-device로 받은 토큰을 실어 보낼 수 있습니다. 서버가 OIDC 토큰을 직접 검증하지는 않으므로 OIDC를 이해하는 게이트웨이를 앞에 둬야 합니다. 게이트웨이를 거치는 훅과 CLI 인증이며, 서버에는 내장 SSO 로그인이 없습니다.

무엇이, 언제 컴퓨터 밖으로 나가는가.

이 설정들은 메모리 콘텐츠를 모델 제공자에게 보낼 수 있으며 기본적으로 꺼져 있습니다. 원격 서버 훅, 설정된 승인 웹훅, 직접 지정한 백업 대상도 별도의 데이터 경로로 검토해야 합니다.

경로전송되는 내용켜는 방법기본값
원격 임베딩저장된 모든 페이지의 전체 텍스트. 나중에 전환하면 기존 코퍼스도 소급해서 전송합니다. 이 경로는 다른 경로처럼 정제를 거치지 않습니다.embedding_provider = openai | voyage | google | openai-compat꺼짐
어시스턴트 출력 캡처어시스턴트의 마지막 턴 텍스트. 클라우드 LLM도 설정한 경우에만 전송됩니다. 설치 전체에 적용되며 Claude Code와 Codex만 해당합니다.서버에서 capture_assistant, 클라이언트에서 install-hooks --capture-assistant꺼짐
LLM 리랭크실시간 쿼리 하나하나와, 길이가 제한된 페이지 제목과 스니펫 최대 30개. 마스킹하면 의미가 달라질 수 있어서 쿼리는 마스킹하지 않습니다.AI_MEMORY_RERANKER=llm꺼짐
LLM 통합과 린트저장된 관찰 기록과 페이지로 만든 프롬프트가 선택한 제공자에게 전송됩니다. 로컬 모델을 지정하면 아무것도 나가지 않습니다.AI_MEMORY_LLM_PROVIDER꺼짐

내 컴퓨터

훅

위키와 인덱스

로컬 임베더

서드파티

위키와 인덱스

클라우드 임베딩

클라우드 LLM

LLM 리랭크

옵트인, 기본은 꺼짐

실선은 안에 머뭅니다. 점선은 설정을 바꾼 뒤에만 생깁니다.

기본 로컬 수집과 검색은 프로젝트 콘텐츠를 모델 제공자에게 보내지 않습니다. 클라우드 제공자를 선택한다면 약관과 데이터 처리 방식을 검토하세요. 프로젝트의 데이터 처리 안내 보기.

누가 썼는지, 어떻게 지우는지.

작성자 표시과 감사

  • 계정을 켜면 모든 쓰기에 작성자가 붙습니다. 페이지는 프런트매터에 author_id와 last_modified_by 블록을 기록합니다.
  • 모든 변경은 audit_log 테이블에 남고, 작성자가 식별된 행에는 사용자 신원이 함께 기록됩니다.
  • 위키는 git 저장소이므로 페이지 변경 하나하나가 diff하고 복원할 수 있는 커밋이기도 합니다.
  • admission 웹훅은 액터 정보를 받아 작업을 거부할 수 있습니다.
  • 감사 로그 화면은 아직 없습니다. 행은 SQLite에 있습니다.

퍼지가 지우는 것

퍼지는 선택한 프로젝트의 데이터를 논리적으로 삭제합니다. 이력과 이전 백업에 사본이 남을 수 있습니다. 별도로 보존 규칙이 사용하지 않는 세션 페이지를 제거하고, 명시적 만료일이 다른 페이지를 삭제할 수 있습니다. --confirm이 없으면 퍼지는 삭제 대상을 미리 보여주기만 합니다.

purge
# 세션 하나 삭제
ai-memory purge-session --workspace default --project my-app --session-id <uuid> --confirm

# 프로젝트 전체 삭제
ai-memory purge-project --project experimental --confirm
퍼지 이후기본--compact 사용 시
API나 MCP 도구로 접근 가능아니요아니요
검색 결과에 나옴아니요아니요
위키에 markdown 파일이 남아 있음아니요, best effort아니요, best effort
memory.sqlite 안에 바이트가 남아 있음예, free page에아니요
위키 git 히스토리에 텍스트가 남아 있음예예
이전에 받은 백업에 들어 있음예예

--compact는 포렌식 수준의 삭제가 아닙니다. 히스토리에서 텍스트를 없애려면 위키의 git 히스토리를 다시 쓰고 백업도 직접 교체해야 합니다. 전체 절차는 라이프사이클 작업 문서에 있습니다.

여기까지가 한계입니다.

취약점 제보

  • 공개 이슈로 올리지 마세요. GitHub에서 비공개 보안 권고를 열어 주세요.
  • 7일 안에 답변을 드립니다. 패치 목표는 30일이며, 사양하지 않으면 변경 이력에 제보자 이름을 올립니다.
  • 보안 수정은 최신 릴리스에만 제공됩니다.
  • 릴리스 에셋에는 SHA-256 파일이 함께 제공되며, CI 액션은 검토를 마친 커밋에 고정되어 있습니다.

SECURITY.md의 위협 모델과 정책

자주 묻는 질문

ai-memory가 내 코드나 프롬프트를 어딘가로 보내나요?

기본적으로 ai-memory는 캡처한 프로젝트 내용을 자신의 머신에 보관합니다. 공유 서버에 연결하면 그 내용을 해당 서버로 보냅니다. 선택 사항인 클라우드 임베딩이나 언어 모델 기능은 설정한 제공업체로 데이터를 보냅니다. 코딩 에이전트에는 별도의 데이터 설정과 제공업체 연결이 있습니다.

로컬 임베더에 네트워크가 필요한가요?

처음 시작할 때 로컬 임베더가 Hugging Face에서 약 87 MB의 모델 파일을 다운로드하고 체크섬을 검증합니다. 이 다운로드에 프로젝트 내용을 보내지는 않습니다. embedding_provider = "none"을 설정하거나 모델 파일을 직접 준비하면 다운로드를 피할 수 있습니다.

시크릿이 저장되나요?

모든 훅 페이로드는 저장 전에 새니타이저를 거칩니다. 인식된 자격 증명은 타입이 붙은 [REDACTED:kind] 마커로 치환되고 본문은 크기가 제한됩니다. 새니타이저는 best effort로 자격 증명을 제거하며 보장은 하지 않습니다.

세션을 완전히 삭제할 수 있나요?

퍼지는 논리 삭제입니다. 내용에 더 이상 접근하거나 검색할 수 없게 되지만, 텍스트는 위키 git 히스토리와 이전 백업에 남습니다. --compact 플래그는 SQLite의 free page를 비우며 포렌식 수준의 삭제는 아닙니다.

ai-memory는 멀티 테넌트인가요?

아니요. 프로젝트 단위 권한 부여로 데이터베이스 사용자 계정을 제한할 수 있지만, 여전히 싱글 테넌트 서비스입니다. root는 모든 프로젝트에 접근하며 신뢰하는 프록시를 쓰는 배포에서는 프록시에서 접근을 제어합니다. 독립적인 격리가 필요한 팀에는 별도 서버를 사용하세요.

먼저 루프백에서 써 보세요.

민감한 정보가 없는 로컬 프로젝트로 시작하세요. 공유 서버나 클라우드 제공업체를 연결하기 전에 무엇이 캡처되는지 확인하세요.