git:20260429.be76f02 to git:20260430.6fb740f

406 added, 147 removed. Audit C to C.

# Security Design Review — 보안 설계 리뷰 스킬
- > PRD/기획서를 분석하여 글로벌 보안 표준·규제에 근거한 보안 구현 명세를 생성한다.
+ > PRD/기획서를 분석하여 글로벌 보안 표준·규제에 근거한 **보안 의견서** 또는 **보안 검토 의견서**를 생성한다.
---
## 서비스 개요
| 항목 | 내용 |
|------|------|
| 서비스명 | Security Design Review |
- | 방법론 | PRD → 컴포넌트 분해 → 표준 바인딩 → 구현 명세 |
- | 출력물 | Security Implementation Specification (SEC-{COMP}-{NNN}) |
- | 코드 수정 | ❌ 없음 (명세 생성 전용) |
- | 코드 분석 | ❌ 없음 (PRD/기획서 텍스트 분석) |
- | 토큰 예산 | ~30K (OffSec VA 대비 66% 절감) |
+ | 방법론 | 문서 정찰 → 위협 표면 매핑 → 표준 바인딩 → 의견/검토 생성 |
+ | 출력물 | **Opinion**: 섹션별 MUST/SHOULD 의견 + 코드 예시 (OP-{NNN}) |
+ | | **Review**: CRITICAL~LOW 검토 Finding + 설계 가이드 (C/H/M/L-{NN}) |
+ | 코드 수정 | 없음 (명세·의견 생성 전용) |
+ | 코드 분석 | 없음 (PRD/기획서 텍스트 분석) |
+ | 토큰 예산 | ~22-35K (Phase별 계층 로딩) |
---
+ ## 출력 모드
+
+ ```yaml
+ Mode_Selection:
+ opinion:
+ trigger: "--mode opinion (기본값)"
+ 대상: "개발자, AI 코딩 도구"
+ 관점: "구현 가이드 — '이렇게 만들어라'"
+ ID: "OP-{NNN} (001부터 순차)"
+ 구조: "문서 섹션별 MUST / MUST NOT / SHOULD 의견 + 코드 예시"
+ 용도: "Cursor, Claude Code 등에 컨텍스트로 주입하여 보안 요건 반영 코딩"
+
+ review:
+ trigger: "--mode review"
+ 대상: "QSA, CISO, 경영진, 개발팀"
+ 관점: "감사 리포트 — '이 설계의 위험은 이것이다'"
+ ID: "C-{NN} / H-{NN} / M-{NN} / L-{NN}"
+ 구조: "Severity별 Finding + 표준 Gap 분석 + Risk Acceptance Matrix"
+ 용도: "Go/No-Go 의사결정, 감사 대응, 규제 보고"
+ ```
+
+ ---
+
## 설계 원칙
```yaml
No_Pattern_Lists:
- "CWE/OWASP 카탈로그를 기계적으로 나열하지 않는다"
- "PRD 컨텍스트에서 실제 관련된 표준만 바인딩"
- "도메인·관할에 따라 적용 표준이 달라짐을 인지"
Standards_Authority:
- "권고하는 모든 알고리즘·파라미터에 근거 표준 인용 필수"
- "표준이 명확하면 그대로 인용 (e.g., NIST SP 800-63B §5.1.1.2)"
- "표준 간 충돌 시 가장 엄격한 기준 채택"
- "표준이 업데이트된 경우 최신 버전 적용 (e.g., PCI DSS 4.0.1 future-dated 2025-03-31)"
Implementation_Specificity:
핵심: "구현자가 바로 코딩할 수 있는 수준"
bad_examples:
- "암호화 적용"
- "강력한 비밀번호 정책"
- "적절한 접근 제어"
good_examples:
- "AES-256-GCM envelope encryption, DEK 로테이션 365일, CMK→DEK 2-tier"
- "bcrypt cost 12, 최소 12자, zxcvbn score ≥ 3, breached-password 사전 차단"
- "리소스별 ABAC, policy: {action, resource, condition}, 서버사이드 enforcement"
Conservative_Judgment:
- "규제 적용 범위 불확실 시 '적용 가능성 있음'으로 포함"
- "'이 정도면 안전하다'는 표현 금지"
- "법률 자문이 아닌 기술 보안 관점의 참고 정보"
```
---
## Phase 구조 (Overview)
```
- Phase 0: PRD Analysis → 입력 분석, 도메인/관할 감지
- Phase 1: Component Map → 보안 컴포넌트 분해, 오버레이 참조
- Phase 2: Standards Bind → 표준·규제 매핑, 구현 지침 추출
- Phase 3: Spec Generation → SEC-{COMP}-{NNN} 명세 생성, 출력
+ Phase 0: Document Recon → 입력 문서 구조 파악 + 기술 스택 추론 + 도메인 감지
+ Phase 1: Threat Surface Map → 문서 섹션별 위협 표면 매핑 (8차원 활용)
+ Phase 2: Standard Binding → 위협별 글로벌 표준/규제 바인딩
+ Phase 3: Opinion/Review Gen → MUST/SHOULD 의견 또는 CRITICAL/HIGH Finding 생성
+ Phase 4: Code Exemplification → 수정 코드 예시 생성 (의견 모드) 또는 설계 가이드 (검토 모드)
+ Phase 5: Checklist Assembly → Phase별 체크리스트 + Risk Acceptance
+ Phase 6: Output Formatting → 템플릿 기반 최종 출력
```
---
- ## Phase 0: PRD Analysis (입력 분석)
+ ## Phase 0: Document Recon (입력 문서 구조 파악)
```yaml
- 목적: "PRD/기획서에서 보안 관련 컨텍스트를 추출한다"
+ 목적: "입력 문서를 파싱하고 보안 리뷰에 필요한 컨텍스트를 추출한다"
Step_0_1_입력_처리:
- 파일_경로: "Read 도구로 파일 내용 로드"
+ 파일_경로: "Read 도구로 파일 내용 로드 (md, pdf 지원)"
+ Confluence_URL: "WebFetch로 페이지 본문 추출"
인라인_텍스트: "사용자 메시지에서 직접 추출"
- 복수_파일: "각 파일을 순차 Read 후 병합"
+ 복수_입력: "각 입력을 순차 로드 후 병합. 섹션 경계 보존"
- Step_0_2_기능_추출:
+ Step_0_2_문서_구조_파악:
추출_대상:
+ - "문서 유형 식별 (PRD, 설계서, API 명세, 아키텍처 문서, 기능 명세)"
+ - "섹션 목차 추출 — 의견 생성 시 섹션 단위로 대응"
- "핵심 기능 목록 (e.g., 결제, 인증, 지갑, 관리자)"
- "데이터 유형 (PII, 카드 정보, 암호화폐 주소, 세션 등)"
- "사용자 유형 (일반 사용자, 판매자, 관리자, API 클라이언트)"
- "외부 연동 (PG, 블록체인 노드, KYC 제공자, 세금 API 등)"
- "배포 환경 힌트 (클라우드, 리전, 규모)"
- Step_0_3_도메인_감지:
- method: "tier2-overlays/registry.yaml의 시그널 패턴을 PRD 텍스트에 자연어 매칭"
+ Step_0_3_기술_스택_추론:
+ 방법: "문서 내 기술 언급, 아키텍처 다이어그램, API 명세에서 추론"
+ 추론_대상:
+ - "언어/프레임워크 (문서에 명시되지 않으면 '미특정'으로 남김)"
+ - "인프라 (AWS/GCP/Azure, K8s, 서버리스 등)"
+ - "데이터베이스 유형"
+ - "인증/인가 아키텍처 (JWT, OAuth, SAML 등)"
+ 주의: "추론된 스택은 문서 근거와 함께 명시. 근거 없는 추론 금지"
+
+ Step_0_4_도메인_감지:
+ method: "tier2-overlays/registry.yaml의 시그널 패턴을 문서 텍스트에 자연어 매칭"
주의: "코드 import가 아닌 PRD 키워드 매칭 — '결제', '지갑', '토큰', 'API 키' 등"
override: "--domain 옵션이 있으면 자동 감지 대신 강제 적용"
Loading_Rule: "registry.yaml만 Read. 오버레이 파일은 Phase 1에서 조건부 로드"
- Step_0_4_관할_감지:
+ Step_0_5_관할_감지:
signals:
- "서비스 대상 국가/지역 언급"
- "법인 소재지"
- "데이터 저장 위치"
- "사용자 거주 국가"
default: "global (다중 관할 가정)"
override: "--jurisdiction 옵션이 있으면 강제 적용"
Output:
- context:
+ doc_recon:
+ document_type: "PRD|설계서|API 명세|..."
+ sections: ["섹션1: 제목", "섹션2: 제목", ...]
project: "프로젝트명"
description: "1줄 요약"
- components: ["기능1", "기능2", ...]
+ features: ["기능1", "기능2", ...]
data_types: ["PII", "카드 정보", ...]
user_types: ["일반", "관리자", ...]
integrations: ["PG", "블록체인", ...]
+ inferred_stack:
+ languages: ["TypeScript", ...]
+ infra: ["AWS", "K8s", ...]
+ auth: "JWT + OAuth2"
domains: ["payment", "web3", ...]
jurisdiction: "uae|kr|eu|global|..."
- level: "essential|standard|comprehensive"
```
---
- ## Phase 1: Component Map (보안 컴포넌트 매핑)
+ ## Phase 1: Threat Surface Map (위협 표면 매핑)
```yaml
- 목적: "PRD 기능을 보안 관련 아키텍처 컴포넌트로 분해한다"
-
- Step_1_1_컴포넌트_분해:
- 방법: "Phase 0 기능 목록을 보안 경계(trust boundary) 기준으로 분류"
- 컴포넌트_유형_예시:
- SEC-SDK: "클라이언트 SDK (모바일, 웹, 네이티브)"
- SEC-API: "API 서버 (인증, 라우팅, 미들웨어)"
- SEC-AUTH: "인증/인가 시스템"
- SEC-PAY: "결제 처리 (상태 머신, PG 연동)"
- SEC-FDS: "이상거래 탐지 (FDS/AML)"
- SEC-CRYPTO: "암호화폐/블록체인 연동"
- SEC-WALLET: "지갑/키 관리"
- SEC-WEBHOOK: "웹훅 수신/발신"
- SEC-DATA: "데이터 레이어 (암호화, 백업, 접근제어)"
- SEC-ADMIN: "관리자 콘솔 (인증, RBAC)"
- SEC-INFRA: "인프라 (네트워크, 시크릿, 로깅)"
- SEC-TAX: "세금/정산/보고"
- SEC-AI: "AI/LLM 연동"
- 주의: "PRD에 없는 컴포넌트는 생성하지 않는다. PRD 범위에 충실"
+ 목적: "문서 섹션별로 보안 위협 표면을 식별하고 8대 아키텍처 차원에 매핑한다"
- Step_1_2_오버레이_참조:
+ Step_1_1_오버레이_로드:
절차:
- "Phase 0에서 감지된 도메인의 tier2-overlay 파일을 Read"
- - "오버레이의 Core Architecture Questions를 '구현 필수 항목'으로 재해석"
+ - "오버레이의 Core Architecture Questions를 위협 식별 시드로 활용"
- "1-3개 오버레이만 로드 (토큰 예산 제약)"
- 예시:
- domain_payment: "payment.md의 질문 → SEC-PAY 요구사항 시드"
- domain_web3: "web3.md + web3-wallet.md(해당 시) → SEC-CRYPTO, SEC-WALLET 시드"
Loading_Rule: "감지된 도메인의 오버레이만 Read. 미감지 도메인 파일 로드 금지"
+ Unload: "registry.yaml (Phase 0에서 사용 완료)"
- Step_1_3_컴포넌트_레지스트리:
+ Step_1_2_섹션별_위협_매핑:
+ 방법: |
+ 문서의 각 섹션(기능)을 8대 아키텍처 차원에 대해 질문한다:
+ A1-인증: 이 기능에서 인증 메커니즘이 필요한가? 우회 경로는?
+ A2-인가: 리소스 접근 제어가 필요한 지점은?
+ A3-데이터흐름: 민감 데이터가 어디서 어디로 이동하는가?
+ A4-입출력: 외부 입력 검증이 필요한 지점은?
+ A5-시크릿: 키/토큰/자격증명 관리가 필요한 지점은?
+ A6-의존성: 외부 서비스/라이브러리 신뢰 경계는?
+ A7-에러처리: 민감 정보 노출 가능한 에러 경로는?
+ A8-리소스: Rate limiting, DoS 방어가 필요한 지점은?
+ 참조: "knowledge-base/tier1-dimensions/a1-a8 파일은 Read하지 않는다. 차원명과 질문만 활용"
+
+ Step_1_3_위협_표면_레지스트리:
출력_형식:
- per_component:
- id_prefix: "SEC-{COMP}"
- description: "컴포넌트 설명"
- prd_functions: ["매핑된 PRD 기능"]
- trust_boundary: "client|server|external|infra"
- data_sensitivity: "restricted|confidential|internal|public"
- overlay_seeds: ["오버레이에서 추출한 보안 관심사"]
+ per_section:
+ section_ref: "문서 섹션 번호/제목"
+ features: ["매핑된 기능"]
+ threats:
+ - dimension: "A1|A2|...|A8"
+ threat: "위협 설명"
+ data_at_risk: "위험 데이터"
+ attack_scenario: "공격 시나리오 1줄"
+ 주의: |
+ 문서에서 언급하지 않는 기능에 대한 위협을 창작하지 않는다.
+ 위협이 식별되지 않은 차원은 기록하지 않는다 (모든 차원에 대해 위협을 억지로 채우지 않음).
```
---
- ## Phase 2: Standards Bind (표준·규제 바인딩)
+ ## Phase 2: Standard Binding (표준·규제 바인딩)
```yaml
- 목적: "컴포넌트별 적용 표준과 규제를 결정하고 구현 지침을 추출한다"
+ 목적: "Phase 1에서 식별된 위협별로 적용 가능한 글로벌 표준·규제를 바인딩한다"
Step_2_1_표준_레지스트리_로드:
action: "knowledge-base/standards/registry.yaml Read"
내용: "도메인 → 표준 매핑 인덱스"
+ Unload: "tier2-overlay 파일 (Phase 1에서 시드 추출 완료)"
Step_2_2_표준_매핑:
절차:
- - "도메인 × 컴포넌트 조합으로 적용 표준 목록 결정"
+ - "도메인 × 위협 차원 조합으로 적용 표준 목록 결정"
- "매칭된 표준 YAML 파일만 조건부 Read (2-4개)"
- - "각 표준의 requirements 중 해당 컴포넌트에 적용되는 항목 추출"
+ - "각 표준의 requirements 중 Phase 1 위협에 해당하는 항목 추출"
Loading_Rule: "registry.yaml에서 매칭된 표준 파일만 Read. 전체 로드 금지"
- 예시:
- SEC-PAY_x_payment:
- standards: ["pci-dss-v4", "owasp-top10"]
- load: ["pci-dss-v4.yaml", "owasp-top10.yaml"]
- SEC-AUTH_x_saas:
- standards: ["owasp-top10", "nist-sp800"]
- load: ["owasp-top10.yaml", "nist-sp800-select.yaml"]
Step_2_3_규제_바인딩:
절차:
- "관할에 따라 privacy-regulations.yaml 추가 로드"
- "도메인별 산업 규제 적용 (결제→PCI, 금융→AML/CFT, 의료→HIPAA)"
예시:
- jurisdiction_uae:
- load: ["privacy-regulations.yaml"]
- extract: "UAE Federal Decree-Law 45/2021 요건"
- jurisdiction_eu:
- load: ["privacy-regulations.yaml"]
- extract: "GDPR 요건"
+ jurisdiction_uae: "UAE Federal Decree-Law 45/2021 요건 추출"
+ jurisdiction_eu: "GDPR 요건 추출"
+ jurisdiction_kr: "개인정보보호법, 전자금융거래법 요건 추출"
- Step_2_4_구현_지침_추출:
- 각_표준_요건에서:
- - "implementation: 알고리즘·파라미터 수준 구현 지침"
- - "test_criteria: happy/failure/boundary 테스트 기준"
+ Step_2_4_위협_표준_바인딩_테이블:
+ 출력_형식:
+ per_threat:
+ threat_ref: "Phase 1 위협 ID"
+ section_ref: "원본 문서 섹션"
+ applicable_standards:
+ - standard: "PCI DSS 4.0.1"
+ clause: "Req 3.5.1"
+ requirement_summary: "저장 PAN 암호화"
+ - standard: "NIST SP 800-175B"
+ clause: "§4.2"
+ requirement_summary: "AES-256 이상 대칭 암호"
+ cwe_mapping: ["CWE-311", "CWE-327"]
+ owasp_mapping: ["A02:2021"]
병합_규칙:
- - "동일 컴포넌트에 복수 표준 적용 시 가장 엄격한 기준"
+ - "동일 위협에 복수 표준 적용 시 가장 엄격한 기준"
- "표준 간 충돌 시 최신·최엄격 우선"
+ ```
- Output:
- component_standards_map:
- per_component:
- id_prefix: "SEC-{COMP}"
- applicable_standards: ["표준 ID"]
- requirements:
- - standard_ref: "PCI DSS 4.0.1 Req 3.5.1"
- implementation: ["구현 지침"]
- test_criteria: {happy: "...", failure: "...", boundary: "..."}
+ ---
+
+ ## Phase 3: Opinion/Review Generation (의견/검토 생성)
+
+ ### Mode: Opinion (의견서)
+
+ ```yaml
+ 목적: "위협별 MUST / MUST NOT / SHOULD 보안 구현 의견을 생성한다"
+
+ Constraint_Levels:
+ MUST:
+ 정의: "미준수 시 보안 목표 달성 불가"
+ 표기: "MUST (RFC 2119)"
+ 요건: "반드시 CWE/OWASP/NIST 근거 1개 이상"
+ 예시: "인증 토큰은 MUST 서버사이드에서 검증한다 (CWE-345, OWASP A07:2021)"
+ MUST_NOT:
+ 정의: "실행 시 직접적 취약점 발생"
+ 표기: "MUST NOT (RFC 2119)"
+ 요건: "CWE 매핑 필수. 해당 코드 패턴이 왜 위험한지 구체 설명"
+ 예시: "클라이언트 제출 가격을 MUST NOT 결제 금액으로 사용한다 (CWE-472)"
+ SHOULD:
+ 정의: "방어 심층(defense-in-depth), 베스트 프랙티스. 미준수 시 잔여 위험 증가"
+ 표기: "SHOULD (RFC 2119)"
+ 요건: "미준수 시 잔여 위험을 명시"
+ 예시: "API 응답에 SHOULD rate limit 헤더(X-RateLimit-*)를 포함한다 (미준수 시 클라이언트 자체 조절 불가)"
+
+ Quality_Gate:
+ - "MUST에는 반드시 CWE/OWASP/NIST 근거 참조"
+ - "MUST 비율 ≤ 50% (전체 의견 대비). 초과 시 SHOULD로 재분류 검토 — 과잉 설계 방지"
+ - "코드 관련 MUST/MUST NOT에는 Phase 4에서 코드 예시 필수"
+ - "문서 섹션 순서를 따른다. 섹션을 건너뛰지 않는다"
+
+ ID_Scheme: "OP-{NNN} (001부터 순차. 문서 섹션 순서)"
+
+ Output_Format:
+ per_opinion:
+ id: "OP-001"
+ section_ref: "원본 문서 섹션"
+ constraint: "MUST | MUST NOT | SHOULD"
+ title: "의견 제목 (한글)"
+ description: "의견 본문 — 무엇을, 왜, 어떤 수준으로"
+ basis: "표준/규제 근거 (복수 가능)"
+ cwe: "CWE-NNN (MUST/MUST NOT 필수)"
+ risk_if_ignored: "미준수 시 위험 (1-2문장)"
```
+ ### Mode: Review (검토 의견서)
+
+ ```yaml
+ 목적: "위협별 CRITICAL/HIGH/MEDIUM/LOW 보안 검토 Finding을 생성한다"
+
+ Severity_Levels:
+ CRITICAL:
+ 정의: "Go-Live 차단. 법적 제재, 대규모 금전 손실, 인증 실패 초래"
+ ID: "C-{NN}"
+ 시한: "출시 전 필수 해결"
+ 예시: "PAN 데이터 평문 저장 — PCI DSS 인증 불가"
+ HIGH:
+ 정의: "30일 내 수정 필요. 보안 인시던트 발생 확률 높음"
+ ID: "H-{NN}"
+ 시한: "30일"
+ 예시: "JWT 서명 검증 누락 — 토큰 위조 가능"
+ MEDIUM:
+ 정의: "90일 내 권고. 보상 제어로 단기 완화 가능"
+ ID: "M-{NN}"
+ 시한: "90일"
+ 예시: "API rate limiting 미설계 — DDoS 취약"
+ LOW:
+ 정의: "개선 제안. 운영 비효율 또는 감사 지적 위험"
+ ID: "L-{NN}"
+ 시한: "백로그"
+ 예시: "에러 응답에 내부 스택 트레이스 포함 가능성"
+
+ Dual_Perspective:
+ QSA_view: "표준 준수 Gap 중심 — 어떤 조항을 충족하지 못하는가"
+ CISO_view: "비즈니스 리스크 중심 — 이 Gap이 사업에 미치는 영향은 무엇인가"
+
+ Quality_Gate:
+ - "CRITICAL은 법적/재무/인증 영향이 명확할 때만 부여"
+ - "모든 Finding에 표준 근거 + 비즈니스 영향 + 권고 조치 포함"
+ - "표준 준수 Gap Analysis 표 필수 (표준 × 조항 × Finding ID × 준수 상태)"
+ - "Risk Acceptance 섹션 필수 (아래 Phase 5 참조)"
+
+ Output_Format:
+ per_finding:
+ id: "C-01 | H-01 | M-01 | L-01"
+ severity: "CRITICAL | HIGH | MEDIUM | LOW"
+ title: "Finding 제목 (한글)"
+ section_ref: "원본 문서 섹션"
+ description: "문제 설명 — QSA 관점"
+ business_impact: "비즈니스 영향 — CISO 관점"
+ basis: "표준/규제 근거"
+ recommendation: "권고 조치 (알고리즘·파라미터 수준)"
+ timeline: "수정 시한"
+ ```
+
---
- ## Phase 3: Spec Generation (명세 생성)
+ ## Phase 4: Code Exemplification (코드 예시 / 설계 가이드)
+ ### Mode: Opinion
+
```yaml
- 목적: "표준 바인딩 결과를 SEC-{COMP}-{NNN} 명세로 변환하여 출력한다"
+ 목적: "MUST/MUST NOT 의견에 잘못된 코드(❌)와 올바른 코드(✅)를 대비한다"
- Step_3_1_요구사항_생성:
+ 적용_대상: "코드 구현이 관련된 모든 MUST, MUST NOT 의견"
+ 코드_스택: "Phase 0에서 추론된 기술 스택 기반. 미특정 시 가장 보편적 스택(TypeScript/Node.js) 사용"
+
+ Format:
+ per_opinion_with_code:
+ opinion_ref: "OP-NNN"
+ bad_example:
+ label: "❌ 위험한 구현"
+ code: |
+ // 클라이언트 제출 가격을 그대로 결제에 사용
+ const amount = req.body.amount;
+ await pg.charge({ amount, orderId });
+ explanation: "공격자가 요청 body의 amount를 0으로 조작 가능 (CWE-472)"
+ good_example:
+ label: "✅ 권장 구현"
+ code: |
+ // 서버사이드에서 주문 DB 기준 금액 조회
+ const order = await Order.findById(req.body.orderId);
+ const amount = order.calculatedTotal; // 서버 계산 금액
+ await pg.charge({ amount, orderId: order.id });
+ explanation: "결제 금액은 서버가 계산한 값만 사용. 클라이언트 입력 불신"
+
+ 주의:
+ - "코드 예시는 핵심 로직만. 보일러플레이트, import, 에러 핸들링은 최소화"
+ - "SHOULD 의견은 코드 예시 선택적 (복잡한 구현이 필요한 경우만)"
+ - "프레임워크 특화 구문보다 로직 패턴을 보여준다"
+ ```
+
+ ### Mode: Review
+
+ ```yaml
+ 목적: "Finding에 대한 설계 수준 권고와 아키텍처 가이드를 제공한다"
+
+ 적용_대상: "CRITICAL, HIGH Finding (MEDIUM은 선택적)"
+
+ Format:
+ per_finding_with_guide:
+ finding_ref: "C-01"
+ design_guidance:
+ current_state: "현재 설계에서의 Gap 요약"
+ target_state: "달성해야 할 보안 상태"
+ approach: |
+ 1. 토큰화 서비스 도입 (PAN → Token 매핑, 별도 PCI 스코프)
+ 2. DEK/CMK 2-tier envelope encryption 적용
+ 3. 키 로테이션 자동화 (CMK 365일, DEK 트랜잭션별)
+ reference_architecture: "해당 시 아키텍처 다이어그램 텍스트 설명"
+ standards_alignment: "PCI DSS 4.0.1 Req 3.5.1, NIST SP 800-57 Part 1"
+
+ 주의:
+ - "소스코드 수준이 아닌 아키텍처/설계 수준 가이드"
+ - "구현 선택지가 여러 개면 장단점과 함께 나열"
+ - "LOW Finding에는 설계 가이드 불필요 (recommendation으로 충분)"
+ ```
+
+ ---
+
+ ## Phase 5: Checklist Assembly (체크리스트 + Risk Acceptance)
+
+ ```yaml
+ 목적: "의견/Finding을 실행 가능한 체크리스트로 조립하고 Risk Acceptance를 명시한다"
+
+ Step_5_1_체크리스트_생성:
+ opinion_mode:
+ 구조:
+ - "[ ] OP-001: [MUST] 인증 토큰 서버사이드 검증"
+ - "[ ] OP-002: [MUST NOT] 클라이언트 제출 가격 사용"
+ - "[ ] OP-003: [SHOULD] Rate limit 헤더 포함"
+ 정렬: "MUST → MUST NOT → SHOULD 순서. 각 그룹 내 문서 섹션 순"
+
+ review_mode:
+ 구조:
+ - "[ ] C-01: PAN 토큰화 미설계 — 출시 전 해결"
+ - "[ ] H-01: JWT 서명 검증 누락 — 30일"
+ - "[ ] M-01: API rate limiting 미설계 — 90일"
+ - "[ ] L-01: 에러 응답 정보 노출 — 백로그"
+ 정렬: "CRITICAL → HIGH → MEDIUM → LOW 순서"
+
+ Step_5_2_Risk_Acceptance:
+ 필수: true
+ 설명: |
+ "제로 리스크는 존재하지 않는다. SHOULD/MEDIUM/LOW 항목 중
+ 비즈니스 판단으로 수용 가능한 잔여 위험을 명시적으로 기록한다."
+ 포맷:
+ per_accepted_risk:
+ id: "OP-NNN 또는 M-NN/L-NN"
+ risk_description: "수용하는 위험"
+ justification: "수용 근거 (비용 대비 영향, 보상 제어 등)"
+ compensating_control: "대체 완화 조치 (있는 경우)"
+ review_date: "재검토 일자 (미지정 시 '다음 정기 리뷰')"
+ 주의:
+ - "MUST / MUST NOT / CRITICAL / HIGH는 Risk Acceptance 대상이 아님"
+ - "Risk Acceptance는 '빈 섹션'이 되어도 반드시 포함 (해당 없음 시 '해당 없음' 명시)"
+
+ Step_5_3_이터레이션_비교:
+ trigger: "--previous <path> 옵션 제공 시"
절차:
- - "(컴포넌트 × 표준 요건) 교차점마다 SEC-{COMP}-{NNN} 생성"
- - "NNN은 컴포넌트 내 001부터 순차 부여"
- per_requirement:
- title: "요구사항 제목 (한글)"
- 근거: "표준/규제 조항 인용 (복수 가능)"
- 구현: "알고리즘·파라미터 수준 구현 명세"
- 수용_기준: "체크박스 형태 (happy + failure + boundary)"
+ - "이전 리뷰 문서를 Read"
+ - "이전 의견/Finding과 현재를 ID/내용 기준 매칭"
+ - "신규(NEW), 유지(UNCHANGED), 변경(CHANGED), 해결(RESOLVED) 분류"
+ - "Delta Summary 섹션 추가"
+ 출력:
+ delta_summary:
+ new: ["OP-015: 신규 OAuth 스코프 관련"]
+ resolved: ["OP-003: 이전 리뷰에서 지적된 세션 관련 — 설계 반영 확인"]
+ changed: ["OP-007: rate limit 기준값 변경"]
+ unchanged_count: 12
+ ```
- Step_3_2_중복_병합:
- 규칙:
- - "동일 컴포넌트에서 유사 요구사항은 통합"
- - "근거는 모든 관련 표준 병기"
- - "구현은 가장 엄격한 기준으로 통합"
+ ---
- Step_3_3_레벨_필터:
- essential:
- 기준: "CRITICAL/HIGH 영향 항목만"
- 목표: "~20 specs"
- 우선순위: "인증, 암호화, 접근제어, 데이터보호"
- standard:
- 기준: "MEDIUM 이상 + 주요 LOW"
- 목표: "~40-60 specs"
- 우선순위: "전체 컴포넌트 균형 커버"
- comprehensive:
- 기준: "모든 표준 항목 + 규제 전체"
- 목표: "~80-100+ specs"
- 우선순위: "누락 없는 전체 커버리지"
+ ## Phase 6: Output Formatting (최종 출력)
- Step_3_4_출력_생성:
- template: "templates/feedback-spec.template.md 기반"
- 구조:
- - 헤더: 프로젝트 메타, 적용 표준, 버전
- - 목차: 컴포넌트별 SEC 번호 인덱스
- - 본문: 컴포넌트별 SEC-{COMP}-{NNN} 상세
- - 부록_A: 외부 API 연동 보안 (해당 시)
- - 부록_B: 적용 표준 레퍼런스 (표준 × 조항 × SEC-ID 크로스맵)
- 저장:
- 경로: "{target}/reports/ch015-{project}-{date}-feedback.md"
- fallback: "저장 경로가 없으면 출력만 수행"
+ ```yaml
+ 목적: "템플릿 기반으로 최종 문서를 조립하여 출력한다"
- Step_3_5_요구사항_포맷:
- 예시: |
- ### SEC-API-001: HMAC-SHA256 요청 서명
+ Step_6_1_템플릿_선택:
+ opinion_mode: "templates/feedback-opinion.template.md (Opinion 섹션)"
+ review_mode: "templates/feedback-opinion.template.md (Review 섹션, <!-- REVIEW MODE TEMPLATE --> 이후)"
+ Unload: "표준 YAML (Phase 2에서 지침 추출 완료)"
- **근거**: NIST FIPS 198-1 (HMAC), FIPS 180-4 (SHA-256), CWE-294 (Replay), CWE-208 (Timing Attack)
+ Step_6_2_템플릿_렌더링:
+ 공통_섹션:
+ - "프로젝트 메타 (이름, 일자, 버전, 입력 문서)"
+ - "적용 표준 목록"
+ - "문서 개요 (Phase 0 결과 요약)"
+ opinion_mode_섹션:
+ - "문서 섹션별 의견 (OP-NNN + 코드 예시 인라인)"
+ - "체크리스트 (MUST → MUST NOT → SHOULD)"
+ - "Risk Acceptance"
+ - "부록: 표준 크로스 레퍼런스 (OP-ID × 표준 × 조항)"
+ review_mode_섹션:
+ - "Executive Summary (Severity 분포, 핵심 위험 3줄 요약)"
+ - "Finding 상세 (Severity별 그룹)"
+ - "표준 준수 Gap Analysis 표"
+ - "체크리스트 (Severity 순)"
+ - "Risk Acceptance Matrix"
+ - "부록: 표준 크로스 레퍼런스 (Finding-ID × 표준 × 조항)"
- **구현**:
- - Secret Key API 호출에 HMAC-SHA256 서명 필수
- - 서명 base: `{timestamp}.{HTTP_method}.{path}.{SHA256(body)}`
- - Timestamp 비교: ±300초 (5분)
- - 서명 비교: constant-time comparison
+ Step_6_3_저장:
+ opinion: "{target}/reports/ch015-{project}-{date}-opinion.md"
+ review: "{target}/reports/ch015-{project}-{date}-review.md"
+ fallback: "저장 경로가 없으면 출력만 수행"
- **수용 기준**:
- - [ ] 유효한 서명 → 200 정상 처리
- - [ ] 서명 누락 → 403
- - [ ] 잘못된 서명 → 403
- - [ ] 5분 초과 timestamp → 403
- - [ ] 서명 일치/불일치 응답 시간 차이 < 1ms
+ Step_6_4_템플릿_미존재_시:
+ 절차: |
+ 템플릿 파일이 없으면 Phase 6에서 직접 마크다운을 조립한다.
+ 위 섹션 구조를 기반으로 출력. 템플릿은 가이드일 뿐 하드 의존성이 아님.
```
---
## 컨텍스트 로딩 프로토콜
```yaml
Phase_0_로드:
고정: "이 SKILL.md (이미 로드됨)"
조건부: "tier2-overlays/registry.yaml (도메인 감지용)"
토큰: "~2K"
Phase_1_로드:
조건부: "감지 도메인의 tier2-overlay 1-3개"
언로드: "registry.yaml (Phase 0에서 사용 완료)"
토큰: "~3-8K"
Phase_2_로드:
고정: "standards/registry.yaml"
조건부: "매칭 표준 YAML 2-4개"
언로드: "tier2-overlay (Phase 1에서 시드 추출 완료)"
토큰: "~5-10K"
- Phase_3_로드:
- 고정: "templates/feedback-spec.template.md"
+ Phase_3_6_로드:
+ 고정: "templates/feedback-opinion.template.md 또는 feedback-spec.template.md"
언로드: "표준 YAML (Phase 2에서 지침 추출 완료)"
토큰: "~1K"
- 합계_예상: "~22-32K (PRD 크기에 따라 변동)"
+ 합계_예상: "~22-35K (입력 문서 크기에 따라 변동)"
+
+ 원칙:
+ - "한 시점에 로드된 knowledge-base 파일은 최대 4개"
+ - "Phase 완료 시 해당 Phase에서만 필요했던 파일은 결과만 보존하고 원문 해제"
+ - "해제란 해당 파일의 상세 지시를 더 이상 참조하지 않고 Phase 결과만 유지하는 것"
```
---
+ ## 옵션 및 파라미터
+
+ ```yaml
+ Parameters:
+ required:
+ input: "분석 대상 문서 (파일 경로, Confluence URL, 또는 인라인 텍스트)"
+
+ optional:
+ --mode: "opinion (기본) | review"
+ --domain: "도메인 강제 지정 (auto-detect 대신)"
+ --jurisdiction: "관할 강제 지정 (e.g., kr, eu, uae, global)"
+ --level: "essential | standard (기본) | comprehensive"
+ --previous: "이전 리뷰 파일 경로 (이터레이션 비교 활성화)"
+ --target: "출력 저장 디렉토리"
+
+ Usage_Examples:
+ 기본: "/ch015:feedback docs/prd-payment.md"
+ 리뷰_모드: "/ch015:feedback docs/prd-payment.md --mode review"
+ 도메인_강제: "/ch015:feedback docs/prd-wallet.md --domain web3"
+ 이터레이션: "/ch015:feedback docs/prd-v2.md --previous reports/ch015-myapp-20260401-opinion.md"
+ Confluence: "/ch015:feedback https://wiki.example.com/pages/viewpage.action?pageId=12345"
+ ```
+
+ ---
+
## Anti-Patterns
```yaml
금지_사항:
Pattern_Dump:
설명: "CWE/OWASP 카탈로그를 PRD 컨텍스트 무관하게 전부 나열"
올바른_접근: "PRD에서 실제 관련된 표준 항목만 바인딩"
Vague_Recommendations:
설명: "'암호화 적용', '적절한 인증' 등 구체성 없는 권고"
올바른_접근: "알고리즘·파라미터·프로토콜 수준 명세"
Scope_Creep:
설명: "PRD에 없는 기능에 대한 보안 요구사항 생성"
- 올바른_접근: "PRD 범위에 충실. 필요 시 '추가 검토 권장' 메모"
+ 올바른_접근: "PRD 범위에 충실. 누락 우려 시 별도 '범위 외 권고' 메모로 분리"
Legal_Advice:
설명: "'이 구현으로 GDPR 준수 완료' 등 법적 판단"
올바른_접근: "'GDPR Art.32 기준 기술적 보호조치 명세' — 법무 검토 필요 부기"
Over_Loading:
설명: "모든 표준 YAML을 한 번에 로드하여 토큰 낭비"
- 올바른_접근: "도메인·컴포넌트에 매칭된 파일만 조건부 Read"
+ 올바른_접근: "도메인·위협에 매칭된 파일만 조건부 Read"
Code_Analysis:
- 설명: "소스코드를 분석하거나 Finding을 생성"
- 올바른_접근: "PRD 텍스트만 분석. 코드 진단은 /ch015:va로 위임"
+ 설명: "소스코드를 분석하거나 코드 기반 Finding을 생성"
+ 올바른_접근: "문서 텍스트만 분석. 코드 진단은 /ch015:va로 위임"
+
+ Zero_Risk_Pretense:
+ 설명: "'이 의견을 모두 반영하면 보안 완료' 등 절대 안전 암시"
+ 올바른_접근: "Risk Acceptance 섹션으로 잔여 위험 명시. 보안은 지속적 프로세스"
+
+ MUST_Inflation:
+ 설명: "대부분의 의견을 MUST로 분류하여 과잉 설계 유도"
+ 올바른_접근: "MUST ≤ 50% 품질 게이트. 방어 심층은 SHOULD로 분류"
+
+ Orphan_Threat:
+ 설명: "위협을 식별했으나 표준 근거 없이 의견만 생성"
+ 올바른_접근: "모든 MUST/MUST NOT에 CWE/OWASP/NIST 근거 필수"
```
---
## Root Cause 해당 없음
이 스킬은 기존 코드의 문제를 진단하지 않으므로 Root Cause Classification을 사용하지 않습니다.
- 출력은 Finding이 아닌 **SEC 구현 명세**입니다.
+ 출력은 코드 Finding이 아닌 **보안 의견서** 또는 **보안 검토 의견서**입니다.