AI agent 보안은 모든 action을 represented identity, tenant, resource, permission에 연결하는 데서 시작합니다. provider credential을 model context 밖에 두고, downstream service에서 authorization을 적용하고, high-impact effect 전에 approval을 요구하고, 조사할 수 있도록 decision과 outcome을 기록하세요.
system prompt가 behavior를 유도할 수는 있지만 tool process에서 사용할 수 있는 administrator token의 capability를 줄이지는 못합니다.
action 전체에 identity를 전달하세요
agent run에는 human user, application tenant, agent deployment, session, background worker가 포함될 수 있습니다. 이 identity를 각각 보존하세요.
flowchart LR
User[Authenticated user] --> Session[Agent session]
Session --> Policy{Tenant, resource, action}
Policy -->|allow| Tool[Server-side tool]
Tool --> Credential[Scoped provider credential]
Credential --> Backend[Downstream service]
Policy --> Audit[Decision record]
Backend --> Audit
backend에는 represented user와 tenant를 authorize하는 데 충분한 context를 전달해야 합니다. shared worker credential을 피할 수 없다면 tool adapter가 이를 사용하기 전에 누락된 resource rule을 적용해야 합니다.
agent control plane 가이드는 이런 decision과 credential reference가 어디에 있어야 하는지 보여 줍니다.
credential과 API 계층에서 permission을 줄이세요
agent에는 현재 job에 필요한 action과 resource만 부여하세요. read, write, provision, billing, administrative credential을 분리합니다. tenant와 environment별로 scope를 정한 뒤 provider가 지원한다면 credential lifetime을 줄이세요.
task-level operation으로 충분하다면 broad primitive를 노출하지 마세요. refund_order(order_id, amount)는 ownership, amount bound, approval, idempotency를 적용할 수 있습니다. generic SQL이나 provider-admin 도구는 이 모든 결정을 generated argument에 넘깁니다.
OWASP의 Excessive Agency 가이드는 tool functionality, permission, autonomy를 최소화할 것을 권장합니다. model이 valid tool을 선택했더라도 backend가 authorization을 적용할 책임은 그대로입니다.
secret을 model path 밖에 두세요
secret은 server-side manager에 저장하고 application code를 통해 reference를 전달하세요. 필요한 최소 runtime에 task-scoped credential을 주입한 뒤 revoke하거나 expire하세요.
secret은 다음 경로를 통해 자주 유출됩니다.
- prompt 및 retrieved context
- tool argument 또는 description
- URL 및 query string
- exception message 및 stdout
- trace, replay data, support export
- sandbox file 및 inherited environment variable
export 전에 redaction을 적용하고 error를 의도적으로 테스트하세요. model에 secret을 반복하거나 변환하도록 요청하지 마세요. MCP connection의 경우 현재 권한 부여 명세는 access token을 Authorization header에 넣도록 요구하고 server가 URI의 token을 거부해야 한다고 명시합니다.
effect 전에 approval을 배치하세요
destructive, financial, externally visible, unusually broad action에는 approval을 요구하세요. 정확한 resource, parameter, consequence를 보여 줍니다. approval을 그 값에 연결하고 만료 시간을 설정하세요.
실행 시점에 permission을 다시 확인하세요. operation이 기다리는 동안 user role이나 resource ownership이 바뀔 수 있습니다. approval은 approver에게 없는 authority를 부여하지 않습니다.
Railway의 2026년 4월 incident report는 agent가 account token을 찾아 즉시 삭제하는 legacy API를 호출한 사례를 설명합니다. Railway는 volume을 복구하고 API 삭제를 48시간 soft-delete path로 바꿨습니다. 이 사례는 token scope, API behavior, reversibility가 함께 중요하다는 것을 보여 줍니다.
retrieved content를 untrusted input으로 취급하세요
webpage, email, issue, document에는 model을 겨냥한 instruction이 포함될 수 있습니다. data를 trusted system policy와 분리하고 retrieved text가 tool permission을 확장하게 하지 마세요. model이 제안하는 action에는 새로운 policy check를 요구하세요.
workflow 범위가 좁다면 network destination과 resource type에 allowlist를 사용하세요. external content provenance를 trace에 표시해 조사자가 무엇이 action에 영향을 줬는지 확인할 수 있게 하되 그 content를 authority로 취급하지는 마세요.
제한 조치에 도움이 되는 audit record를 작성하세요
actor, represented user, tenant, agent 및 session, tool, resource, action, policy version, decision, approval reference, operation ID, timestamp, outcome을 기록하세요. “allowed”와 “completed”를 구분합니다.
audit log에 secret이나 크기가 제한되지 않은 model content를 저장하지 마세요. 자세한 context가 필요하면 protected trace로 연결합니다. audit path는 실패한 agent에 의존하지 않고 어떤 credential을 revoke하고 어떤 resource가 바뀌었을 수 있는지 답할 수 있어야 합니다.
revocation과 cross-tenant denial을 테스트하세요
isolated environment에서 다음을 테스트하세요.
- task가 기다리는 동안 session을 revoke하고 안전하게 재개에 실패하는지 확인합니다.
- 모든 tool path를 통해 다른 tenant의 resource ID에 접근해 봅니다.
- retrieved content에 적대적인 instruction을 주입합니다.
- provider 및 validation error를 발생시킨 뒤 log에 secret이 있는지 검사합니다.
- approval 없이 destructive action을 요청하고 downstream call이 발생하지 않는지 확인합니다.
production checklist는 이 control을 retry, trace, recovery와 연결합니다.
아래 프롬프트는 코드에서 실제 permission matrix를 만듭니다. enforcement point가 “system prompt”인 행은 보안 작업이 아직 끝나지 않은 것입니다.