당신의 AI 에이전트가 비밀번호를 알고 있습니다 — 내가 고친 방법

발행: (2026년 2월 17일 오전 01:10 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

(번역할 텍스트가 제공되지 않았습니다. 번역이 필요한 내용을 알려주시면 도와드리겠습니다.)

개요

AI 에이전트가 브라우저를 자동화할 때, 로그인 자격 증명이 컨텍스트 윈도우에 필요합니다.
즉, 비밀번호는:

  • 클라우드 LLM 제공업체에 전송됩니다
  • 대화 로그에 저장됩니다
  • 프롬프트 인젝션 공격을 통해 노출될 가능성이 있습니다

이 문제를 해결하기 위해 Cerberus KeyRouter를 만들었습니다.

문제

AI 에이전트인 OpenClaw, Claude Desktop, Cursor와 같은 도구는 브라우저를 자동화할 수 있습니다—양식을 채우고, 버튼을 클릭하고, 페이지를 탐색합니다.
로그인 페이지에 도달하면 일반적인 흐름은 다음과 같습니다:

User:  "Log into GitHub for me"
User:  "Email: jacob@example.com"
User:  "Password: MyS3cretP@ss"
Agent: "Logging in..."

그 비밀번호는 다음을 거칩니다:

  1. LLM 제공자의 서버(Anthropic, OpenAI, …) – 기록되고 저장되며, 훈련에 사용될 가능성이 있습니다.
  2. API 프록시 서비스 – 제3자 릴레이를 사용하는 경우, 비밀번호가 또 다른 알 수 없는 중간자에게 전달됩니다.
  3. 대화 기록 – 채팅 로그에 평문으로 저장됩니다.

프롬프트 인젝션 위험

악의적인 웹페이지는 숨겨진 지시문을 삽입하여 AI가 대화 초기에 학습한 자격 증명을 누출하도록 속일 수 있습니다.

Source:

핵심 아이디어

  1. AI가 자리표시자를 사용해 로직을 작성합니다.
  2. 실제 자격 증명은 로컬에서 대체되어 브라우저에 직접 주입됩니다.
  3. LLM은 실제 비밀번호를 절대 보지 못합니다.

AI가 보내는 예시:

{
  "vaultItem": "GitHub",
  "steps": [
    { "action": "fill", "selector": "#login_field", "value": "{{email}}" },
    { "action": "fill", "selector": "#password",   "value": "{{password}}" },
    { "action": "click", "selector": "[type=submit]" }
  ]
}

Cerberus KeyRouter – 여러분의 머신에서 실행되는 MCP (Model Context Protocol) 서버 – 이 호출을 가로채어 로컬 Vaultwarden 인스턴스에서 실제 자격 증명을 가져오고 {{placeholders}}를 교체한 뒤 Chrome DevTools Protocol (CDP) 을 통해 동작을 실행합니다.

AI Agent (OpenClaw, Claude Desktop, …)

   │  MCP call: secure_login("GitHub", steps with {{placeholders}})

Login Router (localhost:8899)
   ├─ 베어러 토큰으로 인증
   ├─ Vaultwarden에서 자격 증명 가져오기
   ├─ {{placeholders}}를 실제 값으로 교체
   ├─ Chrome CDP를 통해 실행 (localhost 전용)
   ├─ 메모리에서 자격 증명 삭제
   └─ { status: "ok" } 반환  ← 응답에 비밀번호 없음

Vaultwarden (Docker, localhost:8443)는 종단 간 암호화된 비밀번호 저장소를 제공합니다. 모든 작업이 로컬에서 이루어지며 비밀번호가 머신을 떠나는 일은 없습니다.

보안 기능

#기능설명
1Implicit allowlistVaultwarden는 명시적으로 추가한 사이트의 자격 증명만 저장합니다. AI가 임의의 사이트에 로그인할 수 없습니다.
2URL verification자격 증명을 삽입하기 전에 라우터가 CDP를 통해 브라우저의 실제 URL을 읽고 금고 항목의 URI와 일치시킵니다. 피싱 사이트는 거부됩니다.
3Bearer‑token auth각 Vaultwarden 계정은 고유 토큰을 받습니다. 토큰이 없으면 접근할 수 없습니다.
4Rate limiting분당 3회, 시간당 20회 시도 제한. 연속 실패 시 쿨다운이 발생합니다.
5Audit logging모든 로그인 시도(성공, 실패, 속도 제한)를 기록합니다. 비밀번호는 절대 기록되지 않으며 /audit에서 확인할 수 있습니다.
6Human‑in‑the‑loop고위험 계정은 각 로그인 전에 수동 승인이 필요합니다(50 초 제한, 승인되지 않으면 자동 거부).

Source:

Quick Start

git clone https://github.com/DemoJacob/cerberus-keyrouter.git
cd cerberus-keyrouter
cp .env.example .env
# Edit .env and set VW_ADMIN_TOKEN
docker compose up --build -d

What you get

ServiceURLPurpose
Vaultwarden(self‑hosted Bitwarden)여기에서 비밀번호를 추가하세요.
Login Router(MCP server + admin panel)자격 증명 대체 및 주입을 처리합니다.
Admin panel(same host)Vaultwarden 계정을 추가하고 베어러 토큰을 생성합니다.

Connect your AI agent via MCP

{
  "mcpServers": {
    "cerberus": {
      "baseUrl": "http://localhost:8899/mcp",
      "headers": {
        "Authorization": "Bearer <your-token>"
      }
    }
  }
}

이제 에이전트는 평문 비밀번호를 전혀 보지 않고 금고에 저장된 모든 사이트에 로그인할 수 있습니다.

Interaction Patterns

Simple fill

대부분의 사이트는 fill 액션을 사용합니다 (값을 설정하고 이벤트를 디스패치함).

React / SPA sites

사이트가 제어된 컴포넌트를 사용한다면 type으로 전환하세요 (키‑별 입력, 약 50 ms 지연).

Multi‑step logins (e.g., banks)

// Step 1: username + next
{
  "vaultItem": "MyBank",
  "steps": [
    { "action": "type",  "selector": "#username", "value": "{{username}}" },
    { "action": "click", "selector": "#next" },
    { "action": "wait",  "selector": "input[type=password]" }
  ]
}

// Step 2: password + submit
{
  "vaultItem": "MyBank",
  "steps": [
    { "action": "type",  "selector": "#password", "value": "{{password}}" },
    { "action": "click", "selector": "#login" }
  ]
}

실제 예시

OpenClaw를 사용해 일상 업무를 수행하던 중 zooplus.de에 로그인하여 주문 내역을 조회했습니다. AI는 다음과 같이 보고했습니다:

“평문 비밀번호를 건드리지 않았습니다. {{email}}{{password}} 자리표시자만 전달했습니다. Cerberus가 내 로컬 Vaultwarden 금고에서 자격 증명을 가져와 브라우저에 직접 채워 넣었습니다.”

  • LLM 컨텍스트에 비밀번호가 없습니다.
  • 로그에 비밀번호가 없습니다.
  • 비밀번호가 내 컴퓨터를 떠나지 않았습니다.

기술 스택

구성 요소기술
로그인 라우터TypeScript / Node.js
브라우저 자동화playwright‑core (CDP)
비밀번호 저장소Vaultwarden (셀프‑호스팅 Bitwarden)
전송MCP Protocol – streamable HTTP
영속성SQLite (config + audit log)
암호화AES‑256‑GCM (master‑password encryption)
배포Docker Compose (one‑command)
추가 기능Cookie caching, OpenClaw snapshot‑ref IDs, multi‑agent framework support, SaaS version with zero‑knowledge E2E encrypted backend

License & Contributions

The project is open source under AGPL‑3.0.

  • GitHub: (link omitted in original)
  • Works on macOS and Linux (Docker + Chrome + any MCP‑compatible AI agent).

Feedback, issues, and stars are all welcome!

Come. If you're building AI agents that need to handle authentication, I'd love to hear about your use case.
0 조회
Back to Blog

관련 글

더 보기 »