Vercel AI SDK에서 AI 에이전트 보안
Source: Dev.to

2025년은 LLM의 해였습니다. 2026년은 에이전트의 해입니다.
에이전트는 단순히 질문에 답하는 것이 아니라 행동을 취합니다. 웹을 탐색하고, 코드를 실행하며, 데이터베이스를 조회하고, API를 호출합니다. 이는 보안 모델을 완전히 바꾸어 놓습니다.
LLM이 환각을 일으키는 것은 성가시지만, 환각을 일으키는 에이전트는 프로덕션 데이터베이스를 삭제할 수 있습니다.
이 가이드는 Vercel AI SDK를 사용하는 개발자를 위한 것입니다. 린팅 규칙은 generateText, streamText, tool() 및 기타 SDK 함수를 기본적으로 이해합니다.
OWASP 에이전시 탑 10 2026
| Category | The Risk |
|---|---|
| ASI01 | 에이전트 혼란 – 시스템 프롬프트가 동적으로 덮어쓰기됨 |
| ASI02 | 입력 검증 부족 – 도구 매개변수가 검증되지 않음 |
| ASI03 | 보안이 취약한 자격 증명 – API 키가 구성에 하드코딩됨 |
| ASI04 | 출력에 민감한 데이터 – 도구가 응답에 비밀을 누출함 |
| ASI05 | 예상치 못한 코드 실행 – AI 출력이 코드로 실행됨 |
| ASI07 | RAG 인젝션 – 악의적인 문서가 지시를 삽입함 |
| 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-security는 9/10 OWASP 에이전틱 카테고리를 다룹니다. ASI06 (메모리 손상)은 TypeScript에서는 해당 없음(N/A)입니다.
플러그인은 다음을 인식합니다:
- Vercel AI SDK 호출인 함수들
- 파괴적 작업을 수행하는 도구들
- 적절한 보호 조치가 마련되어 있는지 여부
결론
AI 에이전트는 우리가 만든 소프트웨어 중 가장 강력하면서도 가장 위험합니다.
도움이 되는 어시스턴트와 위험 요소 사이의 차이는 여러분이 설정한 가드레일에 달려 있습니다.
그 가드레일 없이 에이전트를 배포하지 마세요.