본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 15. 05:23

자체 호스팅 AI 에이전트 OS 구축하기: WASM 샌드박싱과 Frozen Core 설계를 적용한 Flowork의 마이크로커널 아키텍처

요약

Flowork는 자체 호스팅이 가능한 마이크로커널 기반의 AI 에이전트 OS입니다. WASM 샌드박싱과 고정된 커널 설계를 통해 보안과 모듈성을 극대화하며, 벤더 종속성 없는 지속적인 메모리 환경을 제공합니다.

핵심 포인트

  • 마이크로커널 아키텍처를 통한 급진적 모듈화 및 시스템 안정성 확보
  • wazero 기반 WASM 샌드박싱으로 에이전트 실행 보안 경계 구축
  • Go 언어 기반의 단일 정적 바이너리로 간편한 배포 및 운영 가능
  • 지속적인 메모리와 권한 기반 제어를 통한 주권적 AI 환경 구현

AI 에이전트의 부상은 고통스러운 모순을 불러옵니다. 에이전트는 과거의 상호작용으로부터 학습할 때 가장 잘 작동하지만, 대부분의 클라우드 호스팅 솔루션은 매 세션마다 컨텍스트 (Context)를 초기화합니다. 당신은 데이터를 소유하지 않습니다. 당신은 로직 (Logic)을 소유하지 않습니다. 당신은 벤더 (Vendor)로부터 인지 사이클 (Cognitive cycles)을 임대하고 있을 뿐입니다.

Flowork Agent는 이 모델을 뒤집습니다. 이는 당신의 자체 하드웨어에서 주권적 AI 에이전트를 실행하도록 설계된 **자체 호스팅 마이크로커널 운영체제 (Self-hosted microkernel operating system)**입니다. 시간이 지남에 따라 구축되는 지속적인 메모리 (Persistent memory), 커널 (Kernel)에 내장된 보안 의식, 그리고 벤더 종속성 (Vendor lock-in) 제로를 지향합니다.

핵심 통찰: 마이크로커널 아키텍처 (Microkernel Architecture)

Flowork의 중심에는 의도적으로 고정된 설계 철학이 자리 잡고 있습니다: 마이크로커널은 한 번 작성되면 다시는 수정되지 않습니다. 사고 (Thinking), 기억 (Remembering), 도구 실행 (Running tools), 메시지 전송 (Sending messages)과 같은 모든 기능은 loket (카운터)이라고 불리는 단일 계약을 통해 흐릅니다. 모듈은 이름을 통해 커널에 기능을 요청합니다: call(cap, args). 커널은 권한을 확인하고, 제공자 (Provider)에게 라우팅하며, 격리 (Isolation)를 강제하고, 결과를 반환합니다.

이러한 제약은 의도적입니다. 이는 **급진적인 모듈화 (Radical modularity)**를 강제합니다. 에이전트가 고장 나면 해당 폴더를 수정하면 됩니다. 도구가 실패하면 해당 도구를 패치하면 됩니다. 커널 자체, 즉 영원히 변하지 않는 코드 (Forever code)는 손대지 않은 상태로 유지됩니다. 이는 하나의 잘못된 업데이트가 모든 것에 연쇄적인 영향을 미치는 모놀리식 시스템 (Monolithic systems)과는 정반대되는 방식입니다.

커널은 Go 1.25로 작성되었으며, cgo 의존성도, Docker도, 설치할 런타임 (Runtime)도 없는 단일 정적 바이너리 (Single static binary)로 컴파일됩니다. Linux, macOS 또는 Windows에서 명령어 하나로 배포할 수 있습니다. 이 바이너리에는 커널뿐만 아니라 임베디드 웹 UI (Embedded web UI)가 포함되어 있어 별도의 프론트엔드 (Frontend)를 호스팅할 필요가 없습니다.

WebAssembly를 통한 샌드박싱 (Sandboxing): 격리된 시민으로서의 에이전트

모든 AI 에이전트는 순수 Go 언어 기반의 WASM 런타임인 wazero를 사용하여 샌드박스화된 **WebAssembly 모듈 (WebAssembly module)**로 실행됩니다. 이는 성능 최적화가 아니라 **보안 경계 (security boundary)**를 구축하기 위함입니다. 각 에이전트는 자신만의 봉인된 환경에서 실행되며, 권한 (capability)을 통해 명시적으로 허용되지 않는 한 파일 시스템을 읽거나, 프로세스를 생성하거나, 시스템 함수를 호출할 수 없습니다.

에이전트가 call("tool.run", {name: "list_files", args: ...})를 요청하면, 커널은 해당 에이전트의 허용 목록 (grant list)을 확인합니다. 만약 해당 에이전트에게 files 권한이 없다면 호출은 거부됩니다. 권한이 있다면, 커널은 요청을 파일 제공자 (file provider)로 라우팅하고 샌드박스화된 결과를 반환합니다.

이러한 설계는 환각 (hallucination)을 일으키는 에이전트가 공유 상태 (shared state)를 손상시키는 것을 방지하며, 침해된 에이전트가 다른 에이전트나 호스트 시스템으로 공격을 확대 (pivoting)하는 것을 방지합니다. 각 에이전트는 여권을 가진 시민이며, loket은 국경 역할을 합니다.

메모리: 전체 텍스트 검색 기능이 포함된 SQLite

모든 에이전트는 FTS5 (full-text search, 전체 텍스트 검색) 기능이 활성화된 자신만의 전용 **SQLite 데이터베이스 (SQLite database)**를 가집니다. 이것이 에이전트의 두뇌입니다. 에이전트가 무언가를 학습할 때—검색한 사실, 이전 오류에 대한 수정 사항, 성공적으로 사용한 도구 등—그 정보는 두뇌에 기록됩니다. 새로운 문제에 직면했을 때, 에이전트는 자신의 두뇌에 질의합니다: '이와 유사한 것을 전에 본 적이 있는가?'

이는 단순한 캐싱 (caching)이 아닙니다. 런타임 (runtime) 중에 자신의 실수로부터 학습하는 것입니다. 주식 심볼을 잘못 분류한 에이전트는 그 수정 사항을 저장하며, 다음에 유사한 입력을 접했을 때 그 교훈을 회상합니다. 이 두뇌는 세션 간에도 지속됩니다. 기계를 껐다가 다시 켜도 에이전트는 기억합니다.

실제로 이는 에이전트가 며칠 또는 몇 주 동안 사용됨에 따라 눈에 띄게 더 정확하고 일관되게(coherent) 만들어 줍니다. 에이전트는 성격, 스타일, 그리고 학습된 사각지대 (blindspots)를 갖게 됩니다.

양방향 MCP: 외부를 향해 Loket을 열다

Flowork는 **모델 컨텍스트 프로토콜 (Model Context Protocol, MCP)**을 양방향으로 구현합니다:

  • 클라이언트로서 (As a client): 에이전트는 이름을 통해 외부 MCP 서버(GitHub API, 파일 시스템 도구, 웹 검색 등)를 호출할 수 있습니다. 커널은 이러한 호출을 중개합니다.
  • 서버로서 (As a server): Claude Desktop, Cursor, 기타 에이전트와 같은 외부 도구들이 귀하의 Flowork 에이전트를 MCP 도구로서 호출할 수 있습니다.

이는 하나의 가교(bridge)를 형성합니다. 코드를 직접 내장하지 않고도 에이전트에 강력한 제3자 기능을 갖추게 할 수 있습니다. 또한 소스 코드를 공유하지 않고도 MCP를 통해 동료들과 에이전트를 공유할 수 있습니다.

권한 기반 보안 (Capability-Based Security): 수호자의 레이더

Flowork에는 **자가 보호 커널 (self-protecting kernel)**이 포함되어 있습니다. **가디언 (Guardian)**이라 불리는 컴포넌트가 변조 여부를 감시합니다. 코어 코드의 어떤 부분이라도 수정되면, 커널은 이를 감지하고 **안전 모드 (safe-mode)**로 전환됩니다. 이 상태에서는 요청 처리는 계속 수행하지만, 신뢰할 수 없는 모듈의 로드는 거부합니다.

감지를 넘어, Flowork는 **보안 스캐너 (security scanner)**를 함께 제공합니다. 이는 에이전트가 실행하려는 코드를 검사하는 정적 분석 도구들의 실질적인 무기고입니다. 이것은 이론적인 아이디어가 아니라, 인젝션 벡터 (injection vectors), 권한 상승 (privilege escalation), 그리고 안전하지 않은 패턴을 찾아내는 작동 가능한 스캐너입니다.

다른 어떤 AI 에이전트 프레임워크도 이를 포함하고 있지 않습니다. 대부분은 에이전트 코드가 신뢰할 수 있다고 가정합니다. Flowork는 그렇지 않을 수도 있다고 가정합니다.

플러그인 아키텍처: 하나의 고정된 ABI

프로젝트 맵을 통해 구조를 확인할 수 있습니다:

  • main.go + internal/kernel/: 동결된 마이크로커널 (frozen microkernel) 및 HTTP 핸들러.
  • internal/loket/: 모든 모듈이 호출을 통과시키는 단일 카운터 (single counter).
  • internal/guardian/ + internal/protector/: 변조 감지 및 안전 모드.
  • internal/floworkdb/ + internal/agentdb/: 전역 상태 및 에이전트별 브레인 (brains).
  • agents/: 설치된 에이전트들 (각각 고유한 SQLite 데이터베이스를 가진 .fwagent 폴더).
  • apps/: 샌드박스화된 애플리케이션 (flowalpha, notepad).
  • 그 외 모든 것: 도구, 슬래시 명령어 (slash commands), 스캐너, 채널, MCP 커넥터 — 모두 플러그 앤 플레이 (plug-and-play) 방식입니다.

에이전트나 도구(tool)를 추가할 때, 적절한 디렉토리에 폴더를 넣기만 하면 됩니다. 커널(kernel)이 이를 핫 로드(hot-loads)합니다. 재컴파일도, 커널 재시작도 필요 없습니다. 이것이 바로 마이크로커널 (microkernel) 설계가 실무에서 구현되는 방식입니다.

자체 호스팅 (Self-Hosting)의 트레이드오프 (Trade-offs)

모든 것을 로컬에서 실행하면 클라우드 의존성을 제거할 수 있지만, 개인정보 보호와 제어권을 얻는 대신 대역폭과 처리 능력을 희생해야 합니다. 사용자의 기기에서 실행되는 에이전트의 속도는 CPU와 인터넷 성능에 좌우됩니다. LLM 추론 (inference)의 경우, Flowork는 추론 기능을 바이너리(binary)에 내장하는 대신 (Ollama, LM Studio 또는 클라우드 API로 향하는 라우터(router)를 통해) 로컬 모델로 위임합니다.

SQLite 브레인 (brain)은 분산 학습 (distributed training)이나 에이전트 간 학습이 아닌, 회상 (recall) 및 전체 텍스트 검색 (full-text search)에 최적화되어 있습니다. 만약 에이전트들이 서로로부터 학습하기를 원한다면, 공유 메모리 (shared memory)가 아닌 메시지 버스 (message bus)와 loket을 통해 수행합니다.

결론: 당신의 AI를 소유하세요

Flowork Agent는 단순한 프레임워크가 아니라 에이전트를 위한 운영체제 (operating system)입니다. 이는 클라우드 AI에 부족한 소유권, 즉 지속적인 메모리 (persistent memory), 로컬 실행 (local execution), 역량 기반 보안 (capability-based security), 그리고 신뢰할 수 있는 프리즌 코어 (frozen core)를 제공합니다. 마이크로커널 (microkernel) 설계는 기능을 추가하더라도 기반 시스템이 절대 깨지지 않도록 보장합니다. WASM 샌드박스 (sandbox)는 에이전트가 서로를 해치거나 호스트 (host)에 해를 끼칠 수 없도록 보장합니다. SQLite 브레인은 학습 내용이 지속되도록 보장합니다.

단일 바이너리를 배포하세요. 쉘 스크립트 (shell script)를 시작하세요. 웹 UI를 여세요. 당신에게 필요한 모든 것이 당신의 기기에서 실행되며, 당신이 소유하고, 특정 벤더 (vendor)에 종속되지 않은 채, 기억할 준비를 마쳤습니다.

Flowork는 오픈 소스입니다 — 두 제품 모두:

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0