@kood/claude-code 0.6.6 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/dist/index.js +7 -1
  2. package/package.json +1 -1
  3. package/templates/.claude/agents/analyst.md +5 -0
  4. package/templates/.claude/agents/architect.md +5 -0
  5. package/templates/.claude/agents/build-fixer.md +1 -0
  6. package/templates/.claude/agents/code-reviewer.md +1 -0
  7. package/templates/.claude/agents/critic.md +4 -0
  8. package/templates/.claude/agents/deep-executor.md +1 -0
  9. package/templates/.claude/agents/dependency-manager.md +2 -0
  10. package/templates/.claude/agents/deployment-validator.md +2 -0
  11. package/templates/.claude/agents/designer.md +2 -0
  12. package/templates/.claude/agents/document-writer.md +3 -0
  13. package/templates/.claude/agents/explore.md +1 -0
  14. package/templates/.claude/agents/git-operator.md +2 -0
  15. package/templates/.claude/agents/implementation-executor.md +2 -0
  16. package/templates/.claude/agents/ko-to-en-translator.md +3 -0
  17. package/templates/.claude/agents/lint-fixer.md +2 -0
  18. package/templates/.claude/agents/planner.md +3 -0
  19. package/templates/.claude/agents/pm.md +349 -0
  20. package/templates/.claude/agents/qa-tester.md +1 -0
  21. package/templates/.claude/agents/refactor-advisor.md +4 -0
  22. package/templates/.claude/agents/researcher.md +9 -1
  23. package/templates/.claude/agents/scientist.md +1 -0
  24. package/templates/.claude/agents/security-reviewer.md +1 -0
  25. package/templates/.claude/agents/tdd-guide.md +1 -0
  26. package/templates/.claude/agents/vision.md +1 -0
  27. package/templates/.claude/instructions/agent-patterns/agent-teams-usage.md +376 -0
  28. package/templates/.claude/instructions/sourcing/reliable-search.md +49 -2
  29. package/templates/.claude/scripts/agent-teams/check-availability.sh +238 -0
  30. package/templates/.claude/scripts/agent-teams/setup-tmux.sh +125 -0
  31. package/templates/.claude/skills/agent-teams-setup/SKILL.md +460 -0
  32. package/templates/.claude/skills/brainstorm/SKILL.md +1 -0
  33. package/templates/.claude/skills/bug-fix/SKILL.md +1 -0
  34. package/templates/.claude/skills/crawler/SKILL.md +2 -0
  35. package/templates/.claude/skills/docs-creator/SKILL.md +1 -0
  36. package/templates/.claude/skills/docs-fetch/SKILL.md +6 -4
  37. package/templates/.claude/skills/docs-refactor/SKILL.md +1 -0
  38. package/templates/.claude/skills/elon-musk/SKILL.md +1 -0
  39. package/templates/.claude/skills/execute/SKILL.md +1 -0
  40. package/templates/.claude/skills/feedback/SKILL.md +1 -0
  41. package/templates/.claude/skills/figma-to-code/SKILL.md +1 -0
  42. package/templates/.claude/skills/genius-thinking/SKILL.md +1 -0
  43. package/templates/.claude/skills/global-uiux-design/SKILL.md +1 -0
  44. package/templates/.claude/skills/korea-uiux-design/SKILL.md +1 -0
  45. package/templates/.claude/skills/nextjs-react-best-practices/SKILL.md +1 -0
  46. package/templates/.claude/skills/plan/SKILL.md +1 -0
  47. package/templates/.claude/skills/prd/SKILL.md +1 -0
  48. package/templates/.claude/skills/project-optimizer/AGENTS.md +275 -0
  49. package/templates/.claude/skills/project-optimizer/SKILL.md +375 -0
  50. package/templates/.claude/skills/project-optimizer/rules/arch-config-centralize.md +66 -0
  51. package/templates/.claude/skills/project-optimizer/rules/arch-hot-path.md +35 -0
  52. package/templates/.claude/skills/project-optimizer/rules/arch-interface-segregation.md +51 -0
  53. package/templates/.claude/skills/project-optimizer/rules/arch-module-boundary.md +42 -0
  54. package/templates/.claude/skills/project-optimizer/rules/build-cache.md +57 -0
  55. package/templates/.claude/skills/project-optimizer/rules/build-code-split.md +56 -0
  56. package/templates/.claude/skills/project-optimizer/rules/build-incremental.md +65 -0
  57. package/templates/.claude/skills/project-optimizer/rules/build-minify.md +61 -0
  58. package/templates/.claude/skills/project-optimizer/rules/build-tree-shake.md +60 -0
  59. package/templates/.claude/skills/project-optimizer/rules/code-complexity.md +65 -0
  60. package/templates/.claude/skills/project-optimizer/rules/code-dead-elimination.md +32 -0
  61. package/templates/.claude/skills/project-optimizer/rules/code-duplication.md +54 -0
  62. package/templates/.claude/skills/project-optimizer/rules/code-error-handling.md +75 -0
  63. package/templates/.claude/skills/project-optimizer/rules/code-naming.md +52 -0
  64. package/templates/.claude/skills/project-optimizer/rules/concurrency-defer-await.md +54 -0
  65. package/templates/.claude/skills/project-optimizer/rules/concurrency-parallel.md +90 -0
  66. package/templates/.claude/skills/project-optimizer/rules/concurrency-pipeline.md +68 -0
  67. package/templates/.claude/skills/project-optimizer/rules/concurrency-pool.md +68 -0
  68. package/templates/.claude/skills/project-optimizer/rules/deps-lightweight-alt.md +37 -0
  69. package/templates/.claude/skills/project-optimizer/rules/deps-peer-align.md +44 -0
  70. package/templates/.claude/skills/project-optimizer/rules/deps-security-audit.md +45 -0
  71. package/templates/.claude/skills/project-optimizer/rules/deps-unused-removal.md +25 -0
  72. package/templates/.claude/skills/project-optimizer/rules/deps-version-pin.md +40 -0
  73. package/templates/.claude/skills/project-optimizer/rules/dx-ci-speed.md +47 -0
  74. package/templates/.claude/skills/project-optimizer/rules/dx-dev-server.md +35 -0
  75. package/templates/.claude/skills/project-optimizer/rules/dx-lint-config.md +36 -0
  76. package/templates/.claude/skills/project-optimizer/rules/dx-test-coverage.md +34 -0
  77. package/templates/.claude/skills/project-optimizer/rules/dx-type-safety.md +49 -0
  78. package/templates/.claude/skills/project-optimizer/rules/io-batch-queries.md +67 -0
  79. package/templates/.claude/skills/project-optimizer/rules/io-cache-layer.md +67 -0
  80. package/templates/.claude/skills/project-optimizer/rules/io-connection-reuse.md +67 -0
  81. package/templates/.claude/skills/project-optimizer/rules/io-serialize-minimal.md +61 -0
  82. package/templates/.claude/skills/project-optimizer/rules/io-stream.md +75 -0
  83. package/templates/.claude/skills/project-optimizer/rules/memory-bounded-cache.md +65 -0
  84. package/templates/.claude/skills/project-optimizer/rules/memory-large-data.md +64 -0
  85. package/templates/.claude/skills/project-optimizer/rules/memory-lazy-init.md +78 -0
  86. package/templates/.claude/skills/project-optimizer/rules/memory-leak-prevention.md +79 -0
  87. package/templates/.claude/skills/project-optimizer/rules/memory-pool-reuse.md +70 -0
  88. package/templates/.claude/skills/ralph/SKILL.md +1 -0
  89. package/templates/.claude/skills/refactor/SKILL.md +1 -0
  90. package/templates/.claude/skills/research/SKILL.md +1 -0
  91. package/templates/.claude/skills/sql-optimizer/SKILL.md +438 -0
  92. package/templates/.claude/skills/sql-optimizer/orm-patterns.md +218 -0
  93. package/templates/.claude/skills/startup-validator/SKILL.md +1 -0
  94. package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +53 -14
  95. package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +94 -27
  96. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +42 -19
  97. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-optimistic-updates.md +109 -0
  98. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-suspense-query.md +74 -0
  99. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-use-hook.md +81 -0
  100. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-react-compiler.md +81 -0
  101. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-beforeload-auth.md +121 -0
  102. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-file-conventions.md +104 -0
  103. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-link-navigation.md +119 -0
  104. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-nested-layouts.md +155 -0
  105. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-path-params.md +89 -0
  106. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-pending-component.md +110 -0
  107. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-preload-strategy.md +91 -0
  108. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-router-context.md +120 -0
  109. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-search-params.md +114 -0
  110. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +1 -1
  111. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-error-boundaries.md +79 -0
  112. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-middleware.md +85 -0
  113. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +56 -21
  114. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-streaming.md +84 -0
  115. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-validator.md +71 -0
  116. package/templates/.claude/skills/tauri-react-best-practices/AGENTS.md +527 -0
  117. package/templates/.claude/skills/tauri-react-best-practices/SKILL.md +571 -0
  118. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-barrel-imports.md +140 -0
  119. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-cargo-profile.md +96 -0
  120. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-frontend-treeshake.md +242 -0
  121. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-lazy-components.md +255 -0
  122. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-remove-unused-commands.md +160 -0
  123. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-ci-pipeline.md +269 -0
  124. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-signing.md +207 -0
  125. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-updater.md +226 -0
  126. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-async-commands.md +172 -0
  127. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-batch-commands.md +133 -0
  128. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-binary-response.md +198 -0
  129. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-channel-streaming.md +186 -0
  130. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-error-handling.md +250 -0
  131. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-type-safe.md +227 -0
  132. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-derived-state.md +231 -0
  133. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-functional-setstate.md +191 -0
  134. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-index-maps.md +276 -0
  135. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-lazy-state-init.md +196 -0
  136. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-lifecycle.md +265 -0
  137. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-mobile-compat.md +199 -0
  138. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-permission-scope.md +193 -0
  139. package/templates/.claude/skills/tauri-react-best-practices/rules/react-error-boundary.md +239 -0
  140. package/templates/.claude/skills/tauri-react-best-practices/rules/react-event-listener.md +151 -0
  141. package/templates/.claude/skills/tauri-react-best-practices/rules/react-file-src.md +155 -0
  142. package/templates/.claude/skills/tauri-react-best-practices/rules/react-invoke-hook.md +139 -0
  143. package/templates/.claude/skills/tauri-react-best-practices/rules/react-optimistic-update.md +211 -0
  144. package/templates/.claude/skills/tauri-react-best-practices/rules/security-capability-split.md +205 -0
  145. package/templates/.claude/skills/tauri-react-best-practices/rules/security-csp.md +207 -0
  146. package/templates/.claude/skills/tauri-react-best-practices/rules/security-least-privilege.md +106 -0
  147. package/templates/.claude/skills/tauri-react-best-practices/rules/security-no-wildcard.md +253 -0
  148. package/templates/.claude/skills/tauri-react-best-practices/rules/security-scope-paths.md +160 -0
  149. package/templates/.claude/skills/tauri-react-best-practices/rules/state-async-mutex.md +270 -0
  150. package/templates/.claude/skills/tauri-react-best-practices/rules/state-mutex-pattern.md +265 -0
  151. package/templates/.claude/skills/tauri-react-best-practices/rules/state-react-sync.md +375 -0
  152. package/templates/.claude/skills/tauri-react-best-practices/rules/state-single-container.md +275 -0
  153. package/templates/tanstack-start/docs/architecture.md +238 -167
  154. package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +777 -38
  155. package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +549 -37
  156. package/templates/tanstack-start/docs/library/tanstack-router/index.md +895 -111
  157. package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +641 -43
  158. package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +889 -38
  159. package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +891 -29
  160. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +972 -36
  161. package/templates/tanstack-start/docs/library/tanstack-start/index.md +1525 -881
  162. package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +1099 -20
  163. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +796 -30
  164. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +953 -35
  165. package/templates/tanstack-start/docs/library/tanstack-start/setup.md +371 -15
  166. package/templates/tauri/CLAUDE.md +189 -0
  167. package/templates/tauri/docs/guides/distribution.md +261 -0
  168. package/templates/tauri/docs/guides/getting-started.md +302 -0
  169. package/templates/tauri/docs/guides/mobile.md +288 -0
  170. package/templates/tauri/docs/library/tauri/index.md +510 -0
@@ -0,0 +1,106 @@
1
+ # 최소 권한 원칙
2
+
3
+ ## 왜 중요한가
4
+
5
+ Tauri 애플리케이션은 시스템 리소스 접근 시 최소 권한 원칙(Principle of Least Privilege)을 따라야 합니다. 필요한 커맨드만 명시적으로 허용하면 공격 표면을 최소화하고, 악의적인 코드나 XSS 공격으로부터 사용자를 보호할 수 있습니다. 와일드카드 권한은 예상치 못한 커맨드 실행을 허용하여 심각한 보안 취약점이 됩니다.
6
+
7
+ ## ❌ 잘못된 패턴
8
+
9
+ ```json
10
+ // src-tauri/capabilities/default.json
11
+ {
12
+ "$schema": "../gen/schemas/desktop-schema.json",
13
+ "identifier": "default",
14
+ "description": "모든 권한 허용",
15
+ "windows": ["main"],
16
+ "permissions": [
17
+ "core:default",
18
+ "shell:allow-*",
19
+ "fs:allow-*",
20
+ "http:allow-*"
21
+ ]
22
+ }
23
+ ```
24
+
25
+ **문제점:**
26
+ - `allow-*` 와일드카드는 해당 플러그인의 모든 커맨드를 허용
27
+ - XSS 공격 시 임의의 셸 명령어, 파일 시스템 접근, HTTP 요청 가능
28
+ - 악의적인 스크립트가 민감한 데이터 탈취 가능
29
+ - 의도하지 않은 시스템 변경 발생 가능
30
+
31
+ ## ✅ 올바른 패턴
32
+
33
+ ```json
34
+ // src-tauri/capabilities/default.json
35
+ {
36
+ "$schema": "../gen/schemas/desktop-schema.json",
37
+ "identifier": "default",
38
+ "description": "최소 권한만 허용",
39
+ "windows": ["main"],
40
+ "permissions": [
41
+ "core:default",
42
+ "core:window:allow-close",
43
+ "core:window:allow-minimize",
44
+ "shell:allow-open",
45
+ "fs:allow-read-text-file",
46
+ "fs:allow-write-text-file",
47
+ "http:allow-fetch",
48
+ "http:allow-fetch-cancel"
49
+ ]
50
+ }
51
+ ```
52
+
53
+ **장점:**
54
+ - 애플리케이션이 필요한 기능만 명시적으로 나열
55
+ - 각 권한의 목적과 사용처가 명확함
56
+ - 보안 감사 시 검토 범위가 제한적
57
+ - 공격자가 악용할 수 있는 경로가 제한됨
58
+
59
+ **추가 예시 (scope와 함께 사용):**
60
+
61
+ ```json
62
+ {
63
+ "$schema": "../gen/schemas/desktop-schema.json",
64
+ "identifier": "default",
65
+ "description": "문서 편집 앱",
66
+ "windows": ["main"],
67
+ "permissions": [
68
+ "core:default",
69
+ {
70
+ "identifier": "fs:allow-read-text-file",
71
+ "allow": [
72
+ { "path": "$DOCUMENT/*" }
73
+ ]
74
+ },
75
+ {
76
+ "identifier": "fs:allow-write-text-file",
77
+ "allow": [
78
+ { "path": "$DOCUMENT/*" }
79
+ ]
80
+ },
81
+ "shell:allow-open"
82
+ ]
83
+ }
84
+ ```
85
+
86
+ ## 추가 컨텍스트
87
+
88
+ **주요 플러그인별 일반적인 권한:**
89
+
90
+ | 플러그인 | 일반적으로 필요한 권한 | 위험한 권한 |
91
+ |---------|---------------------|-----------|
92
+ | `core` | `window:allow-close`, `window:allow-minimize` | `app:allow-app-hide` (남용 가능) |
93
+ | `shell` | `allow-open` (URL 열기) | `allow-execute` (임의 명령 실행) |
94
+ | `fs` | `allow-read-text-file`, `allow-write-text-file` | `allow-remove`, `allow-rename` |
95
+ | `http` | `allow-fetch`, `allow-fetch-cancel` | - (scope 필수) |
96
+
97
+ **권한 설계 체크리스트:**
98
+ 1. 각 권한이 실제로 사용되는지 확인 (미사용 권한 제거)
99
+ 2. 와일드카드 사용 금지 (`allow-*`, `deny-*`)
100
+ 3. 파일 시스템 권한은 scope와 함께 사용
101
+ 4. HTTP 권한은 URL 패턴으로 제한
102
+ 5. `shell:allow-execute`는 가급적 피하고, 필요하면 특정 바이너리만 허용
103
+
104
+ **참조:**
105
+ - [Tauri Security Best Practices](https://tauri.app/v2/security/)
106
+ - [Capability Configuration](https://tauri.app/v2/core/capability/)
@@ -0,0 +1,253 @@
1
+ # 와일드카드 권한/경로 사용 금지
2
+
3
+ ## 왜 중요한가
4
+
5
+ 와일드카드(`*`)는 "모든 것"을 의미하며, 보안 정책에서 사용하면 예상치 못한 권한을 부여하게 됩니다. Tauri에서 와일드카드는 커맨드 권한(`allow: ["*"]`), 파일 경로(`path: "/*"`), HTTP URL(`urls: ["*"]`) 등 여러 곳에서 사용할 수 있지만, 모두 공격 표면을 크게 확대합니다. 명시적인 화이트리스트 방식을 사용하면 의도하지 않은 접근을 원천 차단할 수 있습니다.
6
+
7
+ ## ❌ 잘못된 패턴
8
+
9
+ ```json
10
+ // src-tauri/capabilities/default.json
11
+ {
12
+ "permissions": [
13
+ "shell:allow-*",
14
+ "fs:allow-*",
15
+ {
16
+ "identifier": "fs:allow-read-text-file",
17
+ "allow": [
18
+ { "path": "/*" }
19
+ ]
20
+ },
21
+ {
22
+ "identifier": "http:allow-fetch",
23
+ "allow": [
24
+ { "url": "*" }
25
+ ]
26
+ }
27
+ ]
28
+ }
29
+ ```
30
+
31
+ ```json
32
+ // tauri.conf.json
33
+ {
34
+ "app": {
35
+ "security": {
36
+ "assetProtocol": {
37
+ "scope": ["*"]
38
+ }
39
+ }
40
+ }
41
+ }
42
+ ```
43
+
44
+ **문제점:**
45
+ - `shell:allow-*`: 모든 셸 커맨드 실행 가능 (`execute`, `open`, `kill` 등)
46
+ - `fs:allow-*`: 모든 파일 시스템 작업 가능 (`remove`, `rename`, `mkdir` 등)
47
+ - `path: "/*"`: 시스템의 모든 파일 접근 가능
48
+ - `url: "*"`: 모든 도메인으로 HTTP 요청 가능 (SSRF 취약점)
49
+ - `scope: ["*"]`: 앱 리소스 보호 우회 가능
50
+
51
+ **공격 시나리오:**
52
+ 1. XSS 공격으로 악의적인 JavaScript 주입
53
+ 2. `shell:allow-execute`로 시스템 명령 실행 (`rm -rf /`, `curl http://attacker.com`)
54
+ 3. `fs:allow-*`로 민감한 파일 읽기 (`~/.ssh/id_rsa`, `~/.aws/credentials`)
55
+ 4. `http:allow-fetch`로 내부 네트워크 스캔 (SSRF)
56
+
57
+ ## ✅ 올바른 패턴
58
+
59
+ ```json
60
+ // src-tauri/capabilities/default.json
61
+ {
62
+ "permissions": [
63
+ "shell:allow-open",
64
+ "fs:allow-read-text-file",
65
+ "fs:allow-write-text-file",
66
+ {
67
+ "identifier": "fs:allow-read-text-file",
68
+ "allow": [
69
+ { "path": "$APPDATA/my-app/*.json" },
70
+ { "path": "$DOCUMENT/*.txt" }
71
+ ]
72
+ },
73
+ {
74
+ "identifier": "http:allow-fetch",
75
+ "allow": [
76
+ { "url": "https://api.example.com/*" },
77
+ { "url": "https://cdn.example.com/assets/*" }
78
+ ]
79
+ }
80
+ ]
81
+ }
82
+ ```
83
+
84
+ ```json
85
+ // tauri.conf.json
86
+ {
87
+ "app": {
88
+ "security": {
89
+ "assetProtocol": {
90
+ "scope": [
91
+ "$APPDATA/my-app/public/**",
92
+ "$RESOURCE/**"
93
+ ]
94
+ }
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ **장점:**
101
+ - 각 권한이 명시적으로 나열되어 있음
102
+ - 파일 경로가 앱 데이터 디렉토리로 제한됨
103
+ - HTTP 요청이 신뢰할 수 있는 도메인으로만 가능
104
+ - 보안 감사 시 검토 범위가 명확함
105
+ - 공격자가 악용할 수 있는 경로가 제한됨
106
+
107
+ **추가 예시 (점진적 권한 추가):**
108
+
109
+ ```json
110
+ // Phase 1: 최소 권한으로 시작
111
+ {
112
+ "permissions": [
113
+ "core:default",
114
+ "shell:allow-open"
115
+ ]
116
+ }
117
+
118
+ // Phase 2: 기능 추가 시 필요한 권한만 추가
119
+ {
120
+ "permissions": [
121
+ "core:default",
122
+ "shell:allow-open",
123
+ {
124
+ "identifier": "fs:allow-read-text-file",
125
+ "allow": [{ "path": "$APPDATA/my-app/config.json" }]
126
+ }
127
+ ]
128
+ }
129
+
130
+ // Phase 3: 새 기능 추가
131
+ {
132
+ "permissions": [
133
+ "core:default",
134
+ "shell:allow-open",
135
+ {
136
+ "identifier": "fs:allow-read-text-file",
137
+ "allow": [
138
+ { "path": "$APPDATA/my-app/config.json" },
139
+ { "path": "$DOCUMENT/exports/*.csv" }
140
+ ]
141
+ },
142
+ {
143
+ "identifier": "http:allow-fetch",
144
+ "allow": [{ "url": "https://api.example.com/v1/*" }]
145
+ }
146
+ ]
147
+ }
148
+ ```
149
+
150
+ ## 추가 컨텍스트
151
+
152
+ **와일드카드 사용이 허용되는 경우:**
153
+
154
+ 1. **하위 경로 매칭 (권장)**
155
+ ```json
156
+ // ✅ 특정 디렉토리 내부만
157
+ { "path": "$APPDATA/my-app/*" }
158
+ { "url": "https://api.example.com/v1/*" }
159
+ ```
160
+
161
+ 2. **파일 확장자 매칭 (권장)**
162
+ ```json
163
+ // ✅ 특정 파일 타입만
164
+ { "path": "$DOCUMENT/*.{txt,md,json}" }
165
+ ```
166
+
167
+ 3. **절대 금지되는 와일드카드**
168
+ ```json
169
+ // ❌ 루트부터 전체 허용
170
+ { "path": "/*" }
171
+ { "path": "$HOME/*" }
172
+ { "url": "*" }
173
+ "shell:allow-*"
174
+ "fs:allow-*"
175
+ ```
176
+
177
+ **보안 감사 체크리스트:**
178
+
179
+ 아래 명령어로 프로젝트 내 와일드카드 사용을 찾아 수정하세요:
180
+
181
+ ```bash
182
+ # capabilities 파일에서 와일드카드 찾기
183
+ rg '"allow-\*"' src-tauri/capabilities/
184
+ rg '"path": "/\*"' src-tauri/capabilities/
185
+ rg '"url": "\*"' src-tauri/capabilities/
186
+
187
+ # tauri.conf.json에서 와일드카드 찾기
188
+ rg '"scope": \[.*"\*".*\]' src-tauri/tauri.conf.json
189
+ ```
190
+
191
+ **체크리스트:**
192
+
193
+ - [ ] `shell:allow-*` 사용 안 함
194
+ - [ ] `fs:allow-*` 사용 안 함
195
+ - [ ] `path: "/*"` 또는 `$HOME/*` 사용 안 함
196
+ - [ ] HTTP `url: "*"` 사용 안 함
197
+ - [ ] `assetProtocol.scope` 에 `"*"` 사용 안 함
198
+ - [ ] 모든 권한이 명시적으로 나열됨
199
+ - [ ] 각 권한의 필요성을 문서화함
200
+
201
+ **점진적 권한 추가 프로세스:**
202
+
203
+ 1. **최소 권한으로 시작**
204
+ ```json
205
+ { "permissions": ["core:default"] }
206
+ ```
207
+
208
+ 2. **기능 구현 시 필요한 권한만 추가**
209
+ ```typescript
210
+ // 컴파일 에러 또는 런타임 에러 발생
211
+ // -> 필요한 권한 추가
212
+ ```
213
+
214
+ 3. **주기적 권한 감사**
215
+ ```bash
216
+ # 사용되지 않는 권한 찾기
217
+ rg "invoke\(" src/ # 호출되는 Tauri 커맨드 목록
218
+ # capabilities/와 비교하여 미사용 권한 제거
219
+ ```
220
+
221
+ **일반적인 권한 오용 패턴:**
222
+
223
+ | 잘못된 패턴 | 올바른 패턴 | 이유 |
224
+ |-----------|-----------|------|
225
+ | `shell:allow-*` | `shell:allow-open` | URL 열기만 필요 |
226
+ | `fs:allow-*` | `fs:allow-read-text-file` + scope | 특정 파일만 읽기 |
227
+ | `path: "/*"` | `path: "$APPDATA/my-app/*"` | 앱 데이터만 접근 |
228
+ | `url: "*"` | `url: "https://api.example.com/*"` | 특정 API만 호출 |
229
+ | `"windows": ["*"]` | `"windows": ["main", "settings"]` | 필요한 윈도우만 |
230
+
231
+ **보안 경고 예시:**
232
+
233
+ ```json
234
+ // ⚠️ 이 설정은 보안 감사에서 탈락함
235
+ {
236
+ "permissions": [
237
+ "shell:allow-*", // 🚨 Critical: 임의 명령 실행 가능
238
+ {
239
+ "identifier": "fs:allow-read-text-file",
240
+ "allow": [{ "path": "/*" }] // 🚨 Critical: 전체 파일 시스템 접근
241
+ },
242
+ {
243
+ "identifier": "http:allow-fetch",
244
+ "allow": [{ "url": "*" }] // 🚨 High: SSRF 취약점
245
+ }
246
+ ]
247
+ }
248
+ ```
249
+
250
+ **참조:**
251
+ - [Tauri Security Best Practices](https://tauri.app/v2/security/)
252
+ - [Principle of Least Privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)
253
+ - [OWASP API Security](https://owasp.org/www-project-api-security/)
@@ -0,0 +1,160 @@
1
+ # 파일 경로 Scope 제한
2
+
3
+ ## 왜 중요한가
4
+
5
+ Tauri의 파일 시스템 권한은 기본적으로 전체 시스템에 접근할 수 있습니다. Scope를 사용하여 접근 가능한 경로를 명시적으로 제한하면, 악의적인 코드나 프로그래밍 오류로 인한 민감한 파일(비밀번호, SSH 키, 시스템 설정 등) 접근을 방지할 수 있습니다. `deny` 리스트를 활용하면 특정 하위 경로를 추가로 차단할 수 있습니다.
6
+
7
+ ## ❌ 잘못된 패턴
8
+
9
+ ```json
10
+ // src-tauri/capabilities/default.json
11
+ {
12
+ "permissions": [
13
+ {
14
+ "identifier": "fs:allow-read-text-file",
15
+ "allow": [
16
+ { "path": "/*" }
17
+ ]
18
+ },
19
+ {
20
+ "identifier": "fs:allow-write-text-file",
21
+ "allow": [
22
+ { "path": "$HOME/*" }
23
+ ]
24
+ }
25
+ ]
26
+ }
27
+ ```
28
+
29
+ **문제점:**
30
+ - `path: "/*"`는 전체 파일 시스템 읽기 허용
31
+ - `$HOME/*`는 사용자 홈 디렉토리 전체를 쓰기 가능하게 함
32
+ - `.ssh/`, `.gnupg/`, `.aws/` 등 민감한 디렉토리 접근 가능
33
+ - 브라우저 비밀번호, 쿠키 파일 등 개인정보 유출 위험
34
+
35
+ ## ✅ 올바른 패턴
36
+
37
+ ```json
38
+ // src-tauri/capabilities/default.json
39
+ {
40
+ "permissions": [
41
+ {
42
+ "identifier": "fs:allow-read-text-file",
43
+ "allow": [
44
+ { "path": "$APPDATA/my-app/*" },
45
+ { "path": "$DOCUMENT/*.txt" },
46
+ { "path": "$DOCUMENT/*.json" }
47
+ ],
48
+ "deny": [
49
+ { "path": "$APPDATA/my-app/secrets/*" }
50
+ ]
51
+ },
52
+ {
53
+ "identifier": "fs:allow-write-text-file",
54
+ "allow": [
55
+ { "path": "$APPDATA/my-app/config.json" },
56
+ { "path": "$DOCUMENT/exports/*.txt" }
57
+ ]
58
+ }
59
+ ]
60
+ }
61
+ ```
62
+
63
+ **장점:**
64
+ - 애플리케이션 데이터 디렉토리와 문서 폴더만 접근 가능
65
+ - 파일 확장자로 추가 제한 (`.txt`, `.json`만 허용)
66
+ - `deny` 리스트로 민감한 하위 폴더 차단
67
+ - 사용자의 다른 데이터는 완전히 보호됨
68
+
69
+ **추가 예시 (임시 파일 처리):**
70
+
71
+ ```json
72
+ {
73
+ "permissions": [
74
+ {
75
+ "identifier": "fs:allow-read-text-file",
76
+ "allow": [
77
+ { "path": "$TEMP/my-app-*.tmp" }
78
+ ]
79
+ },
80
+ {
81
+ "identifier": "fs:allow-remove",
82
+ "allow": [
83
+ { "path": "$TEMP/my-app-*.tmp" }
84
+ ]
85
+ }
86
+ ]
87
+ }
88
+ ```
89
+
90
+ ## 추가 컨텍스트
91
+
92
+ **Tauri 환경 변수 목록:**
93
+
94
+ | 변수 | 설명 | macOS 경로 예시 | Windows 경로 예시 |
95
+ |------|------|----------------|------------------|
96
+ | `$APPDATA` | 앱 데이터 디렉토리 | `~/Library/Application Support` | `%APPDATA%` |
97
+ | `$APPLOCALDATA` | 로컬 앱 데이터 | `~/Library/Application Support` | `%LOCALAPPDATA%` |
98
+ | `$APPCONFIG` | 앱 설정 디렉토리 | `~/Library/Application Support` | `%APPDATA%` |
99
+ | `$APPLOG` | 로그 디렉토리 | `~/Library/Logs` | `%LOCALAPPDATA%` |
100
+ | `$APPCACHE` | 캐시 디렉토리 | `~/Library/Caches` | `%LOCALAPPDATA%\cache` |
101
+ | `$DOCUMENT` | 사용자 문서 폴더 | `~/Documents` | `%USERPROFILE%\Documents` |
102
+ | `$DOWNLOAD` | 다운로드 폴더 | `~/Downloads` | `%USERPROFILE%\Downloads` |
103
+ | `$PICTURE` | 사진 폴더 | `~/Pictures` | `%USERPROFILE%\Pictures` |
104
+ | `$DESKTOP` | 데스크톱 | `~/Desktop` | `%USERPROFILE%\Desktop` |
105
+ | `$HOME` | 홈 디렉토리 | `~` | `%USERPROFILE%` |
106
+ | `$TEMP` | 임시 파일 디렉토리 | `/tmp` | `%TEMP%` |
107
+ | `$RESOURCE` | 앱 리소스 (읽기 전용) | 앱 번들 내부 | 앱 설치 디렉토리 |
108
+
109
+ **Scope 설계 가이드라인:**
110
+
111
+ 1. **가장 구체적인 경로 사용**
112
+ ```json
113
+ // ❌ 너무 광범위
114
+ { "path": "$APPDATA/*" }
115
+
116
+ // ✅ 앱 전용 하위 디렉토리
117
+ { "path": "$APPDATA/my-app/*" }
118
+ ```
119
+
120
+ 2. **파일 확장자로 제한**
121
+ ```json
122
+ // 특정 파일 타입만 허용
123
+ { "path": "$DOCUMENT/*.pdf" }
124
+ { "path": "$DOCUMENT/*.{txt,md,json}" }
125
+ ```
126
+
127
+ 3. **Deny 리스트 활용**
128
+ ```json
129
+ {
130
+ "allow": [{ "path": "$APPDATA/my-app/*" }],
131
+ "deny": [
132
+ { "path": "$APPDATA/my-app/.env" },
133
+ { "path": "$APPDATA/my-app/tokens/*" }
134
+ ]
135
+ }
136
+ ```
137
+
138
+ 4. **읽기/쓰기 권한 분리**
139
+ ```json
140
+ // 읽기는 넓게, 쓰기는 좁게
141
+ {
142
+ "identifier": "fs:allow-read-text-file",
143
+ "allow": [{ "path": "$DOCUMENT/*" }]
144
+ },
145
+ {
146
+ "identifier": "fs:allow-write-text-file",
147
+ "allow": [{ "path": "$DOCUMENT/exports/*" }]
148
+ }
149
+ ```
150
+
151
+ **보안 체크리스트:**
152
+ - [ ] `path: "/*"` 또는 `$HOME/*` 사용하지 않음
153
+ - [ ] 앱 전용 서브디렉토리 사용 (`$APPDATA/my-app/`)
154
+ - [ ] 파일 확장자로 추가 제한
155
+ - [ ] 민감한 경로는 `deny` 리스트에 명시
156
+ - [ ] 읽기/쓰기 권한을 분리하여 최소화
157
+
158
+ **참조:**
159
+ - [Tauri File System Scope](https://tauri.app/v2/core/capability/#file-system-scope)
160
+ - [Path Variables Reference](https://tauri.app/v2/guides/filesystem/)