Permission 시스템 설계
자율도와 안전성의 균형
섹션 제목: “자율도와 안전성의 균형”에이전트 시스템 설계에서 가장 핵심적인 트레이드오프는 자율도(autonomy) vs 안전성(safety) 입니다. 사람이 모든 도구 호출을 승인하면 안전하지만 속도가 느립니다. 반대로 에이전트가 모든 것을 자율로 실행하면 빠르지만 위험합니다.
실제 시스템에서는 이 둘 사이의 적절한 지점을 찾아야 합니다. Permission 시스템은 이 균형을 작업별, 도구별, 상황별로 세밀하게 조정할 수 있는 메커니즘입니다.
세 가지 승인 레벨
섹션 제목: “세 가지 승인 레벨”Manual (전수 승인)
섹션 제목: “Manual (전수 승인)”모든 도구 호출에 대해 사람의 명시적 승인을 요구합니다.
에이전트 → [승인 요청] → 사람 검토 → 승인/거부 → 도구 실행- 적합한 상황: 프로덕션 환경 배포, 금전 거래, 민감 데이터 삭제
- 단점: 에이전트 흐름이 자주 중단되어 복잡한 작업에서 비효율
Semi-Auto (선택적 승인)
섹션 제목: “Semi-Auto (선택적 승인)”위험도가 높은 도구만 승인을 요구하고, 저위험 도구는 자동 실행합니다.
# 승인 레벨 정의 예시APPROVAL_REQUIRED = { "delete_file", "exec_shell", "network_request", "write_to_production",}
AUTO_ALLOWED = { "read_file", "list_directory", "search_codebase", "run_tests",}- 적합한 상황: 개발 환경, 코드 작성/테스트 워크플로우
- 장점: 반복적인 읽기/분석 작업은 자동화하면서 파괴적 작업만 제어
Auto (완전 자동)
섹션 제목: “Auto (완전 자동)”에이전트가 모든 도구를 사람 개입 없이 실행합니다.
에이전트 → 도구 실행 (즉시) → 결과 반환- 적합한 상황: CI/CD 파이프라인, 격리된 샌드박스 환경, 테스트 자동화
- 전제 조건: 강력한 샌드박싱, 롤백 메커니즘, 모니터링 시스템
승인 플로우 구현
섹션 제목: “승인 플로우 구현”interface ApprovalRequest { tool: string; params: Record<string, unknown>; riskLevel: 'low' | 'medium' | 'high'; context: string;}
async function requestApproval(req: ApprovalRequest): Promise<boolean> { const mode = getApprovalMode(req.tool);
if (mode === 'auto') return true; if (mode === 'manual') return await promptUser(req);
// semi-auto: 위험도 기반 판단 if (req.riskLevel === 'low') return true; return await promptUser(req);}
async function promptUser(req: ApprovalRequest): Promise<boolean> { console.log(`\n[승인 필요] ${req.tool}`); console.log(`파라미터: ${JSON.stringify(req.params, null, 2)}`); console.log(`컨텍스트: ${req.context}`); const answer = await readline('승인하시겠습니까? (y/n): '); return answer.toLowerCase() === 'y';}지속 권한 (Persistent Permissions)
섹션 제목: “지속 권한 (Persistent Permissions)”매번 동일한 도구에 대해 승인을 반복하는 것은 비효율적입니다. 지속 권한은 특정 도구나 경로에 대해 “이 세션 동안” 또는 “항상” 승인을 기억하는 기능입니다.
[승인 요청] read_file('/src/...')> y — 이 세션에서 /src/ 읽기는 항상 허용 (s)> y — 항상 허용 (a)> y — 이번 한 번만 (o)> n — 거부 (n)| 지속성 유형 | 범위 | 저장 위치 | 주의사항 |
|---|---|---|---|
| Once (한 번) | 단일 호출 | 메모리 | 없음 |
| Session | 현재 세션 | 메모리 | 재시작 시 초기화 |
| Persistent | 영구 | 설정 파일 | 실수로 과도한 권한 부여 위험 |
설정 가능한 자율도 — 실전 예시
섹션 제목: “설정 가능한 자율도 — 실전 예시”아래는 작업 유형별로 승인 레벨을 다르게 설정하는 실제 구성 예시입니다.
{ "permissions": { "defaultMode": "semi-auto", "tools": { "read_file": { "mode": "auto" }, "write_file": { "mode": "semi-auto", "requireConfirmForPaths": ["/config", "/env"] }, "exec_shell": { "mode": "manual" }, "delete_file": { "mode": "manual" }, "network_request": { "mode": "semi-auto", "allowedDomains": ["api.internal.com"] } }, "persistentAllowances": [ { "tool": "read_file", "pathPrefix": "/src/", "scope": "session" } ] }}에스컬레이션 정책
섹션 제목: “에스컬레이션 정책”자율도를 낮추거나 높이는 에스컬레이션 규칙도 중요합니다.
에이전트가 3번 연속 실패 시 → Manual 모드로 강등에이전트가 10번 연속 성공 시 → Semi-auto 허용특정 경로 접근 시도 시 → 즉시 Manual 전환이러한 동적 에스컬레이션을 통해 에이전트가 신뢰를 쌓으면 자율도가 높아지고, 이상 행동이 감지되면 즉시 사람의 개입이 늘어납니다.
Permission 시스템은 Manual, Semi-Auto, Auto 세 레벨을 도구별 · 경로별로 세밀하게 설정하며, 지속 권한과 에스컬레이션 정책을 통해 동적으로 자율도를 조정합니다. 단일 전역 모드가 아닌 작업 맥락에 맞는 세분화된 권한 설계가 안전하고 효율적인 에이전트 시스템의 핵심입니다.