Vercel AI SDK에서 AI 에이전트 보안

발행: (2025년 12월 20일 오전 09:03 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Vercel AI SDK에서 AI 에이전트를 보호하기 위한 표지 이미지

2025년은 LLM의 해였습니다. 2026년은 에이전트의 해입니다.

에이전트는 단순히 질문에 답하는 것이 아니라 행동을 취합니다. 웹을 탐색하고, 코드를 실행하며, 데이터베이스를 조회하고, API를 호출합니다. 이는 보안 모델을 완전히 바꾸어 놓습니다.

LLM이 환각을 일으키는 것은 성가시지만, 환각을 일으키는 에이전트는 프로덕션 데이터베이스를 삭제할 수 있습니다.

이 가이드는 Vercel AI SDK를 사용하는 개발자를 위한 것입니다. 린팅 규칙은 generateText, streamText, tool() 및 기타 SDK 함수를 기본적으로 이해합니다.

OWASP 에이전시 탑 10 2026

CategoryThe Risk
ASI01에이전트 혼란 – 시스템 프롬프트가 동적으로 덮어쓰기됨
ASI02입력 검증 부족 – 도구 매개변수가 검증되지 않음
ASI03보안이 취약한 자격 증명 – API 키가 구성에 하드코딩됨
ASI04출력에 민감한 데이터 – 도구가 응답에 비밀을 누출함
ASI05예상치 못한 코드 실행 – AI 출력이 코드로 실행됨
ASI07RAG 인젝션 – 악의적인 문서가 지시를 삽입함
ASI08연쇄 실패 – 오류가 에이전트 단계 전반에 전파됨
ASI09신뢰 경계 위반 – AI가 권한 부여를 우회함
ASI10로깅 부족 – AI 행동에 대한 감사 로그가 없음

Source:

시각적 예시: 문제

Vercel AI SDK는 에이전트를 쉽게 만들 수 있게 해줍니다. 너무 쉬울 수도 있죠.

❌ 이전: 보호되지 않은 에이전트

// This code ships to production every day
const result = await generateText({
  model: openai('gpt-4'),
  tools: {
    deleteUser: tool({
      execute: async ({ userId }) => {
        await db.users.delete(userId); // No confirmation, no validation
      },
    }),
  },
});

무엇이 문제인가요?

  • 파괴적인 작업 전에 인간 확인이 없음
  • userId에 대한 파라미터 검증이 없음
  • maxSteps 제한이 없어 에이전트가 무한 루프에 빠질 수 있음
  • 연쇄 오류에 대한 에러 경계가 없음

✅ 이후: ESLint 보호 적용

linter를 설치하고 실행하세요:

npm install eslint-plugin-vercel-ai-security --save-dev
npx eslint src/

각 이슈에 대한 즉각적인 피드백:

🔒 CWE-862 OWASP:ASI09 CVSS:7.0 | Destructive tool without confirmation | HIGH
   at src/agent.ts:5:5
   Fix: Add human-in-the-loop confirmation before execution

🔒 CWE-20 OWASP:ASI02 CVSS:6.5 | Tool parameters not validated | MEDIUM
   at src/agent.ts:6:7
   Fix: Add Zod schema validation for tool parameters

🔒 CWE-400 OWASP:ASI08 CVSS:5.0 | No maxSteps limit on agent | MEDIUM
   at src/agent.ts:3:16
   Fix: Add maxSteps option to prevent infinite loops

✅ 수정된 코드

import { z } from 'zod';

const result = await generateText({
  model: openai('gpt-4'),
  maxSteps: 10, // ✅ Prevent infinite loops
  tools: {
    deleteUser: tool({
      parameters: z.object({
        userId: z.string().uuid(), // ✅ Validated input
      }),
      execute: async ({ userId }, { confirmDangerous }) => {
        await confirmDangerous(); // ✅ Human-in-the-loop
        await db.users.delete(userId);
      },
    }),
  },
});

결과: 모든 경고가 해결되었습니다. 에이전트가 프로덕션 준비가 되었습니다.

설정 (60 초)

// eslint.config.js
import vercelAISecurity from 'eslint-plugin-vercel-ai-security';

export default [
  vercelAISecurity.configs.strict, // Maximum security for agents
];

Strict 모드가 적용하는 항목:

  • ✅ 도구 스키마 검증 (Zod)
  • ✅ 파괴적 작업에 대한 인간 확인
  • maxSteps 제한을 통한 다단계 워크플로우
  • ✅ 연쇄 오류에 대한 오류 처리

커버리지: 9/10 OWASP 에이전틱 카테고리

eslint-plugin-vercel-ai-security9/10 OWASP 에이전틱 카테고리를 다룹니다. ASI06 (메모리 손상)은 TypeScript에서는 해당 없음(N/A)입니다.

플러그인은 다음을 인식합니다:

  • Vercel AI SDK 호출인 함수들
  • 파괴적 작업을 수행하는 도구들
  • 적절한 보호 조치가 마련되어 있는지 여부

결론

AI 에이전트는 우리가 만든 소프트웨어 중 가장 강력하면서도 가장 위험합니다.

도움이 되는 어시스턴트와 위험 요소 사이의 차이는 여러분이 설정한 가드레일에 달려 있습니다.

그 가드레일 없이 에이전트를 배포하지 마세요.

Back to Blog

관련 글

더 보기 »

신뢰할 수 있는 AI 에이전트 구축

개인 AI 어시스턴트의 약속은 위험한 가정에 기반하고 있습니다: 우리가 아직 신뢰할 수 있게 만들지 않은 시스템을 신뢰할 수 있다는 가정 말이죠. 우리는 할 수 없습니다. 그리고 오늘날의 버전은…