---
title: 자체 호스팅 샌드박스의 메모리 스토어
url: https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes-memory
description: "자체 호스팅 샌드박스에서 실행되는 Claude Managed Agents 세션에 메모리 스토어를 연결합니다: 호스트를 준비하고, 동기화를 구성하고, 읽기 전용 스토어와 충돌을 처리합니다."
featureMetadata:
  topic:
    title: Managed Agents
    url: https://platform.claude.com/docs/en/managed-agents/overview
  status: beta
  betaHeader: managed-agents-2026-04-01
---

자체 호스팅 환경의 세션은 클라우드 환경의 세션과 똑같은 방식으로 [메모리 스토어](https://platform.claude.com/docs/ko/managed-agents/memory)를 연결합니다. [세션에 메모리 스토어 연결](https://platform.claude.com/docs/ko/managed-agents/memory#attach-a-memory-store-to-a-session)에 나와 있는 것처럼, 세션을 생성할 때 `resources` (csharp, go: `Resources`)에 나열하세요. 하나의 세션은 최대 8개의 메모리 스토어를 허용합니다.

차이점은 누가 스토어를 구체화하는가입니다. 자체 호스팅 환경에서는 Anthropic의 인프라가 아니라 사용자의 워커가 각 스토어를 샌드박스로 다운로드하고 에이전트의 변경 사항을 다시 동기화합니다.

## 요구 사항

* **메모리 스토어를 마운트하는 워커:** `ant` CLI 1.33.0 이상을 사용하거나, Python, TypeScript 또는 Go SDK의 `EnvironmentWorker`를 사용하세요.
* **POSIX 파일 시스템:** 워커가 메모리 파일을 열 때 `O_NOFOLLOW`가 필요하므로 Windows 호스트는 지원되지 않습니다. 대소문자만 다른 메모리 경로가 충돌하지 않도록 대소문자를 구분하는 파일 시스템을 권장합니다.
* **쓰기 가능한 `/mnt/memory` 디렉터리:** [호스트 준비하기](https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes-memory#prepare-the-host)를 참조하세요.
* **작업 항목의 시크릿:** 직접 작성한 코드가 워커를 실행하는 경우, 워커에 [작업 항목의 시크릿을 전달](https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes-workers#forward-the-work-items-secret)하세요.

<Note>
  [Claude Platform on AWS](https://platform.claude.com/docs/ko/build-with-claude/claude-platform-on-aws)의 자체 호스팅 환경 세션에는 메모리 스토어를 연결할 수 없습니다.
</Note>

## 호스트 준비하기

워커를 시작하기 전에 상위 디렉터리를 생성하고, 워커를 실행하는 사용자가 쓸 수 있도록 설정하세요:

```bash
sudo mkdir -p /mnt/memory && sudo chown "$USER" /mnt/memory
```

스토어별 디렉터리는 직접 생성하지 마세요. 워커는 세션이 시작될 때 각 스토어의 `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`) 디렉터리(예: `/mnt/memory/user-preferences`)를 생성하고 세션이 끝나면 제거합니다. 해당 경로에 이미 무언가가 존재하면 워커는 세션의 작업 시작을 거부합니다.

[세션당 샌드박스 패턴](https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes-workers#run-one-sandbox-per-session)에서는 샌드박스 이미지에 쓰기 가능한 `/mnt/memory`가 필요합니다. 워커가 샌드박스가 종료되기 전에 메모리 디렉터리의 내용을 스토어에 업로드하므로, 메모리 디렉터리를 호스트에 바인드 마운트할 필요는 없습니다.

### 스토어를 공유하는 세션 격리하기

두 세션은 동일한 경로가 필요하므로 하나의 호스트에서 같은 스토어를 동시에 마운트할 수 없습니다. 세션들이 같은 스토어를 연결하는 경우, 파일 시스템당 하나의 세션을 실행하세요. 각 세션에 [자체 샌드박스](https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes-workers#run-one-sandbox-per-session)를 제공하면 이 규칙을 충족합니다.

## 워커가 메모리를 처리하는 방식

워커가 메모리 스토어가 연결된 세션의 작업 항목을 가져오면 다음을 수행합니다:

1. **각 스토어를 해당 `mount_path` (java, php: `mountPath`; csharp, go: `MountPath`)에 다운로드합니다.** 이는 클라우드 세션이 사용하는 것과 동일한 `/mnt/memory/` 아래의 디렉터리이며, 세션의 시스템 프롬프트가 이를 에이전트에게 설명합니다. 예를 들어, "User Preferences"라는 이름의 스토어는 `/mnt/memory/user-preferences/`에 위치합니다.
2. **파일 도구가 해당 디렉터리를 사용할 수 있게 합니다.** 에이전트는 작업 디렉터리에서 사용하는 것과 동일한 파일 도구로 메모리를 다룹니다.
3. **도구 호출 후 변경 사항을 조정합니다.** 이는 동기화 간격(기본값 15초)당 최대 한 번 수행됩니다. 스토어에서 변경된 메모리는 디스크에 기록되고, 에이전트가 변경한 파일은 스토어에 업로드됩니다.
4. **세션이 끝나면 최종 동기화를 실행합니다.** 아직 대기 중인 업로드를 최대 30초 동안 플러시한 다음, 생성했던 디렉터리를 제거합니다.

Anthropic 측의 메모리 스토어가 계속해서 신뢰할 수 있는 원본(source of truth)으로 유지됩니다. [메모리 버전](https://platform.claude.com/docs/ko/managed-agents/memory#audit-memory-changes), 수정(redaction), 그리고 Console에서 메모리를 보거나 편집하는 기능은 클라우드 세션과 동일하게 작동합니다. 에이전트의 메모리 읽기 및 쓰기는 [이벤트 스트림](https://platform.claude.com/docs/ko/managed-agents/events-and-streaming)에 일반 도구 이벤트로 나타납니다.

각 워커는 일정 간격으로 동기화하므로, 한 세션에서 작성된 변경 사항은 두 세션이 모두 동기화된 후에야 실행 중인 다른 세션에 표시됩니다. 기본 간격에서는 일반적으로 1분보다 훨씬 짧습니다. 클라우드 샌드박스의 세션은 서로의 변경 사항을 거의 즉시 확인합니다.

각 스토어 디렉터리에는 디렉터리를 해당 스토어에 연결하는 `.anthropic-memory-store`라는 마커 파일이 있습니다. 이 파일을 그대로 두세요: 워커는 마커가 없거나 변경된 디렉터리를 동기화하지 않습니다.

<Warning>
  중지되지 않고 강제 종료된 워커는 정리 작업을 실행하지 않으므로, 동기화되지 않은 편집 내용이 손실되고 스토어 디렉터리가 남게 됩니다. [워커를 정상적으로 중지하기](https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes-operations#stop-workers-gracefully)를 참조하세요.
</Warning>

## 동기화 구성하기

두 가지 `EnvironmentWorker` 옵션이 메모리 동작을 제어합니다. 웹훅 핸들러를 포함하여 워커를 생성하는 모든 곳에서 이를 설정하세요. `ant` CLI 워커는 항상 기본값을 사용합니다.

### 동기화 간격

`memory_sync_interval` (typescript: `memorySyncIntervalMs`; go: `MemorySyncInterval`)는 세션이 실행되는 동안 연결된 스토어가 서버와 조정되는 빈도를 설정합니다.

| 설정          | 값                                                   |
| ----------- | --------------------------------------------------- |
| 기본값         | 15초                                                 |
| 최솟값         | 5초                                                  |
| 예시(10초)     | `10` (typescript: `10_000`; go: `10 * time.Second`) |
| 메모리 지원 비활성화 | `None` (typescript: `null`; go: `-1`)               |

간격이 짧을수록 다른 세션이 오래된 메모리를 보게 되는 시간 범위가 줄어들지만, 메모리 스토어 요청이 더 많아집니다.

메모리 스토어를 연결하지 않는 세션을 처리하는 워커에서만 메모리 지원을 비활성화하세요. 비활성화된 워커는 스토어를 다운로드하거나 동기화하지 않으므로, 스토어가 연결된 세션은 시스템 프롬프트가 여전히 스토어를 설명하고 있음에도 스토어 없이 실행됩니다.

메모리 지원이 활성화된 상태에서, 스토어가 연결된 세션에 대해 `secret` (csharp, go: `Secret`) 없이 도착한 작업 항목은 메모리 없이 실행되는 대신 실패합니다. [메모리 스토어 마운트 실패](https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes-operations#memory-stores-fail-to-mount)를 참조하세요.

### 삭제

`memory_sync_deletions` (typescript: `memorySyncDeletions`; go: `MemorySyncDeletions`)는 에이전트가 로컬에서 삭제한 파일을 스토어에서도 삭제할지 여부를 설정합니다. 업로드와 다운로드에는 영향을 주지 않습니다.

| 값                                                                 | 동작                                                                            |
| ----------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `"enabled"` (go: `environments.MemorySyncDeletionsEnabled`) (기본값) | 이후 동기화에서 파일이 여전히 없는 것으로 확인되면 스토어에서 메모리를 삭제합니다.                                |
| `"log_only"` (go: `environments.MemorySyncDeletionsLogOnly`)      | 동일한 검사를 실행하지만 삭제했을 항목을 로그로만 기록합니다. 활성화 모드를 신뢰하기 전에 워커가 무엇을 삭제할지 관찰하는 데 사용하세요. |
| `"disabled"` (go: `environments.MemorySyncDeletionsDisabled`)     | 스토어에서 절대 삭제하지 않습니다.                                                           |

예를 들어, 10초마다 동기화하고 워커가 수행했을 삭제를 로그로만 기록하려면 다음과 같이 합니다:

<CodeGroup exclude="shell, csharp, java, php, ruby">
  ```python Python
  worker = EnvironmentWorker(
      client,
      environment_id=environment_id,
      environment_key=environment_key,
      workdir="/workspace",
      memory_sync_interval=10,  # seconds
      memory_sync_deletions="log_only",
  )
  ```

  ```typescript TypeScript
  const worker = new EnvironmentWorker({
    client,
    environmentId,
    environmentKey,
    workdir: "/workspace",
    memorySyncIntervalMs: 10_000,
    memorySyncDeletions: "log_only"
  });
  ```

  <CodeGroupItem language="C#">
    C# SDK에는 `EnvironmentWorker`가 없습니다.
  </CodeGroupItem>

  ```go Go
  worker := environments.NewEnvironmentWorker(client, environments.EnvironmentWorkerOptions{
  	EnvironmentID:       environmentID,
  	EnvironmentKey:      environmentKey,
  	Workdir:             "/workspace",
  	MemorySyncInterval:  10 * time.Second,
  	MemorySyncDeletions: environments.MemorySyncDeletionsLogOnly,
  })
  ```

  <CodeGroupItem language="Java">
    Java SDK에는 `EnvironmentWorker`가 없습니다.
  </CodeGroupItem>

  <CodeGroupItem language="PHP">
    PHP SDK에는 `EnvironmentWorker`가 없습니다.
  </CodeGroupItem>

  <CodeGroupItem language="Ruby">
    Ruby SDK에는 `EnvironmentWorker`가 없습니다.
  </CodeGroupItem>
</CodeGroup>

## 읽기 전용 스토어와 충돌

`access: "read_only"`로 연결된 스토어의 경우, `write` 및 `edit` 도구는 해당 디렉터리 내부의 파일 변경을 거부합니다. 워커는 해당 디렉터리에서 아무것도 업로드하지 않습니다.

`bash`를 통해, 또는 샌드박스에서 제공하는 사용자 정의 도구나 MCP 서버를 통해 이루어진 변경은 로컬에서 차단되지 않습니다. 이러한 변경은 스토어에 절대 동기화되지 않으며, 해당 메모리에 대한 다음 원격 변경이 이를 덮어씁니다. 세션 동안 로컬 사본 자체가 변경되지 않아야 하는 경우:

* 해당 에이전트의 `bash` 도구를 비활성화하고, 샌드박스의 파일 시스템에 쓰는 사용자 정의 도구를 제공하지 마세요.
* 스토어 경로를 읽기 전용으로 마운트하지 마세요. 워커 자체가 디렉터리를 생성하고 다운로드한 메모리를 그 안에 써야 합니다.

충돌은 스토어에 유리하게 해결됩니다. 세션이 마지막으로 동기화한 이후 스토어에서도 변경된 메모리 파일을 에이전트가 변경했다고 가정해 보겠습니다. 다음 동기화 시 워커는 스토어의 버전을 유지하고, 이를 로컬 파일에 덮어쓰며, 경고를 로그로 기록합니다. `write` 및 `edit` 도구 자체는 성공하며 에이전트에게 오류가 전달되지 않습니다. 에이전트의 변경이 여전히 유효하다면, 동기화 후 파일을 다시 읽고 변경을 다시 수행할 수 있습니다.

## 문제 해결

워커의 로그 메시지와 해결 방법은 [메모리 스토어 마운트 실패](https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes-operations#memory-stores-fail-to-mount)를 참조하세요.
