engineering architecture

트레이트 기반 아키텍처: ZeroClaw가 플러그인 없이 AI 에이전트를 확장 가능하게 만드는 방법

ZeroClaws.io

ZeroClaws.io

@zeroclaws

February 25, 2026

8 분 소요

트레이트 기반 아키텍처: ZeroClaw가 플러그인 없이 AI 에이전트를 확장 가능하게 만드는 방법

ClawHub가 출시됐을 때 AI 에이전트 런타임을 확장하는 명백한 방법처럼 보였다. 스킬 마켓플레이스——필요한 것을 설치하고, 불필요한 것은 건너뛰고, 자신의 것을 기여한다. 이 모델은 브라우저 확장 기능, VS Code 플러그인, npm 패키지에서 작동했다. AI 에이전트에서 왜 작동하지 않겠는가?

2026년 초, 답이 명확해졌다. 보안 연구자들은 공개된 ClawHub 스킬의 41.7%에 취약점이 포함되어 있음을 발견했다. 수백 개는 완전히 악의적이었다——설치한 사용자를 침해하기 위해 특별히 업로드된 패키지들이었다. 플러그인 모델은 머신에서 상승된 권한으로 실행되는 소프트웨어에 적용될 때 근본적인 문제가 있음이 밝혀졌다.

ZeroClaw는 이 실패 모드를 염두에 두고 설계됐다. 플러그인 시스템 대신 Rust 트레이트를 사용한다.

런타임 플러그인 시스템의 문제점

전통적인 플러그인 시스템의 핵심 문제는 구현 품질이 아니다——모델 자체다. 플러그인을 설치할 때 인터넷에서 코드를 다운로드해 애플리케이션의 프로세스 내에서, 애플리케이션의 권한으로 실행하는 것이다. 플러그인은 파일을 읽고, 네트워크에 접근하고, 환경 변수를 읽고, 애플리케이션이 할 수 있는 다른 모든 것을 할 수 있다.

텍스트 에디터 플러그인이 구문 강조를 추가하는 것에는 괜찮다. 자격 증명, 파일 시스템, 채팅 채널에 접근하는 AI 에이전트 런타임에는 괜찮지 않다.

특정 실패 모드는 예측 가능하다. 런타임 코드 로딩은 플러그인이 호스트 프로세스 내에서 임의의 코드를 실행함을 의미한다——샌드박스 없음, 격리 없음, 기능 모델 없음. 기본 신뢰는 플러그인이 설치되면 호스트 애플리케이션과 동일한 권한을 가짐을 의미한다. 공급망 공격은 간단하다: 인기 있는 패키지와 비슷한 이름의 패키지를 게시하고 사용자가 설치하기를 기다린다. 플러그인 간의 버전 충돌은 디버깅하기 어렵고 플랫폼 수준에서 방지하기 불가능한 의존성 지옥을 만든다.

OpenClaw의 ClawHub는 2026년에 이 실패 모드들 모두를 실증했다. 악성 스킬은 정교하지 않았다——마켓플레이스를 신뢰한 사용자들이 설치한 패키지들이었을 뿐이다.

트레이트: 다른 모델

Rust 트레이트는 컴파일러가 강제하는 인터페이스 계약이다. 구현이 제공해야 하는 메서드, 그 메서드가 수락하고 반환하는 타입, 유지해야 하는 스레드 안전성 보장을 정의한다. ZeroClaw의 채널 트레이트를 단순화한 것:

```rust pub trait Channel: Send + Sync + 'static { fn name(&self) -> &str; async fn connect(&mut self) -> Result<()>; async fn receive(&self) -> Result; async fn send(&self, msg: Response) -> Result<()>; async fn disconnect(&self) -> Result<()>; } ```

모든 채널——Telegram, Discord, WhatsApp, Signal, Matrix, IRC——이 트레이트를 구현한다. 컴파일러는 타입 안전성(Discord 응답을 Telegram 채널에 보낼 수 없음), 스레드 안전성(`Send + Sync` 바운드가 안전한 동시 접근 보장), 완전성(모든 필수 메서드를 구현해야 함——런타임에서 "메서드를 찾을 수 없음" 오류 없음)을 보장한다.

중요한 것은: 새 채널은 런타임이 아닌 바이너리에 컴파일된다. 코드 인젝션 없음, 동적 로딩 없음, 설치 시 내려야 할 신뢰 결정 없음. 확장 기능은 실행되기 전에 컴파일러에 의해 검증된다.

새 채널 추가하기

ZeroClaw를 확장하는 실제 경험은 트레이트를 구현하는 것이다. Matrix 채널 어댑터의 예:

```rust pub struct MatrixChannel { homeserver: String, client: MatrixClient, }

impl Channel for MatrixChannel { fn name(&self) -> &str { "matrix" }

async fn connect(&mut self) -> Result<()> { self.client = MatrixClient::new(&self.homeserver).await?; self.client.login().await?; Ok(()) }

async fn receive(&self) -> Result { let event = self.client.next_message().await?; Ok(Message::from(event)) }

async fn send(&self, msg: Response) -> Result<()> { self.client.send_text(&msg.channel_id, &msg.text).await?; Ok(()) }

async fn disconnect(&self) -> Result<()> { self.client.logout().await } } ```

완전한 채널 어댑터에 약 50줄이다. 컴파일러는 코드가 출시되기 전에 구현이 올바른지 검증한다. 메서드 구현을 잊거나, 잘못된 타입을 반환하거나, 스레드 안전성 제약을 위반하면 컴파일 오류가 발생한다——프로덕션에서의 런타임 충돌이 아니라.

모든 확장 포인트에서 동일한 패턴

ZeroClaw는 시스템이 확장 가능해야 하는 모든 곳에서 트레이트를 사용한다. AI 제공업체는 `Provider` 트레이트를 구현한다:

```rust pub trait Provider: Send + Sync { async fn complete(&self, messages: &[ChatMessage]) -> Result; async fn embed(&self, text: &str) -> Result>; fn model_name(&self) -> &str; } ```

OpenAI에서 Anthropic으로, Ollama로 전환하는 것은 다른 HTTP 호출로 동일한 트레이트를 구현하는 것이다. ZeroClaw의 나머지 부분은 어떤 제공업체가 활성화되어 있는지 알지 못하고 신경 쓰지 않는다——트레이트 메서드를 호출할 뿐이다.

도구는 사전에 권한을 선언하도록 요구하는 `Tool` 트레이트를 구현한다:

```rust pub trait Tool: Send + Sync { fn name(&self) -> &str; fn description(&self) -> &str; async fn execute(&self, args: Value) -> Result; fn permissions(&self) -> Permissions; } ```

모든 도구는 실행 전에 필요한 것——파일 접근, 네트워크 접근, 특정 경로——을 선언한다. 런타임은 그 선언을 기반으로 허용 목록을 강제한다. `~/documents`에 대한 읽기 접근이 필요하다고 주장하는 도구는 `~/.ssh`에 조용히 접근할 수 없다.

메모리 백엔드는 `MemoryBackend` 트레이트를 구현한다——그래서 SQLite가 기본값이지만 다른 코드를 변경하지 않고 대체 백엔드가 가능하다.

보안 비교

| 측면 | 플러그인 시스템 | 트레이트 시스템 | |--------|--------------|-------------| | 코드 출처 | 런타임에 다운로드 | 빌드 시 컴파일 | | 검증 | 신뢰 기반 | 컴파일러 검증 | | 권한 | 런타임, 종종 미확인 | 타입에 선언, 강제 | | 공급망 | 취약 | 외부 코드 로딩 없음 | | 타입 안전성 | 런타임 오류 | 컴파일 타임 오류 | | 동시성 | 경쟁 조건 가능 | 데이터 경쟁 불가능 |

핵심 통찰은 단순하다: 공급망이 없으면 공급망 공격을 할 수 없다. ZeroClaw의 확장 기능은 컴파일되어 있지, 다운로드되지 않는다. 침해할 마켓플레이스 없음, 타이포스쿼팅할 패키지 없음, 설치 시 내려야 할 신뢰 결정 없음.

실제 트레이드오프

트레이트 접근 방식은 파일을 다운로드해 새 채널을 설치할 수 없음을 의미한다. 커스텀 확장 기능을 추가하려면 Rust를 작성하고, ZeroClaw 소스에 추가하고, 새 바이너리를 컴파일해야 한다. 대부분의 사용자에게 30개 이상의 내장 채널과 도구가 필요한 모든 것을 커버한다. 커스텀 확장 기능이 필요한 개발자에게 트레이트 시스템은 구현할 명확하고 타입 안전한 계약을 제공한다.

그 트레이드오프는 의도적이다. 작고 검증된 확장 표면이 크고 검증되지 않은 것보다 낫다. OpenClaw의 ClawHub는 생태계 규모를 보안보다 최적화하면 어떻게 되는지 증명했다. ZeroClaw는 반대를 최적화하며, CVE 수가 그 선택을 반영한다.

소식 받기

새 릴리스, 연동, Rust 기반 에이전트 인프라 소식을 받아보세요. 스팸 없음, 언제든 구독 취소 가능.