Coinbase AgentKit — AI 에이전트 지갑을 TEE와 MPC로 안전하게 저장하는 법

삼코딩

@samcoding

Coinbase AgentKit — AI 에이전트 지갑을 TEE와 MPC로 안전하게 저장하는 법

Coinbase AgentKit — AI 에이전트 지갑을 TEE와 MPC로 안전하게 저장하는 법

AI 에이전트가 온체인에서 자율적으로 트랜잭션을 실행할 때 마주하는 가장 치명적인 장벽은 지갑 유실과 키 노출입니다. 에이전트 프로세스가 재시작될 때마다 지갑을 새로 생성하면 온체인 잔고를 잃게 되고, 반대로 프라이빗 키를 코드나 서버 환경 변수에 직접 노출하는 방식은 즉각적인 탈취 위협을 수반합니다. 최근 업데이트된 Coinbase AgentKit v0.1+ 및 Agentic Wallet CLI는 암호화된 MPC 지갑 저장 패턴과 하드웨어 수준의 신뢰 실행 환경(TEE) 보안 경계를 도입해 이 모순을 해결합니다. 개발자가 실제 프로덕션에서 어떻게 에이전트의 지갑 영속성을 확보하고 서명 키를 격리하는지 핵심 아키텍처와 연동 방법을 살펴보겠습니다.

MPC 지갑의 세션 상태 유지: exportWallet 패턴

AI 에이전트가 재시작되어도 동일한 온체인 주소와 잔고를 유지하려면, 세션 종료 시 지갑 상태를 내보내고 초기화 시 이를 다시 주입하는 세션 상태 보존 패턴을 구현해야 합니다. 만약 이를 누락하면 에이전트 인프라가 재실행될 때마다 가스비와 온체인 잔고가 남은 지갑을 매번 잃어버리는 치명적인 리소스 손실을 초래하게 됩니다.

Coinbase AgentKit v0.1+ 버전은 내부 라이브러리와의 안정적인 런타임 호환성을 위해 Node.js 22 버전 이상을 최소 요구 사항으로 규정합니다. Node.js 22 미만의 하위 런타임 환경에서는 별도의 오류 메시지나 예외 없이 프로세스 실행이 즉시 정지될 수 있으므로, 개발 환경 구성 시 가장 먼저 확인해야 합니다.

코인베이스 개발자 플랫폼(CDP)의 EOA 기반 키를 서버 측에서 안전하게 유지 관리하기 위해, AgentKit은 CdpEvmWalletProvider를 제공합니다. 지갑 주소의 영속성을 보장하기 위해서는 지갑 인스턴스가 최초 생성될 때 exportWallet() 메서드를 호출해 MPC 상태와 신원 정보가 포함된 구조화 데이터를 추출해야 합니다. 이를 보안 저장소에 보관해 둔 뒤, 에이전트가 다시 구동될 때 configureWithWallet()cdpWalletData 파라미터로 다시 주입하는 방식으로 복구합니다.

다음은 Node.js 22 이상에서 동작하는 TypeScript 기반의 영속성 보존 실전 예시 코드입니다.

typescript
import { CdpEvmWalletProvider } from "@coinbase/agentkit";
import * as fs from "fs";

// Node.js 22+ 환경 필수
async function initializePersistentWallet(): Promise<CdpEvmWalletProvider> {
  const WALLET_DATA_FILE = "wallet_data.json";
  let savedWalletData: any = undefined;

  if (fs.existsSync(WALLET_DATA_FILE)) {
    const rawData = fs.readFileSync(WALLET_DATA_FILE, "utf8");
    savedWalletData = JSON.parse(rawData);
  }

  // 기존 지갑 데이터가 존재하면 이를 복구하여 초기화하고, 없으면 신규 지갑 생성
  const walletProvider = await CdpEvmWalletProvider.configureWithWallet({
    apiKeyId: process.env.CDP_API_KEY_ID!,
    apiKeySecret: process.env.CDP_API_KEY_SECRET!,
    networkId: "base-sepolia",
    cdpWalletData: savedWalletData,
  });

  // 신규 발급된 지갑인 경우, 다음 복구를 위해 상태 데이터를 파일에 안전하게 보관
  if (!savedWalletData) {
    const exportedData = await walletProvider.exportWallet();
    fs.writeFileSync(WALLET_DATA_FILE, JSON.stringify(exportedData, null, 2));
  }

  return walletProvider;
}

이 방식을 사용하면 인프라 오류나 프로세스 강제 재시작 등의 환경적 노이즈가 발생하더라도, 복구 프로세스를 거쳐 항상 동일한 Base 네트워크 상의 주소를 유지하며 자율적인 트랜잭션을 실행할 수 있습니다.

보안 격리의 극대화: Agentic Wallet CLI와 TEE의 역할

엔터프라이즈 환경에서 AI 에이전트의 개인키 탈취 위협을 원천 차단하려면, 키 생성과 서명 단계를 에이전트의 실행 환경에서 완전히 격리해야 합니다. 이를 위해 도입된 도구가 바로 에이전틱 월렛 CLI인 awal과 결제 MCP(Payments MCP)입니다. 이 인프라를 결합하면 에이전트가 구동되는 애플리케이션 서버나 거대언어모델(LLM)의 접근 범위 밖에 강력한 보안 경계를 세울 수 있습니다.

이 아키텍처의 핵심은 코인베이스의 신뢰 실행 환경(TEE)을 활용한 하드웨어 수준의 물리적 격리입니다. 사용자가 이메일 인증을 완료하면 지갑의 비밀키가 TEE 내부에서 안전하게 생성되며, 이 영역은 외부의 그 어떤 프로세스도 직접 들여다볼 수 없습니다. 에이전트는 트랜잭션 서명이 필요할 때마다 TEE 내부로 서명 요청을 전달할 뿐이며, 비밀키 자체는 절대 TEE 장벽을 넘어오지 않습니다.

이러한 구조 덕분에 에이전트 소스 코드에 치명적인 보안 결함이 발생하거나 외부 공격으로 호스트 시스템이 완전히 장악되더라도 온체인 자산은 안전하게 보호됩니다. 에이전트가 자율적으로 동작하면서도 개발자가 핵심 자산을 안심하고 수임할 수 있는 가장 확실한 물리적 안전장치입니다.

에이전트 통제하기: 지출 제한과 규제 준수 필터링

에이전트에게 온체인 자율권을 넘길 때 가장 우려되는 점은 통제를 벗어난 무제한 지출이나 자산 피해입니다. 코인베이스 에이전틱 월렛 CLI는 인간 소유자가 설정한 한도를 하드웨어 수준에서 물리적으로 강제하여 이 문제를 해결합니다. 에이전트의 실행 코드가 해킹당하거나 오작동하더라도, 격리된 지갑 내부에 설정된 자율 권한 제한은 에이전트 스스로 수정할 수 없습니다.

인간 소유자는 로컬 컴패니언 UI를 통해 세션당 또는 API 호출당 가용한 최대 지출 한도를 직접 설정하고 제어합니다. 결제 MCP 서버나 에이전틱 월렛 기능이 설치된 환경에서 아래 명령어를 실행하면 한도를 쉽게 확인하고 관리할 수 있습니다.

bash
npx awal show

또 다른 보호막은 트랜잭션 서명 단계 이전에 작동하는 자동 규제 준수 필터링입니다. TEE 지갑 수준에서 해외자산통제국(OFAC) 제재 대상 블랙리스트와 위험 거래 이력 추적(KYT) 필터링이 작동합니다. 에이전트가 우발적으로라도 악성 스마트 계약이나 제재 대상 주소로 자금을 전송하려 하면 서명 단계에서 실시간으로 원천 차단됩니다.

더 안전한 온체인 에이전트를 위한 체크리스트

온체인에서 스스로 트랜잭션을 실행하는 자율 에이전트의 보안은 하드웨어와 소프트웨어의 다중 방어선 구축에 달려 있습니다. 프로덕션 환경에 배포하기 전에 아래 세 가지 핵심 보안 요구사항을 반드시 확인해야 합니다.

  • 비밀 키 관리: 내보낸 MPC 월렛 데이터가 단순 로컬 파일이 아닌 안전한 비밀 관리 시스템에 암호화되어 보관되는지 검증합니다.
  • 실행 환경 분리: 키 생성과 서명이 에이전트나 LLM이 구동되는 일반 애플리케이션 서버가 아닌, 격리된 신뢰 실행 환경 내부에서만 처리되는지 확인합니다.
  • 지출 제한 강제: 로컬 컴패니언 UI로 설정한 최대 지출 한도가 에이전트의 자율적 우회 시도를 물리적으로 원천 차단하는지 테스트합니다.

이러한 하드웨어 수준의 키 격리와 인간 소유자의 명확한 예산 통제 권한이 조화를 이룰 때, 안심하고 동작하는 자율 금융 에이전트 인프라를 구축할 수 있습니다.


참고 링크

No comments yet.