콘텐츠로 이동

Permission 시스템 설계

에이전트 시스템 설계에서 가장 핵심적인 트레이드오프는 자율도(autonomy) vs 안전성(safety) 입니다. 사람이 모든 도구 호출을 승인하면 안전하지만 속도가 느립니다. 반대로 에이전트가 모든 것을 자율로 실행하면 빠르지만 위험합니다.

실제 시스템에서는 이 둘 사이의 적절한 지점을 찾아야 합니다. Permission 시스템은 이 균형을 작업별, 도구별, 상황별로 세밀하게 조정할 수 있는 메커니즘입니다.

모든 도구 호출에 대해 사람의 명시적 승인을 요구합니다.

에이전트 → [승인 요청] → 사람 검토 → 승인/거부 → 도구 실행
  • 적합한 상황: 프로덕션 환경 배포, 금전 거래, 민감 데이터 삭제
  • 단점: 에이전트 흐름이 자주 중단되어 복잡한 작업에서 비효율

위험도가 높은 도구만 승인을 요구하고, 저위험 도구는 자동 실행합니다.

# 승인 레벨 정의 예시
APPROVAL_REQUIRED = {
"delete_file",
"exec_shell",
"network_request",
"write_to_production",
}
AUTO_ALLOWED = {
"read_file",
"list_directory",
"search_codebase",
"run_tests",
}
  • 적합한 상황: 개발 환경, 코드 작성/테스트 워크플로우
  • 장점: 반복적인 읽기/분석 작업은 자동화하면서 파괴적 작업만 제어

에이전트가 모든 도구를 사람 개입 없이 실행합니다.

에이전트 → 도구 실행 (즉시) → 결과 반환
  • 적합한 상황: 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';
}

매번 동일한 도구에 대해 승인을 반복하는 것은 비효율적입니다. 지속 권한은 특정 도구나 경로에 대해 “이 세션 동안” 또는 “항상” 승인을 기억하는 기능입니다.

[승인 요청] 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 세 레벨을 도구별 · 경로별로 세밀하게 설정하며, 지속 권한과 에스컬레이션 정책을 통해 동적으로 자율도를 조정합니다. 단일 전역 모드가 아닌 작업 맥락에 맞는 세분화된 권한 설계가 안전하고 효율적인 에이전트 시스템의 핵심입니다.