📝 docs: 여러 문서 및 파일 삭제
This commit is contained in:
141
.claude/skills/security-review/SKILL.md
Normal file
141
.claude/skills/security-review/SKILL.md
Normal file
@@ -0,0 +1,141 @@
|
||||
---
|
||||
name: security-review
|
||||
description: |
|
||||
프론트엔드 코드에서 XSS, CSRF, 민감 정보 하드코딩, npm 의존성 취약점을 자동 감지하고
|
||||
우선순위별 보안 리포트와 패치 가이드를 생성합니다.
|
||||
|
||||
다음 상황에서 반드시 사용하세요:
|
||||
- "보안 점검해줘", "취약점 검사해줘", "npm audit 분석해줘"
|
||||
- PR/배포 전 보안 체크리스트를 확인할 때
|
||||
- 민감 정보 하드코딩이 의심될 때
|
||||
---
|
||||
|
||||
# 프론트엔드 보안 검토 (security-review)
|
||||
|
||||
코드베이스 + npm audit → XSS / CSRF / 민감 정보 / 의존성 취약점 자동 스캔 → 보안 리포트.
|
||||
|
||||
## 언제 사용하는가
|
||||
|
||||
- PR 머지 전 보안 사전 검토
|
||||
- 배포 전 최종 보안 체크리스트
|
||||
- 의존성 업데이트 후 취약점 확인
|
||||
|
||||
## 스캔 범위
|
||||
|
||||
| 항목 | 설명 |
|
||||
|---|---|
|
||||
| XSS | `v-html`, `innerHTML`, `dangerouslySetInnerHTML` 사용 |
|
||||
| 민감 정보 하드코딩 | API 키, 토큰, 비밀번호, 시크릿 리터럴 |
|
||||
| CSRF | `SameSite` 쿠키 설정, CORS 구성 |
|
||||
| 오픈 리다이렉트 | 검증 없는 외부 URL 리다이렉트 |
|
||||
| npm 의존성 취약점 | CVE 등급별 취약 패키지 |
|
||||
| 환경 변수 노출 | `NUXT_PUBLIC_` 외 시크릿을 클라이언트에 노출 |
|
||||
|
||||
---
|
||||
|
||||
## 작업 순서
|
||||
|
||||
### Phase 1: 코드 정적 분석
|
||||
|
||||
1. 소스 파일을 스캔해 아래 패턴을 탐지한다.
|
||||
|
||||
#### XSS 위험
|
||||
```vue
|
||||
<!-- ⚠️ 위험: v-html에 사용자 입력 직접 바인딩 -->
|
||||
<div v-html="userInput" />
|
||||
|
||||
<!-- ✅ 안전: DOMPurify로 새니타이징 -->
|
||||
<div v-html="sanitize(userInput)" />
|
||||
```
|
||||
|
||||
탐지 패턴:
|
||||
- `v-html` + 사용자 입력 변수 바인딩
|
||||
- `innerHTML =` 직접 할당
|
||||
- `eval()`, `Function()` 사용
|
||||
|
||||
#### 민감 정보 하드코딩
|
||||
탐지 패턴:
|
||||
- `apiKey`, `api_key`, `secret`, `password`, `token` 변수에 리터럴 문자열 할당
|
||||
- `.env` 파일이 아닌 소스 코드에 키 형태 문자열 (예: `sk-...`, `Bearer ...`)
|
||||
- `nuxt.config.ts`에 시크릿을 `public` 섹션에 노출
|
||||
|
||||
```ts
|
||||
// ⚠️ 위험
|
||||
const apiKey = 'sk-abc123...'
|
||||
|
||||
// ✅ 안전
|
||||
const apiKey = useRuntimeConfig().apiKey // 서버 전용
|
||||
```
|
||||
|
||||
#### 오픈 리다이렉트
|
||||
```ts
|
||||
// ⚠️ 위험: 검증 없는 외부 URL 리다이렉트
|
||||
const to = route.query.redirect as string
|
||||
navigateTo(to)
|
||||
|
||||
// ✅ 안전: 내부 경로만 허용
|
||||
const to = route.query.redirect as string
|
||||
if (to && to.startsWith('/')) navigateTo(to)
|
||||
```
|
||||
|
||||
#### Nuxt 환경 변수 분리 확인
|
||||
- 서버 전용 시크릿: `runtimeConfig.apiSecret` (클라이언트 미노출)
|
||||
- 공개 가능한 값만: `runtimeConfig.public.apiBase`
|
||||
|
||||
### Phase 2: npm 의존성 취약점 스캔
|
||||
|
||||
```bash
|
||||
npm audit --json
|
||||
```
|
||||
|
||||
결과를 파싱해 CVE 등급별로 분류:
|
||||
- **Critical / High**: 즉시 패치 필요
|
||||
- **Moderate**: 스프린트 내 패치
|
||||
- **Low**: 모니터링
|
||||
|
||||
각 취약 패키지에 대해 안전 버전 및 업그레이드 명령어를 제시한다.
|
||||
|
||||
### Phase 3: 보안 헤더 확인
|
||||
|
||||
`nuxt.config.ts`의 `routeRules` 또는 서버 설정에서 아래 헤더를 확인한다:
|
||||
|
||||
```ts
|
||||
// nuxt.config.ts 권장 보안 헤더
|
||||
routeRules: {
|
||||
'/**': {
|
||||
headers: {
|
||||
'X-Content-Type-Options': 'nosniff',
|
||||
'X-Frame-Options': 'DENY',
|
||||
'Referrer-Policy': 'strict-origin-when-cross-origin',
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 출력 형식
|
||||
|
||||
```
|
||||
## 보안 검토 리포트
|
||||
|
||||
### 🔴 Critical (즉시 조치)
|
||||
- [파일:라인] 취약점 설명 + 수정 코드
|
||||
|
||||
### 🟡 High (스프린트 내 조치)
|
||||
- [파일:라인] 취약점 설명 + 개선 방향
|
||||
|
||||
### 🟢 Moderate / Low
|
||||
- [목록]
|
||||
|
||||
### npm 취약점
|
||||
- Critical: N건 — `npm audit fix --force` 권장 패키지: [목록]
|
||||
- High: N건 — 안전 버전: [버전 목록]
|
||||
|
||||
### 보안 헤더 현황
|
||||
- 적용됨: [목록]
|
||||
- 미적용: [목록 + 추가 코드]
|
||||
|
||||
### ✅ 정상 항목
|
||||
- 환경 변수 분리 적절, v-html 미사용 등
|
||||
```
|
||||
Reference in New Issue
Block a user