OpenClaw 구축·운영 (9/26) — 아키텍처 가이드: openclaw.json 구조와 보안

권한 격리, 라우팅 최적화, Fallback 체인으로 구축한 런타임 제어 설계


핵심 요약

  • openclaw.json은 게이트웨이, 에이전트, 채널, 도구를 중앙 제어하는 상태 기계(State Machine) 설계도다
  • JSON5 형식 + 엄격한 스키마 검증으로 Silent Failure를 방지한다
  • 최소 권한 원칙(Least Privilege)이 가장 중요한 설계 판단이었다

배경

로컬 LLM과 외부 API를 혼합한 다중 에이전트 시스템에서 가장 큰 기술적 난제는 "각 컴포넌트 간의 권한 격리와 라우팅 최적화"다. OpenClaw에서 이 런타임 동작을 중앙 제어하는 핵심이 ~/.openclaw/openclaw.json이다. 단순 환경 변수 모음이 아니라, 시스템 전체의 동작을 정의하는 아키텍처 그 자체다.

본문

JSON5와 엄격한 스키마 검증

OpenClaw 설정은 JSON5를 지원한다. 주석과 후행 쉼표(Trailing commas)를 허용해 유지보수성이 높다. 동시에 지정되지 않은 키나 오타 발생 시 Gateway가 부팅을 거부한다. 런타임 중 조용한 실패(Silent Failure)를 방지하기 위한 의도적 설계다.

4가지 핵심 블록

1. Gateway 및 환경 (네트워크/보안) 게이트웨이는 시스템 진입점이다. 포트 바인딩, 리버스 프록시 헤더, 핫 리로드 정책을 결정한다. 민감한 자격 증명은 auth-profiles.json 외부 저장소로 분리해 보안을 강화했다.

2. Agents (모델 할당/작업 공간) defaults로 전역 설정을 강제하고, list로 개별 에이전트 특성을 오버라이드한다. sandbox로 코드 실행을 Docker 환경에 격리한다.

3. Channels (메시징/라우팅) WhatsApp, Telegram, Slack 등 플랫폼별 접근 제어. bindings 배열이 선착순 매칭(First-match wins)이므로 배열 순서가 아키텍처적으로 중요하다.

4. Tools 및 Skills (행동 권한) tools.profile로 기본 프로필 설정, allow/deny로 전역 제어. deny가 항상 우선한다. elevated(호스트 직접 실행)는 엄격히 제한한다.

내가 내린 설계 판단: 최소 권한 원칙

  1. Tool 권한 격리: tools.elevated 기본 비활성화. 파일 시스템 접근은 반드시 sandbox(Docker) 내부로 제한
  2. 명시적 라우팅: 와일드카드(*) 범용 라우팅 대신 채널별 명시적 라우팅을 상단 배치
  3. Fallback 체인: 외부 API(Anthropic)를 primary로, 로컬 모델을 fallbacks에 배치해 가용성 확보

최소 권장 구조

{
  "gateway": {
    "mode": "local",
    "port": 18789,
    "auth": { "mode": "token", "token": "SECURE_TOKEN_HERE" }
  },
  "agents": {
    "defaults": {
      "workspace": "~/.openclaw/workspace",
      "model": {
        "primary": "anthropic/claude-sonnet-4-5",
        "fallbacks": ["openai/gpt-4o-mini"]
      }
    },
    "list": [
      { "id": "main", "name": "Main Agent", "default": true }
    ]
  },
  "tools": {
    "profile": "coding",
    "deny": ["canvas", "elevated_exec"]
  }
}

시행착오 / 주의사항

초기에 bindings 배열에 와일드카드 라우팅을 상단에 배치했다가, 의도하지 않은 에이전트가 모든 메시지를 가로채는 문제가 발생했다. 선착순 매칭 구조에서는 구체적인 규칙을 먼저, 범용 규칙을 나중에 배치해야 한다.

마무리

openclaw.json은 시스템의 보안, 가용성, 에이전트 역할을 정의하는 아키텍처 그 자체다. 모든 키는 생략 시 안전한 기본값(Safe Defaults)으로 동작하지만, 운영 환경에서는 채널별 정책과 도구 권한을 명시적으로 선언하는 것이 필수다.

시리즈 전체 안내: 시리즈 목차

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"