본문으로 건너뛰기
메뉴

제품

솔루션

연동

개발자

언어

제품

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

기본 설치는 내 컴퓨터에서만 수신하고, 무엇이든 기록하기 전에 시크릿을 제거하며, 텔레메트리가 없습니다. 데이터를 밖으로 보내는 경로는 직접 켜기 전까지 모두 꺼져 있습니다. 이 페이지에는 프로젝트가 방어하지 않는 것도 적혀 있습니다.

기본값은 로컬입니다.

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

  • 루프백 전용

    서버는 127.0.0.1:49374에 바인드합니다. 컴퓨터 밖의 어떤 프로세스도 접근할 수 없으므로 기본 설정에는 비밀번호가 필요 없습니다.

  • 텔레메트리 없음

    바이너리에는 분석, 크래시 리포트, 사용량 추적이 없습니다. 캡처와 검색은 네트워크 호출을 한 번도 하지 않습니다.

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

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

  • 저장 데이터 암호화 없음

    버전 1은 파일 시스템 권한에 의존합니다. 기존 설치본의 권한을 대신 chmod해 주지는 않습니다. 노트북에 필요하다면 디스크 암호화를 쓰세요.

정제를 거치지 않고는 아무것도 저장되지 않습니다.

훅 페이로드는 신뢰할 수 없는 텍스트입니다. 스토어로 들어가는 길은 함수 하나뿐이고, 타입 시스템이 이를 강제합니다.

다이어그램: 키와 비밀번호가 담긴 원본 훅 페이로드가 sanitize()라고 적힌 단일 게이트로 들어갑니다. 시크릿은 게이트 아래로 떨어져 나갑니다. 반대편으로 크기가 제한된 더 작은 관찰 기록이 나와 저장됩니다.
훅 페이로드가 스토어로 들어가는 경로는 새니타이저뿐입니다.
  • 입구는 하나

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

  • 시크릿은 치환됩니다

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

  • 크기에 상한이 있습니다

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

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

    PreToolUse 이벤트는 명령, 인자, 경로, 입력 본문을 절대 보관하지 않습니다. 관찰 기록은 감사 추적이며 전체 트랜스크립트가 되는 일은 없습니다.

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

  • .ai-memory.toml[capture] 블록에 무시할 경로를 나열합니다. 일치하는 이벤트는 스풀, 네트워크, 로그에 닿기 전에 내 컴퓨터에서 버려집니다.
  • allowlist 모드는 이를 뒤집습니다. 이 파일이 없는 저장소는 이벤트를 전혀 내보내지 않습니다.
  • 규칙 세트가 유효하지 않으면 메타데이터만 남기는 방식으로 돌아갑니다. 정책을 절반만 적용하는 일은 없습니다.
  • 매칭은 문자열 기준입니다. 심볼릭 링크는 해석하지 않으며, 프롬프트와 셸 명령은 경로와 연결 지을 수 없습니다. 이것은 캡처 경계입니다. 완전한 DLP는 되지 못합니다.
  • 어시스턴트 출력은 기본적으로 저장되지 않습니다. 서버 플래그와 클라이언트 플래그를 함께 켜야 합니다.
저장소별 캡처 규칙
# 저장소 안의 .ai-memory.toml
[capture]
ignore_paths = ["private/**", "~/personal-notes/**"]

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

한 번에 한 단계씩 올리세요.

단계마다 대응하는 상황이 있습니다. 내 상황에 맞는 단계에서 멈추면 됩니다.

  1. 한 사람, 컴퓨터 한 대

    루프백, 인증 없음

    기본값입니다. 다른 어떤 것도 접속할 수 없으므로 설정할 것이 없습니다.

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

    LAN용 Bearer 토큰

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

  3. 쓰는 사람이 둘 이상

    계정과 API 키

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

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

    훅을 위한 OIDC 디바이스 인증

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

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

    리버스 프록시를 통한 TLS

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

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

데이터를 밖으로 보낼 수 있는 경로는 네 가지입니다. 네 가지 모두 기본값은 꺼짐입니다.

다이어그램: 훅, 위키와 인덱스, 로컬 임베더가 '내 컴퓨터'라고 적힌 울타리 안에 있고 실선으로 연결되어 있습니다. 클라우드 임베딩, 클라우드 LLM, LLM 리랭크로 가는 점선은 '옵트인, 기본은 꺼짐'이라고 적힌 열린 스위치를 지나 벽을 넘어갑니다.
실선은 안에 머뭅니다. 점선은 설정을 바꾼 뒤에만 생깁니다.
경로전송되는 내용켜는 방법기본값
원격 임베딩저장된 모든 페이지의 전체 텍스트. 나중에 전환하면 기존 코퍼스도 소급해서 전송합니다. 이 경로는 다른 경로처럼 정제를 거치지 않습니다.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꺼짐

이 중 어느 것도 켜지 않으면 데이터 경로에 제3자가 없습니다. 클라우드 제공자를 설정하면 그 제공자가, 당신이 그쪽과 맺은 계약에 따라 데이터 처리자가 됩니다. GDPR 관점의 정리는 DATA_HANDLING.md에 있습니다. 법률 자문은 아닙니다.

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

작성자 표시과 감사

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

퍼지가 지우는 것

퍼지(purge)는 논리 삭제이며, 프로젝트 A가 프로젝트 B의 파일을 지우는 일이 없도록 범위가 제한됩니다. 페이지가 직접 만료를 설정하지 않는 한 데이터에는 만료가 없습니다.

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가 내 코드나 프롬프트를 어딘가로 보내나요?

아니요. 텔레메트리가 없고, 캡처와 검색은 네트워크 호출을 하지 않습니다. 원격 임베딩, 클라우드 LLM을 쓰는 어시스턴트 출력 캡처, LLM 리랭크, 통합용 클라우드 LLM 제공자를 켰을 때만 데이터가 컴퓨터 밖으로 나갑니다. 모두 기본값은 꺼짐입니다.

기본 설치도 네트워크 요청을 하나요?

한 번 합니다. 2.0부터 기본 로컬 임베더가 첫 시작 때 Hugging Face에서 약 87 MB인 all-MiniLM-L6-v2 모델을 내려받습니다. 사용자 데이터는 전송되지 않습니다. 이를 피하려면 embedding_provider = "none"으로 설정하거나 모델 파일을 직접 넣어 두세요.

시크릿이 저장되나요?

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

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

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

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

아니요. 싱글 테넌트 서비스입니다. 계정은 작성자 표시을 남기는 용도이고, 인증된 사용자는 누구나 그 서버의 모든 프로젝트를 읽을 수 있습니다. 서로의 데이터를 보면 안 되는 사람들에게는 서버를 따로 운영하세요.

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

계정도 API 키도 필요 없습니다. 내 컴퓨터 말고는 아무것도 접근할 수 없습니다.