본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

권한 모드는 반대편에 누가 있는지로 골라

~14 min · permissions, permission-mode, safety

Level 0Observer
0 XP0/64 lessons0/13 achievements
0/150 XP to next level150 XP to go0% complete

네 모드가 자동 실행 범위를 바꿔

permission_mode='default'는 부수 효과가 있는 도구를 사용자에게 묻고, acceptEdits는 Write와 Edit를 자동 승인하되 Bash는 계속 물어. bypassPermissions는 모든 문을 열며, plan은 실행 없이 계획만 만들게 해.

사람이 어디서 검토하는지 먼저 봐

개발자가 키보드 앞에서 매 요청을 보는 흐름에는 파일 편집을 빠르게 하는 acceptEdits가 잘 맞을 수 있어. 서버에서 무인으로 도는 에이전트라면 자체 권한 처리기를 둔 default가 안전해. bypassPermissions는 다른 경계에서 이미 검토된 신뢰 가능한 CI 실행기 정도로 제한해.

도구별 판단이 필요하면 처리기를 만들어

콜백은 도구 이름과 입력을 받아 허용·거부·질문 중 하나를 정할 수 있어. cwkPippa는 WebUI 채팅 경로에 자체 처리기를 두어 아빠가 CLI 화면을 거치지 않고도 위험한 명령을 바로 검토해. 권한 정책과 승인 화면이 같은 흐름을 가리켜야 해.

원칙: 권한 정책은 보안이면서 사용자 경험이야. 실제로 승인할 사람이 있는 자리에 맞춰.

Code

컨텍스트로 모드 선택·python
from claude_agent_sdk import ClaudeAgentOptions

# 인터랙티브 개발자 페어링 — 편집 silent 수락, 셸 묻기.
dev_options = ClaudeAgentOptions(
    cwd="/Users/me/repo",
    permission_mode="acceptEdits",
)

# 서버-측 자율 worker — 모든 거 묻기, 너 UI로 prompt route.
server_options = ClaudeAgentOptions(
    cwd="/srv/jobs",
    permission_mode="default",
    can_use_tool=permission_handler,  # 너 함수
)

# Sandboxed 컨테이너의 trusted CI — latency keep down 위해 bypass.
ci_options = ClaudeAgentOptions(
    cwd="/workspace",
    permission_mode="bypassPermissions",
    allowed_tools=["Read", "Edit", "Bash"],  # tool 셋 narrow
)

# Dry run 위한 plan-only 모드.
plan_options = ClaudeAgentOptions(
    cwd="/srv",
    permission_mode="plan",
)
Custom permission handler·python
from claude_agent_sdk import ClaudeAgentOptions, PermissionRequest, PermissionResult

DEMANDS_REVIEW = {"Bash", "Write"}

async def permission_handler(req: PermissionRequest) -> PermissionResult:
    if req.tool_name not in DEMANDS_REVIEW:
        return PermissionResult(behavior="allow")
    # 요청을 너 UI로 forward; user가 approve나 deny 클릭.
    decision = await ask_user_in_ui(req.tool_name, req.input)
    if decision == "approve":
        return PermissionResult(behavior="allow")
    return PermissionResult(behavior="deny", message="User denied via UI")

options = ClaudeAgentOptions(
    cwd="/srv",
    permission_mode="default",
    can_use_tool=permission_handler,
)

External links

Exercise

Agent SDK 호출 하나의 permission_mode를 확인하고 그 선택이 맞는 실행자 사실을 한 가지 써. 복사해 둔 bypassPermissions라면 고쳐.
Hint
실행 시점에 “해도 되나?”에 답할 사람이 누구인지 보고 모드를 정해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.