도구 접근 제어
도구는 에이전트뿐 아니라 사용자에게도 권한이 있는지 확인해야 합니다 — 에이전트는 주체가 아닙니다.
도구 접근 제어은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
도구는 주체가 아닙니다
모델이 "도구를 호출"하지만 실제 ACTION은 사용자의 코드가 수행합니다. 권한의 기준이 되는 주체는 에이전트가 아니라 사용자입니다.
단지 "에이전트가 그렇게 결정했기 때문"이 아니라 USER의 신원을 기준으로 권한을 부여하십시오.
Authorise at the Tool Boundary
def refund_order(order_id, *, user):
order = db.get_order(order_id)
if order.customer_id != user.id and not user.is_staff:
raise PermissionError(f'User {user.id} cannot refund order {order_id}')
return stripe.refund(order.payment_id)사용자 컨텍스트 전달
모든 도구 호출에 사용자 객체를 전달하십시오:
def dispatch(tool_call, user):
args = json.loads(tool_call.function.arguments)
fn = TOOLS[tool_call.function.name]
return fn(**args, user=user)도구별 권한
각 역할이 사용할 수 있는 도구를 정의하십시오:
ROLE_TOOLS = {
'customer': ['search_orders', 'open_ticket'],
'support': ['search_orders', 'refund_order', 'cancel_order'],
'admin': ['*']
}
visible_tools = [t for t in ALL_TOOLS if t.name in ROLE_TOOLS[user.role] or 'admin' in ROLE_TOOLS[user.role]]데이터 접근 범위 지정
DB를 조회하는 도구는 자동으로 사용자별 범위를 적용해야 합니다:
def search_orders(query, user):
# NEVER let the model bypass this WHERE clause
return db.query('SELECT * FROM orders WHERE customer_id = %s AND ...', (user.id,))모든 도구 호출 감사
누가, 무엇을, 언제, 어떤 인수와 함께 실행했는지와 결과를 기록하십시오. 문제가 발생했을 때 이를 조사할 수 있는 추적 기록이 됩니다:
audit_log({
'user_id': user.id,
'tool': tool_name,
'args': args,
'result_status': result.status,
'timestamp': now()
})파괴적 작업 확인
권한이 있는 사용자라도 파괴적인 작업은 다시 확인하십시오:
def delete_account(user_id, confirmed=False, user=None):
if not confirmed:
return {'requires_confirmation': True, 'msg': 'Confirm deletion of account.'}
db.execute('DELETE ...', (user_id,))OAuth / 토큰 범위 지정 도구
에이전트가 외부 서비스에서 사용자를 대신해 작업할 때는 OAuth 토큰의 범위를 좁게 지정하십시오:
# Token only has gmail.send scope, not gmail.read
send_email = build_with_token(user_token_scoped_send)서비스 계정 경계
에이전트 자체의 서비스 계정에는 최소한의 권한만 부여해야 합니다:
- 분석 도구에는 읽기 전용 DB 사용자
- 고객별 S3 버킷
- VPC로 격리된 네트워크
Rate Limits Per Tool
def ratelimit(key, per_user_per_day=10):
counts = {}
def decorator(func):
def wrapper(user_id, *args, **kwargs):
counts.setdefault(user_id, 0)
if counts[user_id] >= per_user_per_day:
print(f'{key}: user {user_id} rate limited')
return None
counts[user_id] += 1
return func(user_id, *args, **kwargs)
return wrapper
return decorator
@ratelimit(key='tool:refund', per_user_per_day=2)
def refund_order(user_id, order_id):
print(f'refunding order {order_id} for user {user_id}')
return True
for i in range(3):
refund_order('user1', f'order{i}')
사용자에게 표시되는 권한 UI
에이전트가 사용자를 대신해 수행할 수 있는 작업을 사용자에게 보여 주십시오. 도구별 권한을 취소할 수 있게 하십시오. 이는 신뢰를 구축하는 데 매우 중요합니다.
중요 작업을 위한 재인증
민감한 도구를 사용하려면 최근 인증이 필요하도록 하십시오(마지막 로그인 후 < 5분):
if tool.is_sensitive and user.last_auth_age_seconds > 300:
raise StaleAuthError('Please re-authenticate to perform this action.')코드처럼 권한 부여 테스트
"사용자 A는 사용자 B의 주문을 refund할 수 없다"를 검증하는 테스트를 작성하십시오. 접근 제어가 작동한다고 절대 가정하지 마십시오. 접근 제어는 에이전트 보안 버그의 가장 큰 원인입니다.
권한 부여 원칙
에이전트가 도구를 호출할 때 누구의 권한을 확인해야 합니까?
복습
주체는 사용자입니다. 모든 도구에 사용자 신원을 전달하십시오. 사용자별로 데이터 범위를 지정하십시오. 모든 호출을 감사하십시오. 파괴적 작업을 확인하십시오. 코드에 테스트를 작성하듯 권한 부여도 테스트하십시오.
자주 묻는 질문
“도구 접근 제어” 강의는 무료인가요?
네 — “도구 접근 제어” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
“도구 접근 제어”에서 뭘 배우나요?
도구는 에이전트뿐 아니라 사용자에게도 권한이 있는지 확인해야 합니다 — 에이전트는 주체가 아닙니다. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Agents을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“도구 접근 제어” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.