timsquad 2.0.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 (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -0
  3. package/bin/tsq.js +6 -0
  4. package/dist/commands/feedback.d.ts +3 -0
  5. package/dist/commands/feedback.d.ts.map +1 -0
  6. package/dist/commands/feedback.js +142 -0
  7. package/dist/commands/feedback.js.map +1 -0
  8. package/dist/commands/full.d.ts +3 -0
  9. package/dist/commands/full.d.ts.map +1 -0
  10. package/dist/commands/full.js +87 -0
  11. package/dist/commands/full.js.map +1 -0
  12. package/dist/commands/git/commit.d.ts +3 -0
  13. package/dist/commands/git/commit.d.ts.map +1 -0
  14. package/dist/commands/git/commit.js +88 -0
  15. package/dist/commands/git/commit.js.map +1 -0
  16. package/dist/commands/git/index.d.ts +5 -0
  17. package/dist/commands/git/index.d.ts.map +1 -0
  18. package/dist/commands/git/index.js +5 -0
  19. package/dist/commands/git/index.js.map +1 -0
  20. package/dist/commands/git/pr.d.ts +3 -0
  21. package/dist/commands/git/pr.d.ts.map +1 -0
  22. package/dist/commands/git/pr.js +138 -0
  23. package/dist/commands/git/pr.js.map +1 -0
  24. package/dist/commands/git/release.d.ts +3 -0
  25. package/dist/commands/git/release.d.ts.map +1 -0
  26. package/dist/commands/git/release.js +158 -0
  27. package/dist/commands/git/release.js.map +1 -0
  28. package/dist/commands/git/sync.d.ts +3 -0
  29. package/dist/commands/git/sync.d.ts.map +1 -0
  30. package/dist/commands/git/sync.js +132 -0
  31. package/dist/commands/git/sync.js.map +1 -0
  32. package/dist/commands/init.d.ts +3 -0
  33. package/dist/commands/init.d.ts.map +1 -0
  34. package/dist/commands/init.js +150 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/log.d.ts +3 -0
  37. package/dist/commands/log.d.ts.map +1 -0
  38. package/dist/commands/log.js +271 -0
  39. package/dist/commands/log.js.map +1 -0
  40. package/dist/commands/metrics.d.ts +3 -0
  41. package/dist/commands/metrics.d.ts.map +1 -0
  42. package/dist/commands/metrics.js +299 -0
  43. package/dist/commands/metrics.js.map +1 -0
  44. package/dist/commands/quick.d.ts +3 -0
  45. package/dist/commands/quick.d.ts.map +1 -0
  46. package/dist/commands/quick.js +136 -0
  47. package/dist/commands/quick.js.map +1 -0
  48. package/dist/commands/retro.d.ts +3 -0
  49. package/dist/commands/retro.d.ts.map +1 -0
  50. package/dist/commands/retro.js +280 -0
  51. package/dist/commands/retro.js.map +1 -0
  52. package/dist/commands/status.d.ts +3 -0
  53. package/dist/commands/status.d.ts.map +1 -0
  54. package/dist/commands/status.js +127 -0
  55. package/dist/commands/status.js.map +1 -0
  56. package/dist/commands/watch.d.ts +3 -0
  57. package/dist/commands/watch.d.ts.map +1 -0
  58. package/dist/commands/watch.js +213 -0
  59. package/dist/commands/watch.js.map +1 -0
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +50 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/lib/config.d.ts +34 -0
  65. package/dist/lib/config.d.ts.map +1 -0
  66. package/dist/lib/config.js +108 -0
  67. package/dist/lib/config.js.map +1 -0
  68. package/dist/lib/project.d.ts +47 -0
  69. package/dist/lib/project.d.ts.map +1 -0
  70. package/dist/lib/project.js +191 -0
  71. package/dist/lib/project.js.map +1 -0
  72. package/dist/lib/template.d.ts +33 -0
  73. package/dist/lib/template.d.ts.map +1 -0
  74. package/dist/lib/template.js +151 -0
  75. package/dist/lib/template.js.map +1 -0
  76. package/dist/types/config.d.ts +75 -0
  77. package/dist/types/config.d.ts.map +1 -0
  78. package/dist/types/config.js +66 -0
  79. package/dist/types/config.js.map +1 -0
  80. package/dist/types/feedback.d.ts +59 -0
  81. package/dist/types/feedback.d.ts.map +1 -0
  82. package/dist/types/feedback.js +26 -0
  83. package/dist/types/feedback.js.map +1 -0
  84. package/dist/types/index.d.ts +4 -0
  85. package/dist/types/index.d.ts.map +1 -0
  86. package/dist/types/index.js +5 -0
  87. package/dist/types/index.js.map +1 -0
  88. package/dist/types/project.d.ts +89 -0
  89. package/dist/types/project.d.ts.map +1 -0
  90. package/dist/types/project.js +44 -0
  91. package/dist/types/project.js.map +1 -0
  92. package/dist/utils/colors.d.ts +30 -0
  93. package/dist/utils/colors.d.ts.map +1 -0
  94. package/dist/utils/colors.js +54 -0
  95. package/dist/utils/colors.js.map +1 -0
  96. package/dist/utils/date.d.ts +25 -0
  97. package/dist/utils/date.d.ts.map +1 -0
  98. package/dist/utils/date.js +65 -0
  99. package/dist/utils/date.js.map +1 -0
  100. package/dist/utils/fs.d.ts +49 -0
  101. package/dist/utils/fs.d.ts.map +1 -0
  102. package/dist/utils/fs.js +84 -0
  103. package/dist/utils/fs.js.map +1 -0
  104. package/dist/utils/prompts.d.ts +31 -0
  105. package/dist/utils/prompts.d.ts.map +1 -0
  106. package/dist/utils/prompts.js +95 -0
  107. package/dist/utils/prompts.js.map +1 -0
  108. package/dist/utils/yaml.d.ts +21 -0
  109. package/dist/utils/yaml.d.ts.map +1 -0
  110. package/dist/utils/yaml.js +40 -0
  111. package/dist/utils/yaml.js.map +1 -0
  112. package/package.json +71 -0
  113. package/templates/common/CLAUDE.md.template +254 -0
  114. package/templates/common/claude/agents/tsq-dba.md +290 -0
  115. package/templates/common/claude/agents/tsq-designer.md +304 -0
  116. package/templates/common/claude/agents/tsq-developer.md +118 -0
  117. package/templates/common/claude/agents/tsq-planner.md +90 -0
  118. package/templates/common/claude/agents/tsq-prompter.md +336 -0
  119. package/templates/common/claude/agents/tsq-qa.md +134 -0
  120. package/templates/common/claude/agents/tsq-retro.md +168 -0
  121. package/templates/common/claude/agents/tsq-security.md +190 -0
  122. package/templates/common/claude/skills/architecture/SKILL.md +123 -0
  123. package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
  124. package/templates/common/claude/skills/coding/SKILL.md +171 -0
  125. package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
  126. package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
  127. package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
  128. package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
  129. package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
  130. package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
  131. package/templates/common/claude/skills/planning/SKILL.md +90 -0
  132. package/templates/common/claude/skills/security/SKILL.md +234 -0
  133. package/templates/common/claude/skills/testing/SKILL.md +146 -0
  134. package/templates/common/claude/skills/typescript/SKILL.md +435 -0
  135. package/templates/common/config.template.yaml +131 -0
  136. package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
  137. package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
  138. package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
  139. package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
  140. package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
  141. package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
  142. package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
  143. package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
  144. package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
  145. package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
  146. package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
  147. package/templates/common/timsquad/generators/data-design.xml +290 -0
  148. package/templates/common/timsquad/generators/prd.xml +280 -0
  149. package/templates/common/timsquad/generators/requirements.xml +220 -0
  150. package/templates/common/timsquad/generators/service-spec.xml +266 -0
  151. package/templates/common/timsquad/logs/_example.md +81 -0
  152. package/templates/common/timsquad/logs/_template.md +46 -0
  153. package/templates/common/timsquad/patterns/cqrs.xml +127 -0
  154. package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
  155. package/templates/common/timsquad/patterns/repository.xml +64 -0
  156. package/templates/common/timsquad/process/state-machine.xml +343 -0
  157. package/templates/common/timsquad/process/validation-rules.xml +308 -0
  158. package/templates/common/timsquad/process/workflow-base.xml +202 -0
  159. package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
  160. package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
  161. package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
  162. package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
  163. package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
  164. package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
  165. package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
  166. package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
  167. package/templates/common/timsquad/ssot/data-design.template.md +132 -0
  168. package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
  169. package/templates/common/timsquad/ssot/env-config.template.md +346 -0
  170. package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
  171. package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
  172. package/templates/common/timsquad/ssot/glossary.template.md +148 -0
  173. package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
  174. package/templates/common/timsquad/ssot/planning.template.md +94 -0
  175. package/templates/common/timsquad/ssot/prd.template.md +102 -0
  176. package/templates/common/timsquad/ssot/requirements.template.md +117 -0
  177. package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
  178. package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
  179. package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
  180. package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
  181. package/templates/common/timsquad/state/workspace.xml +217 -0
@@ -0,0 +1,309 @@
1
+ ---
2
+ title: "보안 명세서 (Security Specification)"
3
+ version: 1.0.0
4
+ last_updated: {{DATE}}
5
+ author: tsq-security
6
+ status: draft
7
+ project: {{PROJECT_NAME}}
8
+ required_level: 3
9
+ ---
10
+
11
+ # 보안 명세서 (Security Specification)
12
+
13
+ > 시스템의 보안 요구사항, 인증/인가, 데이터 보호 정책을 정의합니다.
14
+ > Level 3 (Enterprise) 및 fintech 타입 프로젝트 필수 문서입니다.
15
+
16
+ ---
17
+
18
+ ## 1. 보안 개요
19
+
20
+ ### 1.1 보안 원칙
21
+
22
+ | 원칙 | 설명 | 적용 |
23
+ |-----|------|------|
24
+ | 최소 권한 | 필요한 최소한의 권한만 부여 | RBAC, API 권한 |
25
+ | 심층 방어 | 다계층 보안 적용 | 네트워크, 앱, DB |
26
+ | 안전한 기본값 | 기본 설정이 안전해야 함 | 비활성화된 기능 |
27
+ | 실패 안전 | 실패 시 안전한 상태로 | 에러 처리 |
28
+ | 개방형 설계 | 알고리즘은 공개, 키만 비밀 | 표준 암호화 |
29
+
30
+ ### 1.2 위협 모델 (STRIDE)
31
+
32
+ | 위협 | 설명 | 대응 |
33
+ |-----|------|------|
34
+ | **S**poofing | 신원 위조 | 강력한 인증 |
35
+ | **T**ampering | 데이터 변조 | 무결성 검증 |
36
+ | **R**epudiation | 부인 | 감사 로그 |
37
+ | **I**nformation Disclosure | 정보 유출 | 암호화 |
38
+ | **D**enial of Service | 서비스 거부 | Rate Limiting |
39
+ | **E**levation of Privilege | 권한 상승 | 권한 검증 |
40
+
41
+ ---
42
+
43
+ ## 2. 인증 (Authentication)
44
+
45
+ ### 2.1 인증 방식
46
+
47
+ | 방식 | 용도 | 구현 |
48
+ |-----|------|------|
49
+ | JWT | API 인증 | Access Token + Refresh Token |
50
+ | Session | 웹 세션 (선택) | Redis 기반 |
51
+ | API Key | 서버 간 통신 | 헤더 기반 |
52
+ | OAuth 2.0 | 소셜 로그인 | Google, Apple 등 |
53
+
54
+ ### 2.2 JWT 설정
55
+
56
+ | 항목 | 값 | 비고 |
57
+ |-----|-----|------|
58
+ | Algorithm | RS256 | 비대칭 키 사용 |
59
+ | Access Token 만료 | 15분 | 짧게 유지 |
60
+ | Refresh Token 만료 | 7일 | Rotate on use |
61
+ | Issuer | `{{PROJECT_NAME}}` | 검증 필수 |
62
+ | Audience | `{{PROJECT_NAME}}-api` | 검증 필수 |
63
+
64
+ ### 2.3 비밀번호 정책
65
+
66
+ | 정책 | 요구사항 |
67
+ |-----|---------|
68
+ | 최소 길이 | 8자 이상 |
69
+ | 복잡도 | 대문자 + 소문자 + 숫자 + 특수문자 |
70
+ | 해싱 | bcrypt (cost factor: 12) |
71
+ | 재사용 금지 | 최근 5개 비밀번호 |
72
+ | 만료 | 90일 (선택적) |
73
+
74
+ ### 2.4 다중 인증 (MFA)
75
+
76
+ | 방식 | 지원 | 필수 조건 |
77
+ |-----|:----:|----------|
78
+ | TOTP | ✅ | 관리자 계정 |
79
+ | SMS | ⚠️ | 대체 수단으로만 |
80
+ | Email | ✅ | 계정 복구 |
81
+
82
+ ### 2.5 계정 보호
83
+
84
+ | 정책 | 설정 |
85
+ |-----|------|
86
+ | 로그인 실패 잠금 | 5회 실패 시 30분 잠금 |
87
+ | 비정상 접근 감지 | 새 기기/위치 알림 |
88
+ | 세션 관리 | 동시 세션 제한 (5개) |
89
+
90
+ ---
91
+
92
+ ## 3. 인가 (Authorization)
93
+
94
+ ### 3.1 RBAC (Role-Based Access Control)
95
+
96
+ | 역할 | 설명 | 권한 |
97
+ |-----|------|------|
98
+ | GUEST | 비인증 사용자 | 공개 리소스만 |
99
+ | USER | 일반 사용자 | 본인 리소스 CRUD |
100
+ | MANAGER | 관리자 | 팀 리소스 관리 |
101
+ | ADMIN | 시스템 관리자 | 전체 시스템 관리 |
102
+ | SUPER_ADMIN | 최고 관리자 | 모든 권한 |
103
+
104
+ ### 3.2 권한 매트릭스
105
+
106
+ | 리소스 | GUEST | USER | MANAGER | ADMIN |
107
+ |-------|:-----:|:----:|:-------:|:-----:|
108
+ | 공개 데이터 | R | R | R | CRUD |
109
+ | 본인 프로필 | - | RU | RU | CRUD |
110
+ | 타인 프로필 | - | - | R | CRUD |
111
+ | 시스템 설정 | - | - | - | RU |
112
+ | 사용자 관리 | - | - | R | CRUD |
113
+
114
+ ### 3.3 API 권한
115
+
116
+ | 엔드포인트 | 필요 권한 | 추가 조건 |
117
+ |-----------|----------|----------|
118
+ | `GET /api/public/*` | 없음 | - |
119
+ | `GET /api/users/me` | USER+ | - |
120
+ | `PUT /api/users/:id` | USER+ | 본인 또는 ADMIN |
121
+ | `DELETE /api/users/:id` | ADMIN | - |
122
+ | `GET /api/admin/*` | ADMIN | - |
123
+
124
+ ---
125
+
126
+ ## 4. 데이터 보호
127
+
128
+ ### 4.1 데이터 분류
129
+
130
+ | 분류 | 예시 | 암호화 | 접근 제어 |
131
+ |-----|------|:------:|:--------:|
132
+ | 공개 | 제품 정보 | - | - |
133
+ | 내부 | 주문 내역 | 전송 시 | 인증 필요 |
134
+ | 기밀 | 개인정보 | 저장/전송 | 권한 필요 |
135
+ | 극비 | 비밀번호, 카드정보 | 저장/전송 | 특별 권한 |
136
+
137
+ ### 4.2 암호화
138
+
139
+ | 구분 | 알고리즘 | 용도 |
140
+ |-----|---------|------|
141
+ | 전송 중 (TLS) | TLS 1.3 | 모든 통신 |
142
+ | 저장 시 (대칭) | AES-256-GCM | DB 민감 필드 |
143
+ | 저장 시 (비대칭) | RSA-2048 / Ed25519 | 키 교환 |
144
+ | 해싱 | bcrypt / Argon2 | 비밀번호 |
145
+ | 토큰 서명 | RS256 | JWT |
146
+
147
+ ### 4.3 민감 데이터 처리
148
+
149
+ | 데이터 | 처리 방식 | 로깅 |
150
+ |-------|----------|:----:|
151
+ | 비밀번호 | 해싱 저장 | ❌ |
152
+ | 주민번호 | 암호화 + 마스킹 | 마스킹만 |
153
+ | 카드번호 | PCI DSS 준수 | ❌ |
154
+ | 이메일 | 평문 가능 | 마스킹 |
155
+ | IP 주소 | 평문 가능 | ⭕ |
156
+
157
+ ### 4.4 개인정보 마스킹
158
+
159
+ | 데이터 | 원본 | 마스킹 |
160
+ |-------|------|--------|
161
+ | 이메일 | user@example.com | u***@example.com |
162
+ | 전화번호 | 010-1234-5678 | 010-****-5678 |
163
+ | 카드번호 | 1234-5678-9012-3456 | ****-****-****-3456 |
164
+
165
+ ---
166
+
167
+ ## 5. API 보안
168
+
169
+ ### 5.1 보안 헤더
170
+
171
+ | 헤더 | 값 | 용도 |
172
+ |-----|-----|------|
173
+ | Content-Security-Policy | `default-src 'self'` | XSS 방지 |
174
+ | X-Content-Type-Options | `nosniff` | MIME 스니핑 방지 |
175
+ | X-Frame-Options | `DENY` | Clickjacking 방지 |
176
+ | Strict-Transport-Security | `max-age=31536000` | HTTPS 강제 |
177
+ | X-XSS-Protection | `1; mode=block` | XSS 필터 |
178
+
179
+ ### 5.2 Rate Limiting
180
+
181
+ | 엔드포인트 | 제한 | 윈도우 |
182
+ |-----------|:----:|:------:|
183
+ | 로그인 | 5회 | 15분 |
184
+ | 회원가입 | 3회 | 1시간 |
185
+ | 비밀번호 찾기 | 3회 | 1시간 |
186
+ | API 일반 | 100회 | 1분 |
187
+ | API 검색 | 30회 | 1분 |
188
+
189
+ ### 5.3 입력 검증
190
+
191
+ | 검증 | 적용 |
192
+ |-----|------|
193
+ | XSS | 모든 입력 이스케이프 |
194
+ | SQL Injection | Parameterized Query 사용 |
195
+ | Path Traversal | 경로 정규화 |
196
+ | Command Injection | 쉘 명령 회피 |
197
+
198
+ ---
199
+
200
+ ## 6. 감사 (Audit)
201
+
202
+ ### 6.1 감사 로그 항목
203
+
204
+ | 이벤트 | 기록 항목 | 보존 기간 |
205
+ |-------|----------|----------|
206
+ | 로그인 성공/실패 | 시간, IP, User-Agent | 1년 |
207
+ | 권한 변경 | 변경자, 대상, 이전/이후 | 영구 |
208
+ | 데이터 접근 | 시간, 사용자, 리소스 | 90일 |
209
+ | 데이터 변경 | 변경자, 이전/이후 값 | 영구 |
210
+ | 관리자 작업 | 모든 상세 | 영구 |
211
+
212
+ ### 6.2 로그 포맷
213
+
214
+ ```json
215
+ {
216
+ "timestamp": "2026-02-03T10:00:00Z",
217
+ "event_type": "LOGIN_SUCCESS",
218
+ "user_id": "user_123",
219
+ "ip_address": "1.2.3.4",
220
+ "user_agent": "Mozilla/5.0...",
221
+ "resource": "/api/auth/login",
222
+ "details": {}
223
+ }
224
+ ```
225
+
226
+ ---
227
+
228
+ ## 7. 컴플라이언스
229
+
230
+ ### 7.1 적용 규정
231
+
232
+ | 규정 | 적용 범위 | 상태 |
233
+ |-----|----------|:----:|
234
+ | 개인정보보호법 | 개인정보 처리 | ⏳ |
235
+ | 정보통신망법 | 웹 서비스 | ⏳ |
236
+ | GDPR | EU 사용자 (해당 시) | - |
237
+ | PCI DSS | 카드 결제 (해당 시) | - |
238
+
239
+ ### 7.2 준수 체크리스트
240
+
241
+ - [ ] 개인정보 수집 동의
242
+ - [ ] 개인정보 처리방침 게시
243
+ - [ ] 데이터 암호화 적용
244
+ - [ ] 접근 로그 기록
245
+ - [ ] 정기 보안 점검
246
+
247
+ ---
248
+
249
+ ## 8. 보안 테스트
250
+
251
+ ### 8.1 OWASP Top 10 체크
252
+
253
+ | 취약점 | 대응 | 테스트 |
254
+ |-------|------|:------:|
255
+ | A01 Broken Access Control | RBAC + 권한 검증 | ✅ |
256
+ | A02 Cryptographic Failures | TLS + AES | ✅ |
257
+ | A03 Injection | Parameterized Query | ✅ |
258
+ | A04 Insecure Design | 위협 모델링 | ✅ |
259
+ | A05 Security Misconfiguration | 보안 헤더 | ✅ |
260
+ | A06 Vulnerable Components | 의존성 스캔 | ✅ |
261
+ | A07 Auth Failures | JWT + MFA | ✅ |
262
+ | A08 Data Integrity Failures | 서명 검증 | ✅ |
263
+ | A09 Security Logging | 감사 로그 | ✅ |
264
+ | A10 SSRF | URL 검증 | ✅ |
265
+
266
+ ### 8.2 정기 점검
267
+
268
+ | 점검 | 주기 | 담당 |
269
+ |-----|------|------|
270
+ | 의존성 취약점 스캔 | 매일 (CI) | 자동화 |
271
+ | 코드 보안 리뷰 | PR마다 | tsq-security |
272
+ | 침투 테스트 | 분기별 | 외부 업체 |
273
+ | 보안 감사 | 연간 | 외부 업체 |
274
+
275
+ ---
276
+
277
+ ## 9. 인시던트 대응
278
+
279
+ ### 9.1 대응 프로세스
280
+
281
+ ```
282
+ 발견 → 분류 → 격리 → 분석 → 복구 → 사후분석
283
+ ```
284
+
285
+ ### 9.2 심각도 분류
286
+
287
+ | 레벨 | 설명 | 대응 시간 |
288
+ |:----:|------|:--------:|
289
+ | P1 | 데이터 유출, 서비스 중단 | 1시간 |
290
+ | P2 | 보안 취약점 발견 | 4시간 |
291
+ | P3 | 잠재적 위험 | 24시간 |
292
+ | P4 | 개선 권고 | 1주 |
293
+
294
+ ---
295
+
296
+ ## 10. 관련 문서
297
+
298
+ - [서비스 명세](./service-spec.md) - API 보안 적용 대상
299
+ - [데이터 설계](./data-design.md) - 암호화 필드
300
+ - [배포 명세](./deployment-spec.md) - 인프라 보안
301
+ - [테스트 명세](./test-spec.md) - 보안 테스트
302
+
303
+ ---
304
+
305
+ ## 변경 이력
306
+
307
+ | 버전 | 날짜 | 작성자 | 변경 내용 |
308
+ |------|------|--------|----------|
309
+ | 1.0.0 | {{DATE}} | tsq-security | 초기 작성 |
@@ -0,0 +1,194 @@
1
+ # {PROJECT_NAME} 서비스 명세서
2
+
3
+ **Version**: 1.0
4
+ **Created**: {DATE}
5
+ **Base URL**: `https://api.example.com/v1`
6
+
7
+ ---
8
+
9
+ ## 1. 개요
10
+
11
+ ### 1.1 API 규칙
12
+
13
+ - **인증**: Bearer Token (JWT)
14
+ - **Content-Type**: `application/json`
15
+ - **날짜 형식**: ISO 8601 (`YYYY-MM-DDTHH:mm:ssZ`)
16
+
17
+ ### 1.2 공통 응답 형식
18
+
19
+ ```json
20
+ {
21
+ "success": true,
22
+ "data": { },
23
+ "error": null
24
+ }
25
+ ```
26
+
27
+ ### 1.3 에러 응답 형식
28
+
29
+ ```json
30
+ {
31
+ "success": false,
32
+ "data": null,
33
+ "error": {
34
+ "code": "ERROR_CODE",
35
+ "message": "Human readable message"
36
+ }
37
+ }
38
+ ```
39
+
40
+ → 에러 코드 상세: [error-codes.md](./error-codes.md)
41
+
42
+ ---
43
+
44
+ ## 2. Auth
45
+
46
+ ### 2.1 로그인
47
+
48
+ | 항목 | 값 |
49
+ |-----|---|
50
+ | **Endpoint** | `POST /auth/login` |
51
+ | **설명** | 사용자 로그인 및 토큰 발급 |
52
+ | **인증** | 불필요 |
53
+
54
+ #### Request
55
+
56
+ | Field | Type | Required | Description |
57
+ |-------|------|:--------:|-------------|
58
+ | email | string | ✅ | 이메일 주소 |
59
+ | password | string | ✅ | 비밀번호 |
60
+
61
+ ```json
62
+ {
63
+ "email": "user@example.com",
64
+ "password": "password123"
65
+ }
66
+ ```
67
+
68
+ #### Response (200 OK)
69
+
70
+ | Field | Type | Description |
71
+ |-------|------|-------------|
72
+ | accessToken | string | JWT 액세스 토큰 |
73
+ | refreshToken | string | 리프레시 토큰 |
74
+ | expiresIn | number | 만료 시간 (초) |
75
+ | user | object | 사용자 정보 |
76
+
77
+ ```json
78
+ {
79
+ "success": true,
80
+ "data": {
81
+ "accessToken": "eyJhbG...",
82
+ "refreshToken": "eyJhbG...",
83
+ "expiresIn": 3600,
84
+ "user": {
85
+ "id": "user_123",
86
+ "email": "user@example.com",
87
+ "name": "홍길동"
88
+ }
89
+ }
90
+ }
91
+ ```
92
+
93
+ #### Errors
94
+
95
+ | Code | HTTP | Description |
96
+ |------|------|-------------|
97
+ | AUTH_001 | 401 | 잘못된 이메일 또는 비밀번호 |
98
+ | AUTH_002 | 403 | 계정 비활성화 |
99
+
100
+ ---
101
+
102
+ ### 2.2 토큰 갱신
103
+
104
+ | 항목 | 값 |
105
+ |-----|---|
106
+ | **Endpoint** | `POST /auth/refresh` |
107
+ | **설명** | 액세스 토큰 갱신 |
108
+ | **인증** | 불필요 |
109
+
110
+ #### Request
111
+
112
+ | Field | Type | Required | Description |
113
+ |-------|------|:--------:|-------------|
114
+ | refreshToken | string | ✅ | 리프레시 토큰 |
115
+
116
+ #### Response (200 OK)
117
+
118
+ | Field | Type | Description |
119
+ |-------|------|-------------|
120
+ | accessToken | string | 새 JWT 액세스 토큰 |
121
+ | expiresIn | number | 만료 시간 (초) |
122
+
123
+ #### Errors
124
+
125
+ | Code | HTTP | Description |
126
+ |------|------|-------------|
127
+ | AUTH_003 | 401 | 유효하지 않은 리프레시 토큰 |
128
+ | AUTH_004 | 401 | 만료된 리프레시 토큰 |
129
+
130
+ ---
131
+
132
+ ## 3. Users
133
+
134
+ ### 3.1 사용자 조회
135
+
136
+ | 항목 | 값 |
137
+ |-----|---|
138
+ | **Endpoint** | `GET /users/:id` |
139
+ | **설명** | 사용자 정보 조회 |
140
+ | **인증** | ✅ Bearer Token |
141
+ | **권한** | 본인 또는 Admin |
142
+
143
+ #### Path Parameters
144
+
145
+ | Parameter | Type | Description |
146
+ |-----------|------|-------------|
147
+ | id | string | 사용자 ID |
148
+
149
+ #### Response (200 OK)
150
+
151
+ | Field | Type | Description |
152
+ |-------|------|-------------|
153
+ | id | string | 사용자 ID |
154
+ | email | string | 이메일 |
155
+ | name | string | 이름 |
156
+ | createdAt | string | 가입일 (ISO 8601) |
157
+
158
+ ---
159
+
160
+ ## 4. [Resource Name]
161
+
162
+ ### 4.1 [Action Name]
163
+
164
+ | 항목 | 값 |
165
+ |-----|---|
166
+ | **Endpoint** | `METHOD /path` |
167
+ | **설명** | |
168
+ | **인증** | |
169
+
170
+ #### Request
171
+
172
+ | Field | Type | Required | Description |
173
+ |-------|------|:--------:|-------------|
174
+ | | | | |
175
+
176
+ #### Response (200 OK)
177
+
178
+ | Field | Type | Description |
179
+ |-------|------|-------------|
180
+ | | | |
181
+
182
+ #### Errors
183
+
184
+ | Code | HTTP | Description |
185
+ |------|------|-------------|
186
+ | | | |
187
+
188
+ ---
189
+
190
+ ## 5. 변경 이력
191
+
192
+ | 버전 | 날짜 | 변경 내용 | 작성자 |
193
+ |-----|-----|----------|-------|
194
+ | 1.0 | {DATE} | 최초 작성 | |