# InsuRo 보안 취약점 수정 — MEDIUM 7건 + LOW 4건

## 작업 레벨: Lv.2

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`
- 서버: `/home/jay/projects/InsuRo/server`

## 참고: 보안 감사 상세 보고서
- `/home/jay/workspace/memory/reports/insuro-security-audit-2026-04.md` 반드시 읽을 것

## 수정 사항 (11건)

### MEDIUM 1: 인증 없는 엔드포인트 — generate-queue-status
**파일**: main.py:1328-1331
`Depends(verify_jwt)` 추가.

### MEDIUM 2: CORS 와일드카드 제한
**파일**: main.py:184-201
`allow_methods=["GET","POST","PUT","DELETE","PATCH"]`
`allow_headers=["Content-Type","Authorization","X-Requested-With"]`

### MEDIUM 3: 파일 변환 엔드포인트 인증
(HIGH 6과 동일 — CRITICAL/HIGH 태스크에서 처리. 여기서는 스킵)

### MEDIUM 4: CSP 헤더 추가
`public/_headers`에 Content-Security-Policy 추가:
```
/*
  Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: blob: https:; connect-src 'self' https://*.supabase.co https://aidevserver.tail2cdab6.ts.net:*;
```

### MEDIUM 5: 보안 이벤트 로깅 강화
인증 실패, 권한 거부, rate limit 초과 시 로깅 추가 (현재 일부 누락).

### MEDIUM 6: remaining-seats 인증 추가 검토
`/api/insuro/premium/remaining-seats` — 의도적 공개이지만, 민감 정보(잔여 좌석 수) 노출. rate limit만 추가.

### MEDIUM 7: PII 로그 마스킹 강화
`_sanitize_pii` 함수가 있지만 모든 로그에 적용되지 않음. 에러 로그에 고객명/파일명 포함 시 마스킹 적용.

### LOW 1: MD5 → SHA256 교체
**파일**: main.py:2819
`hashlib.md5` → `hashlib.sha256`

### LOW 2: CSRF 방어
Supabase JWT 기반 인증이므로 CSRF 위험 낮음. 추가 방어로 `SameSite=Strict` 쿠키 설정 확인.

### LOW 3: SRI (Subresource Integrity)
외부 CDN 리소스에 integrity 속성 추가 (현재 fonts.googleapis.com만 사용).

### LOW 4: Rate limit 세분화
일부 엔드포인트의 rate limit을 기능별로 세분화 (예: AI 생성 5/minute, 일반 조회 30/minute).

## affected_files
- `server/main.py` (수정 — CORS, 인증, 로깅, MD5, rate limit)
- `public/_headers` (수정 — CSP 추가)
- `index.html` (확인 — SRI)

## 검증 시나리오
1. CORS: 와일드카드 메서드 → 명시적 메서드만 허용
2. CSP: 브라우저 개발자 도구에서 CSP 헤더 확인
3. generate-queue-status: 인증 없이 접근 → 401
4. MD5 → SHA256 교체 확인
5. npm run build 성공
6. 기존 기능 정상 작동 (로그인, 콘텐츠 생성, 증권분석)