4 4
5# 조직의 mod 관리5# 조직의 mod 관리
6 6
7> 관리되는 설정으로 Claude Code mod를 제어합니다: 사용자가 설치한 mod 중지, 자신의 mod만 허용, mod가 수행할 수 있는 작업 검토, 자신의 mod로 정책 적용.7> 관리형 설정으로 Claude Code mod를 제어합니다. 사용자가 설치한 mod를 차단하고, 자체 mod만 허용하고, mod가 수행할 수 있는 작업을 검토하고, 자체 mod로 정책을 적용합니다.
8 8
9[mod](/docs/ko/plugins/mods/overview)는 Claude Code 내에서 실행되는 플러그인으로, 이를 설치한 사용자의 권한으로 코드를 실행합니다. Mod는 샌드박스 처리되지 않습니다. [관리되는 설정](/docs/ko/managed-settings)을 통해 사용자의 머신에서 mod가 실행되는지 여부, 어떤 mod가 실행되는지, 그리고 어떤 순서로 실행되는지를 결정할 수 있습니다. 또한 다른 mod가 수행하는 작업을 감시하거나 거부하는 자신의 mod를 설치할 수 있습니다.9[mod](/docs/ko/plugins/mods/overview)는 설치한 사용자의 권한으로 Claude Code 내부에서 코드를 실행하는 플러그인입니다. mod는 샌드박스화되지 않습니다. [관리형 설정](/docs/ko/managed-settings)을 통해 사용자 머신에서 mod를 실행할지 여부, 실행할 mod, 실행 순서를 결정할 수 있습니다. 또한 다른 mod의 동작을 감시하거나 거부하는 자체 mod를 설치할 수도 있습니다.
10 10
11이 페이지는 파일, MDM 또는 claude.ai 관리자 콘솔을 통해 Claude Code의 관리되는 설정을 배포하는 담당자를 위한 것입니다. Mod는 Claude Code v2.1.287 이상에서 기본적으로 활성화되어 있습니다. 수행하려는 작업과 일치하는 섹션부터 시작하세요:11이 페이지는 파일, MDM 또는 claude.ai 관리자 콘솔을 통해 Claude Code용 관리형 설정을 배포하는 담당자를 위한 것입니다. mod는 Claude Code v2.1.287 이상에서 기본적으로 활성화되어 있습니다. 원하는 작업에 해당하는 섹션부터 시작하십시오.
12 12
13* **사용자의 자체 mod를 제외하고, 자신의 mod 포함 여부와 관계없이**: [사용자가 설치한 mod가 로드되지 않도록 중지](#stop-user-installed-mods-from-loading)13* **자체 mod 사용 여부와 관계없이 사용자가 직접 설치한 mod 차단**: [사용자가 설치한 mod의 로드 차단](#stop-user-installed-mods-from-loading)
14* **아무것도 변경하지 않을 때 사용자가 얻는 것 확인**: [기본적으로 어떤 일이 발생하는지 알기](#know-what-happens-by-default)14* **아무것도 변경하지 않았을 때 사용자에게 적용되는 내용 확인**: [기본 동작 파악](#know-what-happens-by-default)
15* **다른 제한 사항이 있는 mod 유지**: [허용할 범위 선택](#choose-how-much-to-allow)15* **mod를 활성화한 상태로 다른 제한 적용**: [허용 범위 선택](#choose-how-much-to-allow)
16 16
17<Note>17<Note>
18 다음 경우는 다른 페이지에서 다룹니다:18 다음 경우는 다른 페이지에서 다룹니다.
19 19
20 * **이전에 관리되는 설정을 배포한 적이 없는 경우**: [관리되는 설정 배포](/docs/ko/managed-settings)부터 시작하세요20 * **관리형 설정을 배포한 적이 없는 경우**: [관리형 설정 배포](/docs/ko/managed-settings)부터 시작하십시오
21 * **사용자가 설치할 수 있는 플러그인을 제어하려는 경우**: [조직의 플러그인 관리](/docs/ko/plugins/org)를 참조하세요21 * **사용자가 설치할 수 있는 플러그인을 제어하려는 경우**: [조직의 플러그인 관리](/docs/ko/plugins/org)를 참조하십시오
22</Note>22</Note>
23 23
24<h2 id="stop-user-installed-mods-from-loading">24<h2 id="stop-user-installed-mods-from-loading">
25 사용자가 설치한 mod가 로드되지 않도록 중지25 사용자가 설치한 mod 로드 차단하기
26</h2>26</h2>
27 27
28사용자가 가져오는 모든 mod가 로드되지 않도록 하려면 [기본 제공 가드](#know-what-happens-by-default)인 정책 mod에서 `allowManagedModsOnly` 옵션을 설정하세요. Claude Code는 사용자가 설치한 모든 mod 앞에 이 mod를 로드합니다. 옵션은 `pluginConfigs` 아래의 관리되는 설정에 `cc-plugin-sec-default@builtin`으로 키가 지정되어 있습니다:28사용자가 가져오는 모든 mod가 로드되지 않도록 하려면 [기본 제공 가드](#know-what-happens-by-default)에서 `allowManagedModsOnly` 옵션을 설정합니다. 기본 제공 가드는 Claude Code가 사용자가 설치하는 모든 mod보다 먼저 로드하는 정책 mod입니다. 이 옵션은 관리형 설정의 `pluginConfigs` 아래에 `cc-plugin-sec-default@builtin`을 키로 하여 지정합니다.
29 29
30```json managed-settings.json theme={null}30```json managed-settings.json theme={null}
31{31{
39}39}
40```40```
41 41
42관리되는 설정에서 옵션을 설정하면:42관리형 설정에 이 옵션을 지정하면 다음과 같이 동작합니다.
43 43
44* **사용자가 가져오는 mod는 로드되지 않습니다**: 사용자가 설치한 플러그인의 mod, `--plugin-dir`로 로드된 mod, [세션 중에 Claude가 작성한 mod](/docs/ko/plugins/mods/create#ask-claude-for-a-mod)를 포함합니다44* **사용자가 가져온 mod는 로드되지 않습니다**: 사용자가 설치한 플러그인에 포함된 mod, `--plugin-dir`로 로드한 mod, [세션 중에 Claude가 작성한](/docs/ko/plugins/mods/create#ask-claude-for-a-mod) mod가 모두 여기에 해당합니다
45* **조직의 mod는 계속 로드됩니다**: [조직의 것으로 간주되는](#install-your-organizations-mods) mod는 확인되지 않습니다. 다른 모든 mod는 사용자의 것으로 간주되며 로드되지 않습니다. 여기에는 GitHub 또는 다른 원격 마켓플레이스에서 활성화하는 플러그인의 mod와 조직이 claude.ai의 구성원을 위해 활성화하는 mod가 포함됩니다. 조직의 것으로 간주되는 mod가 없으면 설치된 mod는 로드되지 않습니다.45* **조직의 mod는 계속 로드됩니다**: [조직의 mod로 간주되는](#install-your-organizations-mods) mod는 검사하지 않습니다. 그 외의 모든 mod는 사용자의 mod로 간주되어 로드되지 않습니다. 여기에는 GitHub 또는 기타 원격 마켓플레이스에서 활성화한 플러그인에 포함된 mod와 조직이 claude.ai에서 구성원을 위해 켠 mod도 포함됩니다. 조직의 mod로 간주되는 mod가 없으면 설치된 mod는 하나도 로드되지 않습니다.
46* **사용자는 이를 실행 취소할 수 없습니다**: 가드는 관리되는 설정에서만 옵션을 읽으므로 사용자, 프로젝트 또는 로컬 설정 파일의 동일한 항목이나 `--settings`로 전달된 파일의 항목은 아무것도 변경하지 않습니다46* **사용자가 되돌릴 수 없습니다**: 가드는 관리형 설정에서만 이 옵션을 읽으므로 사용자, 프로젝트 또는 로컬 설정 파일이나 `--settings`로 전달한 파일에 동일한 항목을 넣어도 아무것도 바뀌지 않습니다
47* **파일 또는 MDM 정책은 모든 공급자를 포함합니다**: 옵션을 파일로 또는 MDM을 통해 전달하면 Amazon Bedrock, Google Cloud의 Agent Platform, Microsoft Foundry에서 동일한 방식으로 작동합니다. claude.ai 관리자 콘솔에서 전달하는 경우 [플랫폼 가용성](/docs/ko/server-managed-settings#platform-availability)을 참조하세요47* **파일 또는 MDM 정책은 모든 제공자에 적용됩니다**: 이 옵션을 파일이나 MDM을 통해 배포하면 Amazon Bedrock, Google Cloud의 Agent Platform, Microsoft Foundry에서도 동일하게 동작합니다. claude.ai 관리자 콘솔을 통한 배포는 [플랫폼 가용성](/docs/ko/server-managed-settings#platform-availability)을 참조하세요
48* **사용자의 다른 사용자 정의는 계속 작동합니다**: [설정 파일의 hook](/docs/ko/hooks), 상태 줄, `/goal`은 영향을 받지 않습니다48* **사용자의 다른 사용자 지정 항목은 계속 작동합니다**: [설정 파일의 훅](/docs/ko/hooks), 상태줄, `/goal`은 영향을 받지 않습니다
49* **기본 제공 mod는 계속 실행됩니다**: `AGENTS.md` 지원과 같이 Claude Code에 기본 제공되는 mod는 각각 [자신의 스위치](/docs/ko/plugins/mods/overview#mods-built-into-claude-code)를 가집니다49* **기본 제공 mod는 계속 실행됩니다**: `AGENTS.md` 지원과 같이 Claude Code에 기본 제공되는 mod에는 각각 [별도의 스위치](/docs/ko/plugins/mods/overview#mods-built-into-claude-code)가 있습니다
50 50
51사용자의 머신에서 옵션을 확인하려면 `--plugin-dir`과 mod를 보유한 디렉터리의 경로(예: `claude --plugin-dir ./first-mod`)를 사용하여 Claude Code를 시작하세요. mod의 hook은 실행되지 않으며 트랜스크립트와 디버그 로그에는 [가드의 메시지](/docs/ko/plugins/mods/troubleshoot#messages-from-the-built-in-guard)가 있으며, 이는 mod의 이름과 `allowManagedModsOnly`를 나타냅니다. mod가 로드되면 [정책이 적용 중인지 확인](/docs/ko/managed-settings#check-that-a-policy-is-in-force) 및 [옵션이 적용되는지 결정하는 규칙](#set-options-on-the-built-in-guard)을 참조하세요.51사용자의 머신에서 이 옵션이 적용되었는지 확인하려면 해당 머신에서 `--plugin-dir`와 mod가 들어 있는 디렉터리 경로를 지정하여 Claude Code를 시작합니다(예: `claude --plugin-dir ./first-mod`). mod의 훅은 실행되지 않으며, 트랜스크립트와 디버그 로그에 mod 이름과 `allowManagedModsOnly`를 명시한 [가드 메시지](/docs/ko/plugins/mods/troubleshoot#messages-from-the-built-in-guard)가 표시됩니다. mod가 로드된다면 [정책이 적용 중인지 확인하기](/docs/ko/managed-settings#check-that-a-policy-is-in-force)와 [옵션의 적용 여부를 결정하는 규칙](#set-options-on-the-built-in-guard)을 참조하세요.
52 52
53초기 액세스 중에 `CLAUDE_CODE_ENABLE_FUNCTION_HOOKS`를 `0`으로 설정한 경우 이 옵션으로 바꾸세요. Claude Code v2.1.287 이상은 모든 값에서 변수를 무시하므로 `0`이 있으면 mod가 활성화된 상태로 유지됩니다.53얼리 액세스 기간에 `CLAUDE_CODE_ENABLE_FUNCTION_HOOKS`를 `0`으로 설정했다면 이 옵션으로 대체하세요. Claude Code v2.1.287 이상은 이 변수를 값과 관계없이 무시하므로, `0`으로 설정해 두어도 mod는 켜진 상태로 유지됩니다.
54 54
55<h2 id="know-what-happens-by-default">55<h2 id="know-what-happens-by-default">
56 기본적으로 어떤 일이 발생하는지 알기56 기본 동작 알아보기
57</h2>57</h2>
58 58
59자신의 mod 설정이 없으면 사용자가 얻는 것은 다음과 같습니다:59별도의 mod 설정이 없으면 사용자에게 다음과 같이 적용됩니다.
60 60
61* **Mod가 활성화되어 있습니다.** 사용자는 플러그인 설정이 허용하는 모든 마켓플레이스에서 mod를 포함하는 플러그인을 설치하거나 `--plugin-dir`을 사용하여 디렉터리에서 로드할 수 있습니다.61* **mod가 켜져 있습니다.** 사용자는 플러그인 설정에서 허용하는 모든 마켓플레이스에서 mod가 포함된 플러그인을 설치하거나, `--plugin-dir`로 디렉터리에서 플러그인을 불러올 수 있습니다.
62* **기본 제공 가드가 먼저 실행됩니다.** Claude Code는 `sec-default@builtin`이라는 기본 제공 mod를 사용자가 설치한 모든 mod 앞에 로드합니다. 사용자는 이를 끌 수 없습니다. `/plugin`과 디버그 로그는 이를 `cc-plugin-sec-default`로 나열합니다. 가드는 다음 중 하나가 참일 때 로드됩니다:62* **기본 제공 가드가 먼저 실행됩니다.** Claude Code는 사용자가 설치한 모든 mod보다 먼저 `sec-default@builtin`이라는 기본 제공 mod를 불러옵니다. 사용자는 이를 끌 수 없습니다. `/plugin`과 디버그 로그에는 `cc-plugin-sec-default`로 표시됩니다. 가드는 다음 중 하나에 해당하면 로드됩니다.
63 63
64 * 머신에 관리되는 설정이 있습니다64 * 머신에 관리형 설정이 있는 경우
65 * 사용자가 Team 또는 Enterprise 플랜으로 Claude Code에 로그인했습니다65 * 사용자가 Team 또는 Enterprise 플랜으로 Claude Code에 로그인한 경우
66 66
67 API 키로 인증하거나 Amazon Bedrock, Google Cloud의 Agent Platform, Microsoft Foundry를 통해 인증하는 사용자는 관리되는 설정이 있는 머신에서만 가드를 받습니다.67 API 키로 인증하거나 Amazon Bedrock, Google Cloud의 Agent Platform 또는 Microsoft Foundry를 통해 인증하는 사용자는 관리형 설정이 있는 머신에서만 가드가 적용됩니다.
68* **가드는 관리하는 것을 보호합니다.** 사용자의 mod는 관리되는 hook이 받거나 결정하는 것, 시스템 프롬프트, 관리되는 `CLAUDE.md` 및 기타 관리되는 지침, 모든 mod가 설정으로 읽는 것, 관리되는 MCP 서버의 도구 및 설명을 변경할 수 없습니다.68* **가드는 관리 대상을 보호합니다.** 사용자의 mod는 관리형 훅이 받는 내용이나 결정하는 내용, 시스템 프롬프트, 관리형 `CLAUDE.md` 및 기타 관리형 지침, 모든 mod가 설정으로 읽는 내용, 관리형 MCP 서버의 도구와 설명을 변경할 수 없습니다.
69* **다른 모든 것은 허용됩니다.** 가드는 다른 제한을 추가하지 않습니다. 사용자의 mod는 여전히 파일을 읽고 쓰고, 프로세스를 시작하고, 네트워크 요청을 하고, 도구 호출 및 프롬프트를 다시 쓰고, 도구 호출을 거부하고, 그렇지 않으면 프롬프트할 도구 호출을 승인하고, 모두 해당 사용자의 권한으로 인터페이스에 그릴 수 있습니다.69* **그 밖의 모든 것은 허용됩니다.** 가드는 다른 제한을 추가하지 않습니다. 사용자의 mod는 여전히 해당 사용자의 권한으로 파일을 읽고 쓰고, 프로세스를 시작하고, 네트워크 요청을 보내고, 도구 호출과 프롬프트를 다시 작성하고, 도구 호출을 거부하고, 원래라면 확인을 요청했을 호출을 승인하고, 인터페이스에 그릴 수 있습니다.
70* **거부 규칙 및 관리되는 hook이 우선합니다.** 가드가 로드되는 곳에서 사용자의 mod는 `deny` 규칙이 거부하는 호출을 승인할 수 없으며, 어느 설정 파일이 규칙을 보유하든 상관없습니다. 관리되는 설정의 `PreToolUse` hook의 블록도 최종입니다. 둘 다 Claude의 도구 호출에 적용됩니다. 둘 다 mod의 자체 [`$.fs` 및 `$.process` 호출](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network)에는 적용되지 않습니다: `Read(.env)`가 거부되면 mod는 여전히 `$.fs.read`로 해당 파일을 읽거나 그렇게 하는 프로그램을 시작할 수 있습니다. 이러한 호출을 제한하려면 mod가 로드되지 않도록 하거나 [정책 mod](#enforce-a-policy-with-a-mod-of-your-own)에서 호출을 hook하세요.70* **deny 규칙과 관리형 훅이 우선합니다.** 가드가 로드된 환경에서는 규칙이 어느 설정 파일에 있든 사용자의 mod가 `deny` 규칙이 거부하는 호출을 승인할 수 없습니다. 관리형 설정의 `PreToolUse` 훅에 의한 차단도 최종적입니다. 두 가지 모두 Claude의 도구 호출에 적용됩니다. 어느 것도 mod 자체의 [`$.fs` 및 `$.process` 호출](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network)에는 적용되지 않습니다. `Read(.env)`가 거부되어 있어도 mod는 여전히 `$.fs.read`로 해당 파일을 읽거나 파일을 읽는 프로그램을 시작할 수 있습니다. 이러한 호출을 제한하려면 mod가 로드되지 않도록 하거나 [정책 mod](#enforce-a-policy-with-a-mod-of-your-own)에서 호출을 처리하십시오.
71* **다른 권한 확인을 재정의할 수 있습니다.** 도구 호출을 승인하는 사용자의 mod는 `ask` 규칙이 프롬프트할 호출이나 관리되는 설정 외부의 `PreToolUse` hook이 차단한 호출을 승인할 수 있습니다. 자동 모드에서 mod가 승인하는 호출은 분류기 확인 없이 실행됩니다.71* **다른 권한 검사는 재정의될 수 있습니다.** 도구 호출을 승인하는 사용자의 mod는 `ask` 규칙이 확인을 요청할 호출이나 관리형 설정 외부의 `PreToolUse` 훅이 차단한 호출을 승인할 수 있습니다. 자동 모드에서는 mod가 승인한 호출이 분류기 검사 없이 실행됩니다.
72 72
73가드의 소스는 [Claude Code 저장소의 `mods/sec-default` 디렉터리](https://github.com/anthropics/claude-code/tree/main/mods/sec-default)에서 공개적으로 사용 가능합니다.73가드의 소스는 [Claude Code 저장소의 `mods/sec-default` 디렉터리](https://github.com/anthropics/claude-code/tree/main/mods/sec-default)에 공개되어 있습니다.
74 74
75<h3 id="know-which-controls-still-apply">75<h3 id="know-which-controls-still-apply">
76 여전히 적용되는 제어 알기76 계속 적용되는 제어 알아보기
77</h3>77</h3>
78 78
79Mod는 이미 있는 제어를 대체하지 않습니다:79mod는 기존 제어를 대체하지 않습니다.
80 80
81* **설정 hook은 계속 작동합니다.** 설정 파일 및 플러그인의 `hooks/hooks.json`의 Command, HTTP, prompt, agent hook은 mod와 함께 이전과 같이 실행됩니다. 이에 대해 더 이상 사용되지 않는 것은 없습니다.81* **설정 훅은 계속 작동합니다.** 설정 파일과 플러그인의 `hooks/hooks.json`에 있는 command, HTTP, prompt, agent 훅은 mod와 함께 이전과 같이 실행됩니다. 이들 중 deprecated된 것은 없습니다.
82* **거부 규칙은 가드가 로드되는 곳에서 우선합니다.** 사용자의 mod는 `deny` 규칙이 거부하는 호출을 승인할 수 없습니다. [`allowModsToOverrideDenyRules`](#set-options-on-the-built-in-guard)를 설정하지 않는 한 말입니다.82* **가드가 로드된 환경에서는 deny 규칙이 우선합니다.** [`allowModsToOverrideDenyRules`](#set-options-on-the-built-in-guard)를 설정하지 않는 한, 사용자의 mod는 `deny` 규칙이 거부하는 호출을 승인할 수 없습니다.
83* **관리되는 hook이 먼저 실행됩니다.** 관리되는 설정의 `PreToolUse` hook은 모든 mod가 도구 호출을 보기 전에 실행되며 해당 블록은 최종입니다. mod가 호출을 다시 쓰면 관리되는 hook이 다시 쓴 호출에서 다시 실행되므로 블록이 여전히 적용됩니다. 다른 설정 파일 및 플러그인의 `PreToolUse` hook은 마지막 mod 후에 실행되므로 자신의 결과를 도구 실행 대신 반환하는 mod는 이들이 실행되지 않도록 합니다. [Mod가 실행되는 순서](/docs/ko/plugins/mods/events#the-order-mods-run-in)를 참조하세요.83* **관리형 훅이 먼저 실행됩니다.** 관리형 설정의 `PreToolUse` 훅은 어떤 mod보다도 먼저 도구 호출을 확인하며, 그 차단은 최종적입니다. 이후 mod가 호출을 다시 작성하면 관리형 훅이 다시 작성된 호출에 대해 다시 실행되므로 차단은 여전히 적용됩니다. 다른 설정 파일과 플러그인의 `PreToolUse` 훅은 마지막 mod 이후에 실행되므로, 도구를 실행하는 대신 자체 결과를 반환하는 mod는 해당 훅이 실행되지 않도록 합니다. [mod 실행 순서](/docs/ko/plugins/mods/events#the-order-mods-run-in)를 참조하십시오.
84* **네트워크 정책은 `$.http.fetch`를 포함합니다.** 조직이 웹 가져오기를 끄거나 세션에 대해 필수가 아닌 네트워크 트래픽이 꺼져 있으면 Claude Code는 mod가 `$.http.fetch`로 만드는 네트워크 요청을 거부합니다. 정책은 mod가 `$.process.run`으로 시작하는 프로그램을 포함하지 않습니다. 해당 프로그램은 사용자 자신의 액세스로 네트워크에 도달합니다.84* **네트워크 정책은 `$.http.fetch`에 적용됩니다.** 조직에서 웹 가져오기를 끄거나 세션에서 필수적이지 않은 네트워크 트래픽이 꺼져 있으면, Claude Code는 mod가 `$.http.fetch`로 보내는 네트워크 요청을 거부합니다. 이 정책은 mod가 `$.process.run`으로 시작하는 프로그램에는 적용되지 않습니다. 해당 프로그램은 사용자 자신의 액세스 권한으로 네트워크에 접근합니다.
85* **플러그인 제어는 mod를 포함합니다.** Mod는 플러그인이므로 [사용자가 설치할 수 있는 것을 제한하는 설정](/docs/ko/plugins/org#restrict-what-users-can-install)(예: `strictKnownMarketplaces`)은 설치 가능 여부를 결정합니다.85* **플러그인 제어는 mod에도 적용됩니다.** mod는 플러그인이므로 `strictKnownMarketplaces`와 같은 [사용자가 설치할 수 있는 항목을 제한하는 설정](/docs/ko/plugins/org#restrict-what-users-can-install)에 따라 설치 가능 여부가 결정됩니다.
86* **Mod는 권한 프롬프트를 변경할 수 없습니다.** Mod는 Claude Code 인터페이스의 대부분을 다시 스타일링할 수 있지만 권한 프롬프트는 할 수 없으므로 프롬프트가 표시하는 것을 변경할 수 없습니다. Mod는 여전히 프롬프트가 나타나기 전에 도구 호출을 승인하거나 거부할 수 있습니다. [기본적으로 어떤 일이 발생하는지 알기](#know-what-happens-by-default)에서 설명합니다.86* **mod는 권한 프롬프트를 변경할 수 없습니다.** mod는 Claude Code 인터페이스의 상당 부분의 스타일을 바꿀 수 있지만 권한 프롬프트는 바꿀 수 없으므로, 프롬프트에 표시되는 내용을 변경할 수 없습니다. 다만 [기본 동작 알아보기](#know-what-happens-by-default)에서 설명한 것처럼, mod는 프롬프트가 나타나기 전에 도구 호출을 승인하거나 거부할 수 있습니다.
87* **신뢰 프롬프트가 먼저 나타납니다.** 사용자가 아직 신뢰하지 않은 디렉터리의 대화형 세션에서 신뢰 프롬프트에 답할 때까지 mod는 로드되지 않습니다.87* **신뢰 프롬프트가 먼저 나타납니다.** 사용자가 아직 신뢰하지 않은 디렉터리의 대화형 세션에서는 사용자가 신뢰 프롬프트에 응답할 때까지 어떤 mod도 로드되지 않습니다.
88* **`--safe-mode`는 설치된 mod를 끕니다. 자신의 mod도 포함합니다.** `claude --safe-mode`로 세션을 시작하여 mod가 문제를 일으켰는지 확인하세요.88* **`--safe-mode`는 관리자의 mod를 포함하여 설치된 mod를 끕니다.** mod가 문제를 일으켰는지 확인하려면 `claude --safe-mode`로 세션을 시작하십시오.
89 89
90이러한 제어 중 어느 것도 mod를 샌드박스 처리하지 않습니다. 허용하는 mod는 사용자로 실행되며 파일, 프로세스, 네트워크에 대한 사용자의 액세스 권한이 있습니다.90이러한 제어 중 어느 것도 mod를 샌드박스에 격리하지 않습니다. 허용된 mod는 사용자로서 실행되며, 파일, 프로세스, 네트워크에 대한 사용자의 액세스 권한을 가집니다.
91 91
92<h2 id="decide-whether-to-leave-mods-on">92<h2 id="decide-whether-to-leave-mods-on">
93 Mod를 활성화된 상태로 유지할지 결정93 mod를 켜 둘지 결정하기
94</h2>94</h2>
95 95
96Mod는 플러그인의 다른 부분보다 더 많은 작업을 할 수 있습니다. Claude Code 내부에서 실행되기 때문입니다. 모든 프롬프트와 도구 호출을 보고, 변경할 수 있으며, 권한 프롬프트가 나타나기 전에 도구 호출을 승인하거나 거부할 수 있습니다.96mod는 Claude Code 내부에서 실행되므로 플러그인의 다른 구성 요소보다 더 많은 작업을 할 수 있습니다. mod는 모든 프롬프트와 도구 호출을 확인하고 변경할 수 있으며, 권한 프롬프트가 표시되기 전에 도구 호출을 허용하거나 거부할 수 있습니다.
97 97
98사용자가 mod로 로드할 수 있는 것은 이미 있는 플러그인 제어에 따라 달라집니다:98사용자가 mod로 로드할 수 있는 항목은 이미 적용된 플러그인 제어 방식에 따라 달라집니다.
99 99
100| 현재 플러그인 제어 | 사용자가 mod로 로드할 수 있는 것 |100| 현재 플러그인 제어 방식 | 사용자가 mod로 로드할 수 있는 항목 |
101| :- | :- |101| :- | :- |
102| 없음 | 모든 마켓플레이스의 mod, `--plugin-dir`이 있는 모든 디렉터리, 또는 Claude가 세션 중에 작성하는 mod |102| 없음 | 모든 마켓플레이스의 mod, `--plugin-dir`로 지정한 모든 디렉터리의 mod, 또는 세션 중에 Claude가 작성한 mod |
103| 마켓플레이스 허용 목록 | 허용하는 마켓플레이스의 mod 또는 `--plugin-dir`이 있는 모든 디렉터리. Claude가 작성하는 mod는 허용 목록이 [`skills-dir`을 포함](/docs/ko/plugins/org#keep-skills-directory-plugins-loading)할 때만 로드됩니다. |103| 마켓플레이스 허용 목록 | 허용한 마켓플레이스의 mod 또는 `--plugin-dir`로 지정한 모든 디렉터리의 mod. 세션 중에 Claude가 작성한 mod는 허용 목록에 [`skills-dir`이 포함된](/docs/ko/plugins/org#keep-skills-directory-plugins-loading) 경우에만 로드됩니다. |
104| 마켓플레이스 허용 목록 및 `disableSideloadFlags` | 허용하는 마켓플레이스의 mod |104| 마켓플레이스 허용 목록 및 `disableSideloadFlags` | 허용한 마켓플레이스의 mod |
105 105
106[조직의 플러그인 관리](/docs/ko/plugins/org)는 플러그인이 로드되는 모든 방법과 각각을 제어하는 설정을 나열합니다.106[조직의 플러그인 관리](/docs/ko/plugins/org)에서 플러그인이 로드되는 방식과 각 방식을 제어하는 설정을 확인할 수 있습니다.
107 107
108사용자가 설치하기 전에 마켓플레이스의 mod를 확인하려면 [mod가 할 수 있는 작업 검토](#review-what-a-mod-can-do)를 참조하세요. 사용자의 mod를 그렇게 할 때까지 제외하려면 [사용자가 설치한 mod가 로드되지 않도록 중지](#stop-user-installed-mods-from-loading)를 참조하세요.108사용자가 설치하기 전에 마켓플레이스의 mod를 검토하려면 [mod가 할 수 있는 작업 검토하기](#review-what-a-mod-can-do)를 참조하십시오. 검토를 마칠 때까지 사용자의 mod를 차단하려면 [사용자가 설치한 mod의 로드 중지하기](#stop-user-installed-mods-from-loading)를 참조하십시오.
109 109
110<h3 id="review-what-a-mod-can-do">110<h3 id="review-what-a-mod-can-do">
111 mod가 할 수 있는 작업 검토111 mod가 할 수 있는 작업 검토하기
112</h3>112</h3>
113 113
114실행하지 않고도 mod가 할 수 있는 작업을 볼 수 있습니다. 셸에서 플러그인의 디렉터리에 대해 `claude plugin validate`를 실행하세요:114mod를 실행하지 않고도 mod가 할 수 있는 작업을 확인할 수 있습니다. 셸에서 플러그인 디렉터리를 대상으로 `claude plugin validate`를 실행합니다.
115 115
116```bash theme={null}116```bash theme={null}
117claude plugin validate ./some-mod117claude plugin validate ./some-mod
118```118```
119 119
120출력의 두 줄은 mod의 코드를 설명합니다:120출력 중 두 줄이 mod의 코드를 설명합니다.
121 121
122```text theme={null}122```text theme={null}
123 ❯ ./register.js hooks: session.start, tool.call, ui.render{component=Pane}123 ❯ ./register.js hooks: session.start, tool.call, ui.render{component=Pane}
124 ❯ ./register.js calls: $.fs.read, $.http.fetch, $.store.set, $.ui.open124 ❯ ./register.js calls: $.fs.read, $.http.fetch, $.store.set, $.ui.open
125```125```
126 126
127`hooks:` 줄은 mod가 받는 이벤트를 나열합니다. `calls:` 줄은 코드가 호출하는 mod API 메서드를 나열합니다. [mod API](/docs/ko/plugins/mods/api)(mod의 코드에서 `$`로 작성됨)는 mod가 파일, 프로세스, 네트워크에 도달하는 방법입니다. Claude Code는 이 명령이 읽을 수 없는 방식으로 mod API를 사용하는 mod를 로드하기를 거부합니다.127`hooks:` 줄은 mod가 수신하는 이벤트를 나열합니다. `calls:` 줄은 mod 코드가 호출하는 mods API 메서드를 나열합니다. mod 코드에서 `$`로 표기되는 [mods API](/docs/ko/plugins/mods/api)는 mod가 파일, 프로세스, 네트워크에 접근하는 수단입니다. Claude Code는 이 명령으로 읽을 수 없는 방식으로 mods API를 사용하는 mod의 로드를 거부합니다.
128 128
129`calls:` 줄에서 다음을 찾으세요:129`calls:` 줄에서 다음 항목을 확인하십시오.
130 130
131| 호출 | 의미 |131| 호출 | 의미 |
132| :- | :- |132| :- | :- |
133| `$.fs.read`, `$.fs.write` | 사용자가 할 수 있는 곳 어디든 파일을 읽거나 씁니다 |133| `$.fs.read`, `$.fs.write` | 사용자가 접근할 수 있는 모든 위치의 파일을 읽거나 씁니다 |
134| `$.process.run`, `$.process.spawn` | 사용자로 프로그램을 시작합니다 |134| `$.process.run`, `$.process.spawn` | 사용자 권한으로 프로그램을 시작합니다 |
135| `$.http.fetch` | 네트워크 요청을 합니다 |135| `$.http.fetch` | 네트워크 요청을 보냅니다 |
136| `$.env.get`, `$.settings.read` | 환경 변수 및 설정을 읽습니다. API 키를 보유할 수 있습니다. `env reads:` 줄은 각 변수의 이름을 지정합니다. |136| `$.env.get`, `$.settings.read` | API 키가 포함될 수 있는 환경 변수와 설정을 읽습니다. 출력의 `env reads:` 줄에 각 변수의 이름이 표시됩니다. |
137| `$.env.set` | Claude Code 및 시작하는 모든 명령 및 MCP 서버에 대한 환경 변수를 설정합니다. 이는 해당 프로그램이 실행하는 것을 변경할 수 있습니다. `env writes:` 줄은 각 변수의 이름을 지정합니다. |137| `$.env.set` | Claude Code와 이후 Claude Code가 시작하는 모든 명령 및 MCP 서버에 환경 변수를 설정하며, 이로 인해 해당 프로그램이 실행하는 내용이 바뀔 수 있습니다. `env writes:` 줄에 각 변수의 이름이 표시됩니다. |
138| `$.mcp.call` | 연결된 MCP 서버의 도구를 호출합니다. 세션의 권한 규칙에 따릅니다 |138| `$.mcp.call` | 세션의 권한 규칙에 따라 연결된 MCP 서버의 도구를 호출합니다 |
139| `$.model.complete` | 모델 호출에 사용자의 플랜 또는 API 키를 사용합니다 |139| `$.model.complete` | 모델 호출에 사용자의 플랜 또는 API 키를 사용합니다 |
140| `$.prompt.submit` | 프롬프트를 제출하고 사용자 자신의 말로 보낼 수 있습니다 |140| `$.prompt.submit` | 프롬프트를 제출하며, 사용자가 직접 작성한 것처럼 보낼 수 있습니다 |
141| `$.session.send` | 다른 세션 또는 subagent의 Claude가 읽는 메시지를 보냅니다 |141| `$.session.send` | 다른 세션 또는 서브에이전트의 Claude가 읽는 메시지를 보냅니다 |
142 142
143`hooks:` 줄에서 [`tool.call`](/docs/ko/plugins/mods/reference#tools) 및 [`prompt.submit`](/docs/ko/plugins/mods/reference#prompts-and-what-claude-reads)은 mod가 모든 도구 호출 및 모든 프롬프트를 보고 변경할 수 있음을 의미합니다. [`session.append`](/docs/ko/plugins/mods/reference#session)는 mod가 저장되기 전에 대화의 각 행을 다시 쓸 수 있음을 의미합니다. [`ui.render{component=AskUserQuestion}`](/docs/ko/plugins/mods/interface#change-what-claude-code-already-draws)는 mod가 Claude가 사용자에게 질문하는 데 사용하는 대화를 다시 그릴 수 있음을 의미합니다. `tool.check`는 mod가 권한 프롬프트가 나타나기 전에 도구 호출을 승인하거나 거부할 수 있음을 의미합니다. [기본적으로 어떤 일이 발생하는지 알기](#know-what-happens-by-default)는 해당 답변보다 우선하는 규칙 및 hook을 나열합니다.143`hooks:` 줄에서 [`tool.call`](/docs/ko/plugins/mods/reference#tools)과 [`prompt.submit`](/docs/ko/plugins/mods/reference#prompts-and-what-claude-reads)은 mod가 모든 도구 호출과 모든 프롬프트를 확인하고 변경할 수 있음을 의미합니다. [`session.append`](/docs/ko/plugins/mods/reference#session)는 mod가 대화의 각 행이 저장되기 전에 이를 다시 작성할 수 있음을 의미합니다. [`ui.render{component=AskUserQuestion}`](/docs/ko/plugins/mods/interface#change-what-claude-code-already-draws)는 Claude가 사용자에게 질문할 때 사용하는 대화 상자를 mod가 다시 그릴 수 있음을 의미합니다. `tool.check`는 권한 프롬프트가 표시되기 전에 mod가 도구 호출을 승인하거나 거부할 수 있음을 의미합니다. [기본 동작 알아보기](#know-what-happens-by-default)에서 mod의 응답보다 우선 적용되는 규칙과 훅을 확인할 수 있습니다.
144 144
145<h2 id="choose-how-much-to-allow">145<h2 id="choose-how-much-to-allow">
146 허용할 범위 선택146 허용 범위 선택하기
147</h2>147</h2>
148 148
149Mod 정책은 설치된 mod가 없는 것부터 사용자가 선택하는 모든 mod까지 다양하며, 자신의 mod가 다른 mod를 확인하고 각각은 몇 가지 관리되는 설정입니다. 원하는 정책을 첫 번째 열에서 찾고 두 번째 열이 이름을 지정하는 것을 설정하세요. [관리되는 설정 배포](/docs/ko/managed-settings)는 관리되는 설정이 있는 위치를 다룹니다.149mod 정책은 설치된 mod를 전혀 허용하지 않는 것부터 사용자가 선택한 모든 mod를 허용하되 조직의 자체 mod가 다른 mod를 검사하는 것까지 다양하며, 각 정책은 몇 가지 관리형 설정으로 구성됩니다. 첫 번째 열에서 원하는 정책을 찾고 두 번째 열에 명시된 항목을 설정하십시오. 관리형 설정의 위치는 [관리형 설정 배포하기](/docs/ko/managed-settings)에서 다룹니다.
150 150
151| 원하는 것 | 설정 |151| 원하는 결과 | 설정 |
152| :- | :- |152| :- | :- |
153| 설치된 mod 없음, hook은 건드리지 않음 | [`allowManagedModsOnly`](#set-options-on-the-built-in-guard)를 설정하고 자신의 mod를 배포하지 않음 |153| 설치된 mod는 허용하지 않고 훅은 그대로 유지 | [`allowManagedModsOnly`](#set-options-on-the-built-in-guard)를 설정하고 조직 자체의 mod는 배포하지 않음 |
154| 설치된 mod 없음, hook도 없음. 관리되는 hook 포함 | `disableAllHooks`를 `true`로 설정 |154| 설치된 mod와 훅을 모두 허용하지 않음(관리형 훅 포함) | `disableAllHooks`를 `true`로 설정 |
155| 조직의 mod만 | 가드의 [`allowManagedModsOnly` 옵션](#stop-user-installed-mods-from-loading)을 설정하고 [mod를 설치](#install-your-organizations-mods)하여 조직의 것으로 간주되도록 함 |155| 조직의 mod만 허용 | 가드의 [`allowManagedModsOnly` 옵션](#stop-user-installed-mods-from-loading)을 설정하고, 조직의 mod로 인정되도록 [mod를 설치](#install-your-organizations-mods) |
156| 승인하는 마켓플레이스의 모든 mod | [마켓플레이스 제한](/docs/ko/plugins/org#restrict-what-users-can-install)을 유지하고 `disableSideloadFlags`를 `true`로 설정 |156| 승인한 마켓플레이스의 모든 mod 허용 | [마켓플레이스 제한](/docs/ko/plugins/org#restrict-what-users-can-install)을 유지하고 `disableSideloadFlags`를 `true`로 설정 |
157| 모든 mod, 자신의 mod가 다른 mod를 확인 | [mod를 설치](#install-your-organizations-mods)하고 `prependPlugins`에서 `sec-default@builtin`과 함께 나열 |157| 모든 mod를 허용하되 조직의 자체 mod가 다른 mod를 검사 | [mod를 설치](#install-your-organizations-mods)하고 `prependPlugins`에 `sec-default@builtin`과 함께 나열 |
158 158
159각 설정이 하는 작업:159각 설정의 역할은 다음과 같습니다.
160 160
161* **`allowManagedModsOnly`**: 기본 제공 가드의 옵션입니다. 사용자의 자체 mod는 로드되지 않으며 설정 hook, 상태 줄, `/goal`은 계속 작동합니다. [사용자가 설치한 mod가 로드되지 않도록 중지](#stop-user-installed-mods-from-loading)는 포함하는 것을 나열합니다.161* **`allowManagedModsOnly`**: 기본 제공 가드의 옵션입니다. 사용자가 직접 설치한 mod는 로드되지 않으며, 사용자의 설정 훅, 상태줄, `/goal`은 계속 작동합니다. 적용 범위는 [사용자가 설치한 mod의 로드 차단하기](#stop-user-installed-mods-from-loading)에 나와 있습니다.
162* **`allowManagedHooksOnly`**: 더 넓은 설정입니다. [조직의 mod](#install-your-organizations-mods) 및 Claude Code에 기본 제공되는 mod만 로드됩니다. 사용자가 자신이 설치한 mod는 로드되지 않습니다. 설정은 또한 사용자의 자체 설정 파일의 hook을 차단합니다. 설정하기 전에 [`allowManagedHooksOnly` 아래에서 실행되는 것](/docs/ko/settings-reference#what-runs-under-allowmanagedhooksonly)을 읽으세요.162* **`allowManagedHooksOnly`**: 더 넓은 범위의 설정입니다. [조직의 mod](#install-your-organizations-mods)와 Claude Code에 기본 제공되는 mod만 로드됩니다. 사용자가 직접 설치한 mod는 로드되지 않습니다. 이 설정은 사용자 자체 설정 파일의 훅도 차단합니다. 설정하기 전에 [`allowManagedHooksOnly`에서 실행되는 항목](/docs/ko/settings-reference#what-runs-under-allowmanagedhooksonly)을 확인하십시오.
163* **`disableAllHooks`**: 가장 넓은 설정입니다. 관리되는 설정에서 설치된 모든 플러그인의 mod(자신의 포함)를 중지하고 설정 파일의 모든 hook을 끕니다. 따라서 관리되는 설정의 `PreToolUse` hook은 더 이상 아무것도 차단하지 않습니다. 사용자 정의 상태 줄 및 `/goal`도 작동을 중지합니다. 설정하기 전에 [`disableAllHooks`](/docs/ko/settings-reference#disableallhooks)를 읽으세요.163* **`disableAllHooks`**: 가장 넓은 범위의 설정입니다. 관리형 설정에서 사용하면 조직의 플러그인을 포함해 설치된 모든 플러그인의 mod를 중지하고 설정 파일의 모든 훅을 끄므로, 관리형 설정의 `PreToolUse` 훅도 더 이상 아무것도 차단하지 않습니다. 사용자 지정 상태줄과 `/goal`도 작동하지 않습니다. 설정하기 전에 [`disableAllHooks`](/docs/ko/settings-reference#disableallhooks)를 확인하십시오.
164* **`disableSideloadFlags`**: 시작 시 `--plugin-dir` 및 `--plugin-url`을 거부하므로 아무도 디렉터리에서 mod를 로드하지 않으며 Claude가 세션 중에 작성하는 mod가 로드되지 않도록 합니다. 설정은 또한 `--agents` 및 `--mcp-config`를 거부합니다. 설정하기 전에 [`disableSideloadFlags`](/docs/ko/settings-reference#disablesideloadflags)를 읽으세요.164* **`disableSideloadFlags`**: 시작 시 `--plugin-dir`와 `--plugin-url`을 거부하고, 세션 중에 Claude가 작성한 mod가 로드되지 않도록 합니다. 이 설정은 `--agents`와 `--mcp-config`도 거부합니다. 설정하기 전에 [`disableSideloadFlags`](/docs/ko/settings-reference#disablesideloadflags)를 확인하십시오.
165 165
166Claude Code에 기본 제공되는 mod(예: `AGENTS.md` 지원)는 이러한 설정의 영향을 받지 않습니다. 각각은 [자신의 스위치](/docs/ko/plugins/mods/overview#mods-built-into-claude-code)를 가집니다.166`AGENTS.md` 지원과 같이 Claude Code에 기본 제공되는 mod는 이러한 설정의 영향을 받지 않습니다. 각 mod에는 [자체 스위치](/docs/ko/plugins/mods/overview#mods-built-into-claude-code)가 있습니다.
167 167
168mod가 로드되지 않은 사용자는 디버그 로그에서 이유를 찾습니다. [거부 메시지](/docs/ko/plugins/mods/troubleshoot#refusal-messages)는 `allowManagedHooksOnly` 및 `disableAllHooks`의 줄을 나열하고 [기본 제공 가드의 메시지](/docs/ko/plugins/mods/troubleshoot#messages-from-the-built-in-guard)는 `allowManagedModsOnly`의 줄을 가집니다.168mod가 로드되지 않은 사용자는 디버그 로그에서 그 이유를 확인할 수 있습니다. [거부 메시지](/docs/ko/plugins/mods/troubleshoot#refusal-messages)에는 `allowManagedHooksOnly`와 `disableAllHooks`에 해당하는 줄이 나와 있으며, [기본 제공 가드의 메시지](/docs/ko/plugins/mods/troubleshoot#messages-from-the-built-in-guard)에는 `allowManagedModsOnly`에 해당하는 줄이 나와 있습니다.
169
170<h3 id="allow-only-your-organization’s-mods">
171 조직의 mod만 허용하기
172</h3>
173
174조직의 mod를 실행하고 사용자가 가져온 mod를 차단하려면 [정책 표](#choose-how-much-to-allow)의 **조직의 mod만 허용** 행에 있는 설정과 함께 `disableSideloadFlags`를 배포하십시오. 다음의 완전한 `managed-settings.json`을 사용하면 Claude Code가 사용자 자체 mod를 거부하므로 사용자의 훅은 하나도 실행되지 않으며, 조직의 정책 mod가 다른 mod보다 먼저 실행됩니다.
175
176```json managed-settings.json theme={null}
177{
178 "extraKnownMarketplaces": {
179 "acme-tools": {
180 "source": { "source": "directory", "path": "/opt/acme/claude-plugins" }
181 }
182 },
183 "enabledPlugins": { "acme-guard@acme-tools": true },
184 "prependPlugins": ["acme-guard@acme-tools", "sec-default@builtin"],
185 "pluginConfigs": {
186 "cc-plugin-sec-default@builtin": {
187 "options": { "allowManagedModsOnly": true }
188 }
189 },
190 "disableSideloadFlags": true
191}
192```
193
194각 키 그룹은 다음과 같은 역할을 합니다.
195
196* **`extraKnownMarketplaces`, `enabledPlugins`, `prependPlugins`**: 조직의 mod로 인정되도록 mod를 설치하고, 해당 mod를 가장 먼저 실행한 뒤 가드를 실행합니다. 이 키들이 가리키는 디렉터리는 [조직의 mod 설치 및 순서 설정하기](#install-your-organizations-mods)에서 다룹니다.
197* **`pluginConfigs`**: 가드의 `allowManagedModsOnly` 옵션을 설정하여 Claude Code가 사용자 자체 mod를 거부하도록 합니다. 사용자의 설정 훅, 상태줄, `/goal`은 계속 작동합니다.
198* **`disableSideloadFlags`**: 시작 시 거부되는 플래그는 [`disableSideloadFlags`](/docs/ko/settings-reference#disablesideloadflags)를 참조하십시오.
199
200테스트 머신에서 정책을 확인하려면 셸에서 `claude --debug`로 세션을 시작하고 디버그 로그를 확인하십시오.
201
202* **조직의 mod**: 해당 mod의 `hooks module` 줄에 `tier prepend`가 있습니다.
203* **사용자가 설치한 mod**: `refused by cc-plugin-sec-default: mods are limited to your organization's by policy (allowManagedModsOnly)`라는 줄이 표시됩니다. 그보다 앞선 줄에 해당 mod의 훅 모듈이 `loaded`되었다고 표시되므로 거부 메시지를 찾아보십시오.
204* **플러그인 디렉터리**: `claude --plugin-dir ./any-mod`가 `--plugin-dir is disabled by your organization's managed settings (disableSideloadFlags)`로 시작하는 메시지와 함께 종료됩니다.
205
206사용자가 추가할 수 있는 마켓플레이스도 제한하려면 이 파일을 [마켓플레이스 제한](/docs/ko/plugins/org#restrict-what-users-can-install)과 함께 사용하십시오.
207
208<h3 id="apply-your-plugin-controls-to-mods">
209 mod에 플러그인 제어 적용하기
210</h3>
211
212mod는 플러그인이므로 [조직의 플러그인을 관리](/docs/ko/plugins/org)하는 방법은 mod를 포함하는 플러그인에도 적용됩니다.
213
214* **전체 환경에서 로드되는 플러그인 확인하기**: [감사 및 검토](/docs/ko/plugins/org#audit-and-review)
215* **검토한 플러그인의 업데이트 시점 결정하기**: [업데이트 정책 설정하기](/docs/ko/plugins/org#set-update-policy)
216* **파일럿 등 특정 그룹에 다른 정책 적용하기**: [관리형 설정으로 강제할 수 없는 사항에 대비하기](/docs/ko/plugins/org#plan-for-what-managed-settings-can’t-enforce)
217* **플러그인 키를 적용하는 앱과 세션 종류 확인하기**: [각 사용 환경에서 플러그인 키를 적용하는 시점](/docs/ko/plugins/org#when-each-surface-applies-the-plugin-keys)
218* **CI 및 컨테이너 설정하기**: [컨테이너 및 CI 시딩](/docs/ko/plugins/org#seed-containers-and-ci)
219* **사용자가 설치할 수 있는 mod 제공하기**: [마켓플레이스 호스팅하기](/docs/ko/plugins/host-marketplace). Claude Code가 GitHub, git, URL 또는 npm 소스에서 복사한 mod는 [조직의 mod](#install-your-organizations-mods)가 아니라 사용자의 mod로 간주됩니다.
169 220
170<h3 id="set-options-on-the-built-in-guard">221<h3 id="set-options-on-the-built-in-guard">
171 기본 제공 가드에서 옵션 설정222 기본 제공 가드의 옵션 설정하기
172</h3>223</h3>
173 224
174기본 제공 가드는 두 가지 옵션을 사용합니다. [사용자가 설치한 mod가 로드되지 않도록 중지](#stop-user-installed-mods-from-loading)의 예제처럼 `pluginConfigs` 아래의 관리되는 설정에서 `cc-plugin-sec-default@builtin`으로 키가 지정되어 있습니다.225기본 제공 가드는 옵션을 받습니다. [사용자가 설치한 mod의 로드 차단하기](#stop-user-installed-mods-from-loading)의 예시처럼, 관리형 설정의 `pluginConfigs` 아래에 `cc-plugin-sec-default@builtin`을 키로 하여 옵션을 설정하십시오.
175 226
176표는 각 옵션이 설정되지 않았을 때와 `true`로 설정되었을 때 사용자가 얻는 것을 제공합니다:227다음 표는 각 옵션을 설정하지 않았을 때와 `true`로 설정했을 때 사용자에게 적용되는 결과를 보여 줍니다.
177 228
178| 옵션 | 설정되지 않음 | `true` |229| 옵션 | 미설정 | `true` |
179| :- | :- | :- |230| :- | :- | :- |
180| `allowManagedModsOnly` | 사용자의 자체 mod가 로드됨 | [조직의 mod](#install-your-organizations-mods) 및 Claude Code에 기본 제공되는 mod만 로드됩니다. Claude Code는 사용자가 설치했거나 `--plugin-dir`로 이름을 지정한 mod를 포함한 다른 모든 mod를 거부합니다. |231| `allowManagedModsOnly` | 사용자 자체 mod가 로드됨 | [조직의 mod](#install-your-organizations-mods)와 Claude Code에 기본 제공되는 mod만 로드됩니다. 사용자가 설치했거나 `--plugin-dir`로 지정한 mod를 포함해 그 밖의 모든 mod는 Claude Code가 거부합니다. |
181| `allowModsToOverrideDenyRules` | 거부 규칙이 사용자의 mod보다 우선합니다 | 도구 호출을 승인하는 사용자의 mod는 `deny` 규칙이 거부하는 호출을 승인할 수 있습니다 |232| `allowModsToOverrideDenyRules` | 거부 규칙이 사용자 mod보다 우선함 | 도구 호출을 승인하는 사용자 mod가 `deny` 규칙이 거부한 호출을 승인할 수 있음 |
182 233
183이러한 규칙은 옵션이 적용되는지 결정합니다:234옵션의 적용 여부는 다음 규칙에 따라 결정됩니다.
184 235
185* **ID는 여기서 한 가지 철자입니다**: Claude Code는 `cc-plugin-sec-default@builtin` 아래에서만 옵션을 읽습니다. `prependPlugins`는 `sec-default@builtin`도 허용하고 `pluginConfigs`는 허용하지 않습니다.236* **여기서는 ID 형식이 하나뿐입니다**: Claude Code는 `cc-plugin-sec-default@builtin` 아래의 옵션만 읽습니다. `prependPlugins`는 `sec-default@builtin`도 허용하지만 `pluginConfigs`는 허용하지 않습니다.
186* **관리되는 설정만 계산됩니다**: 사용자, 프로젝트 또는 로컬 설정 파일의 동일한 항목이나 `--settings`로 전달된 파일의 항목은 옵션을 설정하거나 느슨하게 하지 않습니다237* **관리형 설정만 적용됩니다**: 사용자, 프로젝트 또는 로컬 설정 파일이나 `--settings`로 전달된 파일에 동일한 항목이 있어도 옵션을 설정하거나 완화하지 않습니다.
187* **가드가 로드되어야 합니다**: `prependPlugins`를 설정하면 [목록에서 가드의 이름을 지정](#install-your-organizations-mods)하세요. 가드가 로드되지 않는 곳에서 옵션도 적용되지 않습니다.238* **가드가 로드되어야 합니다**: `prependPlugins`를 설정하는 경우 [목록에 가드를 포함](#install-your-organizations-mods)하십시오. 가드가 로드되지 않으면 두 옵션 모두 적용되지 않습니다.
188* **가드는 닫힌 상태로 실패합니다**: 가드가 관리되는 설정을 읽을 수 없으면 로드 시 모든 사용자의 mod를 거부합니다. 사용자의 mod가 승인한 호출에 대해 거부 규칙을 확인할 수 없으면 호출을 거부합니다.239* **가드는 실패 시 차단합니다**: 가드가 관리형 설정을 읽을 수 없으면 로드 시점에 모든 사용자 mod를 거부합니다. 사용자 mod가 승인한 호출에 대해 거부 규칙을 확인할 수 없으면 해당 호출을 거부합니다.
189 240
190[기본 제공 가드의 메시지](/docs/ko/plugins/mods/troubleshoot#messages-from-the-built-in-guard)는 옵션이 적용될 때 사용자가 보는 것입니다.241두 옵션 중 하나가 적용될 때 사용자에게 표시되는 내용은 [기본 제공 가드의 메시지](/docs/ko/plugins/mods/troubleshoot#messages-from-the-built-in-guard)에 나와 있습니다.
191 242
192<h2 id="run-your-organization’s-own-mods">243<h2 id="run-your-organization’s-own-mods">
193 조직의 자체 mod 실행244 조직 자체 mod 실행하기
194</h2>245</h2>
195 246
196모든 사용자에게 자신의 mod를 배포하고, 사용자의 mod에 상대적으로 실행되는 위치를 선택하고, 정책을 적용하는 데 사용할 수 있습니다.247자체 mod를 모든 사용자에게 배포하고, 사용자 mod를 기준으로 실행 위치를 정하고, mod를 사용해 정책을 적용할 수 있습니다.
197 248
198<h3 id="install-your-organizations-mods">249<h3 id="install-your-organizations-mods">
199 조직의 mod를 설치하고 순서를 설정합니다250 조직의 mod 설치 및 순서 설정하기
200</h3>251</h3>
201 252
202조직의 mod는 사용자의 mod가 로드되지 않는 곳에 로드되고 그 앞에서 실행될 수 있으므로 Claude Code는 mod가 조직에서 왔다는 것을 알 수 있어야 합니다. 다음이 모두 참일 때만 mod를 조직의 것으로 취급합니다:253조직의 mod는 사용자 mod가 로드되지 않는 곳에서도 로드되며 사용자 mod보다 먼저 실행될 수 있으므로, Claude Code는 mod가 조직에서 온 것인지 구분할 수 있어야 합니다. Claude Code는 다음 조건이 모두 충족될 때만 mod를 조직의 mod로 취급합니다.
203 254
204* 관리되는 `enabledPlugins`는 mod의 플러그인을 `true`로 설정합니다255* 관리형 `enabledPlugins`가 mod의 플러그인을 `true`로 설정합니다
205* 관리되는 설정은 플러그인의 [마켓플레이스](/docs/ko/plugins/create-marketplace)를 사용자의 머신의 디렉터리로 절대 경로로 이름을 지정합니다. `extraKnownMarketplaces` 항목이 그렇게 하고 사용자를 위해 마켓플레이스를 등록합니다.256* 관리형 설정이 플러그인의 [마켓플레이스](/docs/ko/plugins/create-marketplace)를 사용자 컴퓨터의 디렉터리로, 절대 경로를 통해 지정합니다. `extraKnownMarketplaces` 항목이 이를 수행하며 사용자에게 마켓플레이스도 등록합니다.
206* 마켓플레이스는 플러그인을 상대 경로로 나열하므로 Claude Code는 [해당 디렉터리에서 로드](/docs/ko/plugins/loading#in-place-and-copied-plugins)합니다257* 마켓플레이스가 플러그인을 상대 경로로 나열하므로, Claude Code가 해당 디렉터리에서 [플러그인을 제자리에서 로드합니다](/docs/ko/plugins/loading#in-place-and-copied-plugins)
207 258
208이를 충족하려면 장치 관리가 마켓플레이스 디렉터리를 모든 머신의 동일한 경로에 복사하도록 합니다. 관리되는 설정 파일처럼 디렉터리 및 그 위의 모든 디렉터리를 관리자만 쓸 수 있도록 만드세요. 거기에 쓸 수 있는 사람은 누구든 mod를 다시 쓸 수 있습니다. claude.ai 관리자 콘솔에서 전달하는 관리되는 설정은 키를 전달할 수 있지만 머신에 디렉터리를 넣을 수 없습니다.259이 조건을 충족하려면 디바이스 관리 도구가 마켓플레이스 디렉터리를 모든 컴퓨터의 동일한 경로에 복사하도록 하십시오. 관리형 설정 파일과 마찬가지로 해당 디렉터리와 그 상위의 모든 디렉터리는 관리자만 쓸 수 있도록 설정하십시오. 그곳에 쓸 수 있는 사람은 누구나 mod를 다시 작성할 수 있습니다. claude.ai 관리 콘솔에서 제공하는 관리형 설정에는 해당 키를 포함할 수 있지만, 디렉터리를 컴퓨터에 배치할 수는 없습니다.
209 260
210디렉터리는 마켓플레이스의 매니페스트 및 플러그인을 보유합니다:261디렉터리에는 마켓플레이스의 매니페스트와 플러그인이 들어 있습니다.
211 262
212```text theme={null}263```text theme={null}
213/opt/acme/claude-plugins/264/opt/acme/claude-plugins/
222 └── register.js273 └── register.js
223```274```
224 275
225매니페스트는 플러그인을 해당 디렉터리에 상대적인 경로로 나열합니다:276매니페스트는 해당 디렉터리를 기준으로 한 상대 경로로 플러그인을 나열합니다.
226 277
227```json /opt/acme/claude-plugins/.claude-plugin/marketplace.json theme={null}278```json /opt/acme/claude-plugins/.claude-plugin/marketplace.json theme={null}
228{279{
234}285}
235```286```
236 287
237Claude Code가 캐시에 복사하는 플러그인은 관리되는 `enabledPlugins`가 활성화하더라도 사용자의 것으로 간주됩니다. 이는 GitHub, git, URL 또는 npm 소스의 모든 플러그인을 포함합니다. 해당 mod는 사용자의 mod 중에서 실행되고 `prependPlugins` 및 `appendPlugins`는 이를 건너뛰고 `allowManagedModsOnly` 또는 `allowManagedHooksOnly` 아래에서 로드되지 않습니다. 사용자의 디버그 로그에는 플러그인의 ID로 시작하고 `is enabled by managed settings, but`인 줄이 있습니다.288Claude Code가 캐시에 복사하는 플러그인은 관리형 `enabledPlugins`가 활성화하더라도 사용자의 플러그인으로 간주됩니다. GitHub, git, URL 또는 npm 소스의 모든 플러그인이 이에 해당합니다. 해당 플러그인의 mod는 사용자 mod와 함께 실행되고, `prependPlugins`와 `appendPlugins`는 이를 건너뛰며, `allowManagedModsOnly` 또는 `allowManagedHooksOnly`에서는 로드되지 않습니다. 사용자의 디버그 로그에는 플러그인 ID와 `is enabled by managed settings, but`으로 시작하는 줄이 기록됩니다.
238 289
239Claude Code는 도구를 실행하는 것과 같이 행동하려고 할 때마다 이벤트를 발생시키고 각 mod에 차례로 전달합니다. 조직의 것으로 간주되는 mod는 어디에도 나열하지 않아도 [사용자의 mod 전에 실행](/docs/ko/plugins/mods/events#the-order-mods-run-in)됩니다. 위치를 설정하려면 ID를 두 가지 설정 중 하나에 나열하세요. ID는 플러그인의 이름, `@`, 마켓플레이스의 이름입니다. 예: `acme-guard@acme-tools`.290Claude Code는 도구 실행과 같은 작업을 수행하려 할 때마다 이벤트를 발생시키고 이를 각 mod에 차례로 전달합니다. 조직의 것으로 간주되는 mod는 어디에도 나열하지 않더라도 [사용자 mod보다 먼저 실행됩니다](/docs/ko/plugins/mods/events#the-order-mods-run-in). 실행 위치를 지정하려면 두 설정 중 하나에 해당 ID를 나열하십시오. ID는 플러그인 이름, `@`, 마켓플레이스 이름으로 구성되며, 예를 들어 `acme-guard@acme-tools`와 같습니다.
240 291
241* **`prependPlugins`**: mod는 모든 사용자의 mod 전에 모든 이벤트를 보고 모든 결과 후에 봅니다. 이벤트를 변경하거나 거부하거나 사용자의 mod를 건너뛸 수 있습니다.292* **`prependPlugins`**: mod가 모든 이벤트를 어떤 사용자 mod보다 먼저 보고 모든 결과를 마지막에 봅니다. 이벤트를 변경하거나, 거부하거나, 사용자 mod를 건너뛸 수 있습니다.
242* **`appendPlugins`**: mod는 모든 사용자의 mod 후에 실행되므로 해당 mod가 전달하는 이벤트만 해당 형식으로 봅니다293* **`appendPlugins`**: mod가 모든 사용자 mod 이후에 실행되므로, 해당 mod들이 전달하는 이벤트만 전달된 형태 그대로 봅니다
243 294
244이 예제는 `/opt/acme/claude-plugins`에서 `acme-tools` 마켓플레이스를 선언하고 `acme-guard`를 활성화하고 해당 mod를 먼저 실행하고 기본 제공 가드를 그 다음에 실행합니다:295다음 예시는 `/opt/acme/claude-plugins`에 `acme-tools` 마켓플레이스를 선언하고, 여기서 `acme-guard`를 활성화한 뒤, 해당 mod를 가장 먼저 실행하고 그다음에 기본 제공 가드를 실행합니다.
245 296
246```json managed-settings.json theme={null}297```json managed-settings.json theme={null}
247{298{
255}306}
256```307```
257 308
258각 키는 한 가지 작업을 합니다:309각 키는 한 가지 역할을 합니다.
259 310
260* **`extraKnownMarketplaces`**: `acme-tools` 마켓플레이스를 보유하는 디렉터리의 이름을 지정합니다. `path`는 `.claude-plugin/marketplace.json`을 포함하는 디렉터리의 절대 경로입니다.311* **`extraKnownMarketplaces`**: `acme-tools` 마켓플레이스가 있는 디렉터리를 지정합니다. `path`는 `.claude-plugin/marketplace.json`이 포함된 디렉터리의 절대 경로입니다.
261* **`enabledPlugins`**: 이러한 관리되는 설정을 받는 모든 사용자에 대해 `acme-guard`를 켭니다312* **`enabledPlugins`**: 이 관리형 설정을 받는 모든 사용자에 대해 `acme-guard`를 켭니다
262* **`prependPlugins`**: `acme-guard`를 먼저, 기본 제공 가드를 두 번째로 배치하고 사용자가 설치한 모든 mod 앞에 배치합니다. Claude Code는 나열하는 순서를 따릅니다.313* **`prependPlugins`**: `acme-guard`를 첫 번째로, 기본 제공 가드를 두 번째로 배치하며, 둘 다 사용자가 설치한 모든 mod보다 앞에 둡니다. Claude Code는 나열된 순서를 따릅니다.
263 314
264사용자의 머신이 설정을 받았는지 확인하려면 [정책이 적용 중인지 확인](/docs/ko/managed-settings#check-that-a-policy-is-in-force)을 참조하세요.315사용자 컴퓨터가 설정을 받았는지 확인하려면 [정책이 적용되었는지 확인하기](/docs/ko/managed-settings#check-that-a-policy-is-in-force)를 참조하십시오.
265 316
266mod가 실행되는 위치를 확인하려면 해당 머신에서 `claude --debug`로 세션을 시작하고 [디버그 로그](/docs/ko/plugins/mods/troubleshoot#read-the-debug-log)에서 mod의 ID를 검색하세요:317mod가 실행되는 위치를 확인하려면 해당 컴퓨터에서 `claude --debug`로 세션을 시작하고 [디버그 로그](/docs/ko/plugins/mods/troubleshoot#read-the-debug-log)에서 mod의 ID를 검색하십시오.
267 318
268* **`hooks module acme-guard@acme-tools loaded`, `tier prepend` 포함**: mod는 조직의 것으로 간주되고 먼저 실행됩니다319* **`tier prepend`가 포함된 `hooks module acme-guard@acme-tools loaded`**: 해당 mod가 조직의 mod로 간주되며 가장 먼저 실행됩니다
269* **`tier user`가 있는 동일한 줄**: Claude Code는 이를 사용자의 mod로 취급합니다. 두 번째 줄 `prependPlugins names acme-guard@acme-tools, which is not an enabled managed plugin with a hooks module; skipped`는 목록이 이를 건너뛰었다고 말합니다.320* **`tier user`가 포함된 같은 줄**: Claude Code가 이를 사용자의 mod로 취급합니다. 두 번째 줄인 `prependPlugins names acme-guard@acme-tools, which is not an enabled managed plugin with a hooks module; skipped`는 목록이 해당 mod를 건너뛰었음을 나타냅니다.
270 321
271이러한 규칙은 두 목록의 어떤 ID가 적용되는지 결정합니다:322다음 규칙에 따라 두 목록의 ID 중 어떤 것이 적용되는지 결정됩니다.
272 323
273* **목록은 기본값을 대체합니다**: 관리되는 설정에서 `prependPlugins`를 설정할 때 기본 제공 가드를 유지하려면 `sec-default@builtin`을 이름을 지정하세요. 가드는 기본 제공되며 `enabledPlugins` 항목이 필요하지 않습니다.324* **목록이 기본값을 대체합니다**: 관리형 설정에서 `prependPlugins`를 설정하는 경우, 기본 제공 가드를 유지하려면 목록에 `sec-default@builtin`을 지정하십시오. 이 가드는 기본 제공되므로 `enabledPlugins` 항목이 필요하지 않습니다.
274* **자신의 ID는 조직의 것으로 간주되어야 합니다**: 관리되는 설정에서 Claude Code는 플러그인이 조직의 mod에 대한 세 가지 조건을 충족하지 않는 ID를 건너뜁니다325* **자체 ID는 조직의 것으로 간주되어야 합니다**: 관리형 설정에서 Claude Code는 플러그인이 조직 mod의 조건을 충족하지 않는 ID를 건너뜁니다
275* **저장소는 이들을 설정할 수 없습니다**: Claude Code는 두 설정을 관리되는 설정에서만 읽고 저장소의 설정 파일에서는 읽지 않습니다. 사용자는 `~/.claude/settings.json`에서 설정하여 관리되는 설정이 없는 머신에서만 자신의 mod를 정렬할 수 있으며 Team 또는 Enterprise 플랜으로 로그인하지 않은 경우에만 가능합니다. 다른 곳에서 Claude Code는 사용자 설정의 두 키를 무시합니다. 거기의 목록은 기본 제공 가드를 추가하거나 제거하지 않습니다.326* **저장소에서는 설정할 수 없습니다**: Claude Code는 두 설정을 관리형 설정에서 읽으며 저장소의 설정 파일에서는 절대 읽지 않습니다. 사용자는 관리형 설정이 없는 컴퓨터에서, 그리고 Team 또는 Enterprise 플랜으로 로그인하지 않은 경우에만 `~/.claude/settings.json`에서 이를 설정하여 자신의 mod 순서를 정할 수 있습니다. 그 외의 경우 Claude Code는 사용자 설정의 두 키를 모두 무시합니다. 그곳의 목록은 기본 제공 가드를 추가하지도 제거하지도 않습니다.
276 327
277<h3 id="enforce-a-policy-with-a-mod-of-your-own">328<h3 id="enforce-a-policy-with-a-mod-of-your-own">
278 자신의 mod로 정책 적용329 자체 mod로 정책 적용하기
279</h3>330</h3>
280 331
281모든 사용자의 mod를 제외하려면 자신의 mod가 필요하지 않습니다. [`allowManagedModsOnly`](#stop-user-installed-mods-from-loading)를 설정하세요. 일부 사용자의 mod를 허용하고 다른 mod를 거부하거나 mod가 하는 작업을 기록하려는 경우 정책 mod를 작성하세요.332모든 사용자 mod를 차단하는 데는 자체 mod가 필요하지 않습니다. [`allowManagedModsOnly`](#stop-user-installed-mods-from-loading)를 설정하십시오. 일부 사용자 mod는 허용하고 다른 mod는 거부하려는 경우, 또는 mod가 수행하는 작업을 기록하려는 경우에 정책 mod를 작성하십시오.
282 333
283다른 mod가 로드되려고 할 때마다 mod는 `claude plugin validate`가 인쇄하는 목록을 [`plugin.register`](/docs/ko/plugins/mods/reference#other-mods)라는 이벤트에서 받습니다. `prependPlugins`의 mod는 해당 목록을 읽고 mod를 거부할 수 있습니다. 또한 [이름으로 모든 mod API 호출을 hook](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network)하여 다른 모든 mod에 대해 해당 호출을 기록하거나 거부할 수 있습니다. 이름은 `$.` 없는 메서드이므로 `fs.write`의 hook은 모든 `$.fs.write` 호출을 봅니다.334다른 mod가 로드되려 할 때마다 mod는 [`plugin.register`](/docs/ko/plugins/mods/reference#other-mods)라는 이벤트를 통해 `claude plugin validate`가 출력하는 목록을 받습니다. `prependPlugins`에 있는 mod는 해당 목록을 읽고 mod를 거부할 수 있습니다. 또한 [모든 mods API 호출을 이름으로 처리](/docs/ko/plugins/mods/api#reach-files-processes-and-the-network)하여 다른 모든 mod에 대해 해당 호출을 기록하거나 거부할 수 있습니다. 이름은 `$.`를 제외한 메서드이므로, `fs.write`에 대한 훅은 모든 `$.fs.write` 호출을 봅니다.
284 335
285이 정책 mod는 자신의 코드가 `$.process.run` 또는 `$.process.spawn`을 호출하는 모든 사용자의 mod를 거부합니다. 또한 감사 로그를 유지하여 각 도구 호출 및 mod가 쓰는 각 파일을 디버그 로그에 씁니다. 먼저 실행되므로 로그는 사용자의 mod가 변경하기 전에 요청된 것을 기록합니다. `acme-guard/hooks/register.js`로 저장하세요:336이 정책 mod는 자체 코드에서 `$.process.run` 또는 `$.process.spawn`을 호출하는 모든 사용자 mod를 거부합니다. 또한 각 도구 호출과 mod가 쓰는 각 파일을 디버그 로그에 기록하여 감사 로그를 유지합니다. 가장 먼저 실행되므로, 로그에는 사용자 mod가 변경하기 전에 요청된 내용이 기록됩니다. 이를 `acme-guard/hooks/register.js`로 저장하십시오.
286 337
287```javascript acme-guard/hooks/register.js theme={null}338```javascript acme-guard/hooks/register.js theme={null}
288// 사용자의 mod가 호출할 수 없는 메서드, 각각 namespace.method로 철자339// The methods no user's mod may call, each spelled namespace.method
289const BLOCKED_CALLS = ['process.run', 'process.spawn']340const BLOCKED_CALLS = ['process.run', 'process.spawn']
290 341
291export function register(on) {342export function register(on) {
292 // 다른 mod가 로드되려고 할 때마다 실행됨343 // Runs each time another mod is about to load
293 on('plugin.register', async ($, e, next) => {344 on('plugin.register', async ($, e, next) => {
294 // 해당 mod의 코드에서 차단 목록에 있는 호출을 유지345 // Keep the calls in that mod's code that are on the blocked list
295 const blocked = e.uses.calls.filter((call) => BLOCKED_CALLS.includes(call))346 const blocked = e.uses.calls.filter((call) => BLOCKED_CALLS.includes(call))
296 if (e.tier === 'user' && blocked.length > 0) {347 if (e.tier === 'user' && blocked.length > 0) {
297 // 거부를 반환하면 mod가 로드되지 않으며 텍스트가 이유입니다348 // Returning refuse keeps the mod from loading, and the text is the reason
298 return { refuse: 'Acme policy: mods may not call ' + blocked.join(', ') }349 return { refuse: 'Acme policy: mods may not call ' + blocked.join(', ') }
299 }350 }
300 // 다른 모든 mod를 로드하도록 허용351 // Let every other mod load
301 return next(e)352 return next(e)
302 })353 })
303 354
304 // 각 도구 호출을 기록한 다음 변경되지 않은 상태로 진행355 // Record each tool call, then let it go ahead unchanged
305 on('tool.call', async ($, e, next) => {356 on('tool.call', async ($, e, next) => {
306 $.ui.log('audit tool.call ' + e.tool, { to: 'debug' })357 $.ui.log('audit tool.call ' + e.tool, { to: 'debug' })
307 return next(e)358 return next(e)
308 })359 })
309 360
310 // 파일을 쓴 mod를 기록한 다음 경로를 기록합니다. mod가 선택했으므로 인용됨361 // Record which mod wrote a file, then the path, quoted because the mod chose it
311 on('fs.write', async ($, e, next) => {362 on('fs.write', async ($, e, next) => {
312 $.ui.log('audit fs.write by ' + next.origin.plugin + ' ' + JSON.stringify(e.path), { to: 'debug' })363 $.ui.log('audit fs.write by ' + next.origin.plugin + ' ' + JSON.stringify(e.path), { to: 'debug' })
313 return next(e)364 return next(e)
315}366}
316```367```
317 368
318파일은 세 가지 hook을 등록합니다:369이 파일은 세 개의 훅을 등록합니다.
319 370
320* **`plugin.register`**: 다른 mod가 로드되는지 결정합니다. 차단된 메서드를 호출하는 사용자의 mod를 거부하고 다른 모든 mod를 전달합니다.371* **`plugin.register`**: 다른 mod의 로드 여부를 결정합니다. 차단된 메서드를 호출하는 사용자 mod를 거부하고 다른 모든 mod는 통과시킵니다.
321* **`tool.call`**: 각 도구 호출에 대해 `audit tool.call Bash`와 같은 줄을 디버그 로그에 쓰고 아무것도 변경하지 않습니다372* **`tool.call`**: 각 도구 호출에 대해 `audit tool.call Bash`와 같은 줄을 디버그 로그에 쓰며, 아무것도 변경하지 않습니다
322* **`fs.write`**: 다른 mod가 만드는 각 `$.fs.write` 호출에 대해 `audit fs.write by reader "/tmp/notes.md"`와 같은 줄을 씁니다. mod의 이름이 먼저 나오고 경로가 인용되므로 mod가 선택하는 경로는 줄의 다른 필드로 전달될 수 없습니다.373* **`fs.write`**: 다른 mod가 수행하는 각 `$.fs.write` 호출에 대해 `audit fs.write by reader "/tmp/notes.md"`와 같은 줄을 쓰며, 아무것도 변경하지 않습니다. mod의 이름이 먼저 오고 경로는 따옴표로 묶이므로, mod가 선택한 경로가 줄의 다른 필드로 위장할 수 없습니다.
323 374
324`plugin.register` hook은 이벤트의 두 필드를 읽습니다:375`plugin.register` 훅은 이벤트의 두 필드를 읽습니다.
325 376
326* **`e.tier`**: mod가 실행될 위치, `prepend`, `user`, `append`, `builtin` 중 하나입니다. 사람이 설치하는 모든 mod는 `user`입니다.377* **`e.tier`**: mod가 실행될 위치로, `prepend`, `user`, `append`, `builtin` 중 하나입니다. 사용자가 설치하는 모든 mod는 `user`입니다.
327* **`e.uses.calls`**: mod가 호출하는 mod API 메서드, 각각 `process.run`과 같이 `namespace.method`로 철자, `claude plugin validate`가 인쇄하는 `$.` 없음378* **`e.uses.calls`**: mod가 호출하는 mods API 메서드로, 각각 `process.run`과 같이 `namespace.method` 형식으로 작성되며 `claude plugin validate`가 출력하는 `$.`는 포함하지 않습니다
328 379
329사용자가 `$.process.run`을 호출하는 mod를 설치하면 mod가 로드되지 않으며 디버그 로그에는 `refused by acme-guard:`로 끝나고 이유가 있는 줄이 있습니다. 거부는 또한 [플러그인 디렉터리를 핫 리로드하는 세션](/docs/ko/plugins/mods/troubleshoot#find-out-why-a-mod-does-nothing)의 트랜스크립트에 도달합니다. 전체 mod를 거부하지 않고 호출을 차단하려면 해당 호출의 이름에 대한 hook에서 `{ deny: 'your reason' }`을 반환하세요.380사용자가 `$.process.run`을 호출하는 mod를 설치하면 해당 mod는 로드되지 않으며, 사용자의 디버그 로그에는 `refused by acme-guard:`와 지정한 사유로 끝나는 줄이 기록됩니다. 거부 내용은 [플러그인 디렉터리를 핫 리로드하는 세션](/docs/ko/plugins/mods/troubleshoot#find-out-why-a-mod-does-nothing)의 트랜스크립트에도 표시됩니다. mod 전체를 거부하지 않고 특정 호출만 차단하려면 해당 호출 이름에 대한 훅에서 `{ deny: 'your reason' }`을 반환하십시오.
330 381
331감사 줄을 디버그 로그 이외의 다른 곳으로 보내려면 동일한 hook에서 `$.http.fetch`를 호출하세요.382감사 로그 줄을 디버그 로그가 아닌 다른 곳으로 보내려면 같은 훅에서 `$.http.fetch`를 호출하십시오.
332 383
333세션은 mod 없이 실행될 수 있습니다. 설치된 mod를 실행하는 워커 스레드가 [3번 충돌](/docs/ko/plugins/mods/troubleshoot#mods-that-run-in-the-hooks-worker-are-off-for-this-session)하면 Claude Code는 기본 제공되지 않은 모든 mod(자신의 포함)를 언로드합니다. 사용자가 `/reload-plugins`를 실행하거나 새 세션을 시작할 때까지입니다. 그리고 `--safe-mode`로 Claude Code를 시작하는 사용자는 설치된 mod 없이 실행되며 자신의 mod도 포함됩니다.384세션은 조직의 mod 없이 실행될 수 있습니다. 설치된 mod를 실행하는 워커 스레드가 [세 번 충돌하면](/docs/ko/plugins/mods/troubleshoot#mods-that-run-in-the-hooks-worker-are-off-for-this-session), Claude Code는 사용자가 `/reload-plugins`를 실행하거나 새 세션을 시작할 때까지 조직의 mod를 포함하여 기본 제공되지 않는 모든 mod를 언로드합니다. 또한 `--safe-mode`로 Claude Code를 시작한 사용자는 조직의 mod를 포함하여 설치된 mod 없이 실행합니다.
334 385
335[mod 만들기](/docs/ko/plugins/mods/create)는 mod가 필요한 파일을 다룹니다. [다른 mod를 판단하는 mod 테스트](/docs/ko/plugins/mods/test#test-a-mod-that-judges-other-mods)는 이 정책 mod에 대한 테스트 파일을 가집니다.386[mod 만들기](/docs/ko/plugins/mods/create)에서 mod에 필요한 파일을 다룹니다. [정책 mod 테스트하기](/docs/ko/plugins/mods/test#test-a-mod-that-judges-other-mods)에는 이 정책 mod를 위한 테스트 파일이 있습니다.
336 387
337<h4 id="refuse-mods-when-your-check-fails">388<h4 id="refuse-mods-when-your-check-fails">
338 확인이 실패할 때 mod 거부389 검사가 실패할 때 mod 거부하기
339</h4>390</h4>
340 391
341`plugin.register` hook이 throw하거나 시간 제한을 초과하면 Claude Code는 hook을 건너뛰므로 확인이 열린 상태로 실패하고 확인 중인 mod가 로드됩니다. 닫힌 상태로 실패하고 사용자의 mod를 거부하려면 확인을 명명된 함수로 이동하고 거부를 반환하는 `.catch` 핸들러를 추가하세요. 이 파일 버전은 `plugin.register` hook만 표시하므로 첫 번째 버전의 두 감사 hook을 `register`에 유지하세요:392`plugin.register` 훅이 예외를 발생시키거나 시간 제한을 초과하면 Claude Code는 해당 훅을 건너뛰므로, 검사가 개방 상태로 실패하여 검사 중이던 mod가 로드됩니다. 폐쇄 상태로 실패하여 사용자 mod를 거부하려면 검사를 이름이 지정된 함수로 옮기고 거부를 반환하는 `.catch` 핸들러를 추가하십시오. 이 버전의 파일은 `plugin.register` 훅만 보여 주므로, 첫 번째 버전의 두 감사 훅은 `register`에 그대로 유지하십시오.
342 393
343```javascript acme-guard/hooks/register.js theme={null}394```javascript acme-guard/hooks/register.js theme={null}
344const BLOCKED_CALLS = ['process.run', 'process.spawn']395const BLOCKED_CALLS = ['process.run', 'process.spawn']
345 396
346// 이전과 동일한 확인, 자신의 함수로 이동됨397// The same check as before, moved into a function of its own
347async function checkMod($, e, next) {398async function checkMod($, e, next) {
348 const blocked = e.uses.calls.filter((call) => BLOCKED_CALLS.includes(call))399 const blocked = e.uses.calls.filter((call) => BLOCKED_CALLS.includes(call))
349 if (e.tier === 'user' && blocked.length > 0) {400 if (e.tier === 'user' && blocked.length > 0) {
353}404}
354 405
355export function register(on) {406export function register(on) {
356 // 핸들러는 checkMod가 throw하거나 시간 제한을 초과할 때만 실행됨407 // The handler runs only when checkMod throws or exceeds its time limit
357 on('plugin.register', checkMod).catch(async ($, e, next) => {408 on('plugin.register', checkMod).catch(async ($, e, next) => {
358 // 조직의 mod 및 기본 제공 mod를 로드하도록 허용409 // Let your organization's mods and built-in mods load
359 if (e.tier !== 'user') return next(e)410 if (e.tier !== 'user') return next(e)
360 // 확인할 수 없었던 사용자의 mod를 거부411 // Refuse the user's mod that couldn't be checked
361 return { refuse: 'Acme policy check failed, so this mod was not loaded' }412 return { refuse: 'Acme policy check failed, so this mod was not loaded' }
362 })413 })
363}414}
364```415```
365 416
366핸들러가 있으면 확인이 throw하거나 시간 초과될 때 확인 중인 mod가 로드되지 않으며 거부 줄은 두 번째 이유를 전달합니다. 예: `refused by acme-guard: Acme policy check failed, so this mod was not loaded`. 핸들러는 `user` 계층 외부의 모든 mod를 `next(e)`로 전달하므로 실패한 확인이 조직이 나열하는 mod를 중지하지 않습니다. [실패하는 hook 처리](/docs/ko/plugins/mods/events#handle-a-hook-that-fails)는 다른 이벤트에 대해 `.catch`를 다룹니다.417핸들러가 있으면 검사가 예외를 발생시키거나 시간 초과되었을 때 검사 중이던 mod는 로드되지 않으며, 거부 줄에는 `refused by acme-guard: Acme policy check failed, so this mod was not loaded`와 같이 두 번째 사유가 표시됩니다. 핸들러는 `user` 티어 외의 모든 mod를 `next(e)`로 전달하므로, 검사가 실패해도 조직이 나열한 mod는 중단되지 않습니다. 다른 이벤트에 대한 `.catch`는 [실패한 훅 처리하기](/docs/ko/plugins/mods/events#handle-a-hook-that-fails)에서 다룹니다.
367 418
368<h2 id="next-steps">419<h2 id="next-steps">
369 다음 단계420 다음 단계
370</h2>421</h2>
371 422
372* [플러그인 보안](/docs/ko/plugins/security): 모든 플러그인이 사용자의 머신에서 할 수 있는 것과 설치 전에 검토하는 방법423* [플러그인 보안](/docs/ko/plugins/security): 플러그인이 사용자의 컴퓨터에서 할 수 있는 작업과 설치 전에 플러그인을 검토하는 방법
373* [Mod 개요](/docs/ko/plugins/mods/overview): mod가 무엇이고 hook, skill, MCP 서버와 어떻게 비교되는지424* [Mod 개요](/docs/ko/plugins/mods/overview): mod의 정의와 훅, 스킬, MCP 서버와의 비교
374* [Mod가 실행되는 순서](/docs/ko/plugins/mods/events#the-order-mods-run-in): `prependPlugins` 및 `appendPlugins`가 사용자의 mod와 어떻게 맞는지425* [mod 실행 순서](/docs/ko/plugins/mods/events#the-order-mods-run-in): `prependPlugins`와 `appendPlugins`가 사용자의 mod와 어떻게 맞물리는지
375* [설정 및 환경 변수](/docs/ko/plugins/mods/reference#settings-and-environment-variables): 이 페이지에서 이름이 지정된 모든 설정을 한 표에서426* [설정 및 환경 변수](/docs/ko/plugins/mods/reference#settings-and-environment-variables): 이 페이지에서 언급된 모든 설정을 하나의 표로 정리