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.
- package/LICENSE +21 -0
- package/README.md +347 -0
- package/bin/tsq.js +6 -0
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +142 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/full.d.ts +3 -0
- package/dist/commands/full.d.ts.map +1 -0
- package/dist/commands/full.js +87 -0
- package/dist/commands/full.js.map +1 -0
- package/dist/commands/git/commit.d.ts +3 -0
- package/dist/commands/git/commit.d.ts.map +1 -0
- package/dist/commands/git/commit.js +88 -0
- package/dist/commands/git/commit.js.map +1 -0
- package/dist/commands/git/index.d.ts +5 -0
- package/dist/commands/git/index.d.ts.map +1 -0
- package/dist/commands/git/index.js +5 -0
- package/dist/commands/git/index.js.map +1 -0
- package/dist/commands/git/pr.d.ts +3 -0
- package/dist/commands/git/pr.d.ts.map +1 -0
- package/dist/commands/git/pr.js +138 -0
- package/dist/commands/git/pr.js.map +1 -0
- package/dist/commands/git/release.d.ts +3 -0
- package/dist/commands/git/release.d.ts.map +1 -0
- package/dist/commands/git/release.js +158 -0
- package/dist/commands/git/release.js.map +1 -0
- package/dist/commands/git/sync.d.ts +3 -0
- package/dist/commands/git/sync.d.ts.map +1 -0
- package/dist/commands/git/sync.js +132 -0
- package/dist/commands/git/sync.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +150 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +271 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/metrics.d.ts +3 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +299 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/commands/quick.d.ts +3 -0
- package/dist/commands/quick.d.ts.map +1 -0
- package/dist/commands/quick.js +136 -0
- package/dist/commands/quick.js.map +1 -0
- package/dist/commands/retro.d.ts +3 -0
- package/dist/commands/retro.d.ts.map +1 -0
- package/dist/commands/retro.js +280 -0
- package/dist/commands/retro.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +213 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +108 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/project.d.ts +47 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +191 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/template.d.ts +33 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +151 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/types/config.d.ts +75 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +66 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/feedback.d.ts +59 -0
- package/dist/types/feedback.d.ts.map +1 -0
- package/dist/types/feedback.js +26 -0
- package/dist/types/feedback.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +89 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +44 -0
- package/dist/types/project.js.map +1 -0
- package/dist/utils/colors.d.ts +30 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/colors.js +54 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/date.d.ts +25 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +65 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/fs.d.ts +49 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +84 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/prompts.d.ts +31 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +95 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/yaml.d.ts +21 -0
- package/dist/utils/yaml.d.ts.map +1 -0
- package/dist/utils/yaml.js +40 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +71 -0
- package/templates/common/CLAUDE.md.template +254 -0
- package/templates/common/claude/agents/tsq-dba.md +290 -0
- package/templates/common/claude/agents/tsq-designer.md +304 -0
- package/templates/common/claude/agents/tsq-developer.md +118 -0
- package/templates/common/claude/agents/tsq-planner.md +90 -0
- package/templates/common/claude/agents/tsq-prompter.md +336 -0
- package/templates/common/claude/agents/tsq-qa.md +134 -0
- package/templates/common/claude/agents/tsq-retro.md +168 -0
- package/templates/common/claude/agents/tsq-security.md +190 -0
- package/templates/common/claude/skills/architecture/SKILL.md +123 -0
- package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
- package/templates/common/claude/skills/coding/SKILL.md +171 -0
- package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
- package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
- package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
- package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
- package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
- package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
- package/templates/common/claude/skills/planning/SKILL.md +90 -0
- package/templates/common/claude/skills/security/SKILL.md +234 -0
- package/templates/common/claude/skills/testing/SKILL.md +146 -0
- package/templates/common/claude/skills/typescript/SKILL.md +435 -0
- package/templates/common/config.template.yaml +131 -0
- package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
- package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
- package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
- package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
- package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
- package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
- package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
- package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
- package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
- package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
- package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
- package/templates/common/timsquad/generators/data-design.xml +290 -0
- package/templates/common/timsquad/generators/prd.xml +280 -0
- package/templates/common/timsquad/generators/requirements.xml +220 -0
- package/templates/common/timsquad/generators/service-spec.xml +266 -0
- package/templates/common/timsquad/logs/_example.md +81 -0
- package/templates/common/timsquad/logs/_template.md +46 -0
- package/templates/common/timsquad/patterns/cqrs.xml +127 -0
- package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
- package/templates/common/timsquad/patterns/repository.xml +64 -0
- package/templates/common/timsquad/process/state-machine.xml +343 -0
- package/templates/common/timsquad/process/validation-rules.xml +308 -0
- package/templates/common/timsquad/process/workflow-base.xml +202 -0
- package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
- package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
- package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
- package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
- package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
- package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
- package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
- package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
- package/templates/common/timsquad/ssot/data-design.template.md +132 -0
- package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
- package/templates/common/timsquad/ssot/env-config.template.md +346 -0
- package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
- package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
- package/templates/common/timsquad/ssot/glossary.template.md +148 -0
- package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
- package/templates/common/timsquad/ssot/planning.template.md +94 -0
- package/templates/common/timsquad/ssot/prd.template.md +102 -0
- package/templates/common/timsquad/ssot/requirements.template.md +117 -0
- package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
- package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
- package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
- package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
- 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} | 최초 작성 | |
|