# 런칭 전 보안 체크리스트 (전체)

> 작성일: 2026-03-23 | 작성팀: dev2-team | task-828.1
> PentAGI 분석 기반 + OWASP Top 10 (2021) + OWASP API Security Top 10 (2023) 매핑
> 작성자: 헤임달(Heimdal) — dev2-team 보안 테스터

---

## 1. 우리 시스템 보안 위협 매핑

### 1.1 InsuRo (Next.js + Firebase + Vercel)

공격 표면 전체 나열:

- **Next.js SSR/SSG 렌더링 취약점**: 서버 사이드 렌더링 과정에서 사용자 입력이 HTML에 직접 삽입될 경우 XSS 발생 가능. `dangerouslySetInnerHTML` 사용 지점 전수 조사 필요. SSG 빌드 시 민감 데이터가 정적 파일에 포함되는 케이스 확인
- **SSRF (Server-Side Request Forgery)**: API Routes에서 외부 URL을 파라미터로 받아 fetch하는 패턴 존재 시 내부 Firebase 메타데이터 또는 Vercel 내부 서비스 접근 가능
- **Firebase Auth 설정 미비**: 이메일 열거(Email Enumeration) 공격 — "존재하지 않는 이메일" vs "비밀번호 불일치" 오류 메시지 차별화로 계정 존재 여부 파악 가능. 비밀번호 정책(최소 길이/복잡도) 미적용 시 브루트포스 취약
- **Firestore Rules 인가 우회**: 와일드카드(`match /{document=**}`) 남용, 재귀 규칙으로 의도치 않은 컬렉션 노출. `request.auth == null` 체크 누락 시 미인증 접근 허용
- **Firebase Storage Rules 미흡**: 파일 확장자/MIME 타입 제한 없을 경우 악성 파일 업로드. 경로 예측 가능한 패턴 사용 시 타 사용자 파일 접근 가능
- **Vercel Edge Functions**: 환경변수가 Edge Runtime에서 `process.env`로 클라이언트 번들에 포함될 위험. 빌드 캐시에 이전 배포의 민감 정보 잔류 가능
- **API Routes 취약점**: 입력 검증(Input Validation) 부재, Rate Limiting 미적용으로 자동화 공격 허용. `req.body` 직접 사용 시 NoSQL Injection 가능
- **Client-side 데이터 노출**: `NEXT_PUBLIC_` 접두사 환경변수는 브라우저 번들에 포함됨. Firebase API Key, 프로젝트 ID 등이 노출되어 프로젝트 열거/남용 가능
- **Third-party 의존성 취약점**: npm 패키지 Supply Chain Attack. 악성 패키지가 빌드 또는 런타임에 주입될 수 있음. `npm audit` 정기 실행 필요

### 1.2 InsuWiki (Next.js + Firebase)

InsuRo와 동일한 Next.js + Firebase 구조이므로 1.1의 모든 위협 동일 적용, 추가 위협:

- **콘텐츠 주입**: 위키 특성상 사용자 생성 콘텐츠(UGC)가 많아 Stored XSS 위험 높음. Markdown/HTML 렌더링 시 sanitization 필수
- **검색 기능 악용**: Firestore 검색 쿼리 조작으로 다른 사용자의 문서 열거 가능. 검색어에 특수문자 주입 시 쿼리 구조 변경 가능성 검토
- **대량 데이터 노출**: 위키 특성상 공개 문서가 많아 민감 정보(개인정보, 사업 정보)가 실수로 공개 컬렉션에 저장될 위험

### 1.3 아누(Anu) 서버 (Ubuntu + Python)

- **SSH 접근 제어**: 기본 포트(22) 사용, 비밀번호 인증 허용 시 브루트포스 공격 취약. root 직접 로그인 허용 여부 확인
- **Python 웹 서버 취약점**: 개발 서버(`flask run`, `uvicorn --reload`) 를 운영 환경에서 사용 시 디버그 모드 노출. 입력 값을 `eval()`/`exec()`에 전달 시 코드 실행 취약점
- **시스템 레벨 권한 상승**: `sudo` 설정 과다 허용, SUID 바이너리 악용, `/etc/passwd` 수정 권한 오픈 등
- **파일 시스템 접근 제어**: Path Traversal — `../` 시퀀스로 웹루트 외부 파일 접근. 업로드 디렉토리가 웹에서 직접 접근 가능한 경우
- **네트워크 방화벽**: 불필요한 포트 오픈(데이터베이스 포트, 개발 서버 포트 등). 내부 서비스가 외부 IP로 바인딩된 경우
- **프로세스 격리**: Python 프로세스가 root 권한으로 실행될 경우 취약점 악용 시 전체 서버 장악 가능

### 1.4 API 통신 (HMAC-SHA256)

- **재전송 공격 (Replay Attack)**: 동일한 HMAC 서명 요청을 캡처한 후 재전송하여 중복 처리 유발. 타임스탬프 기반 nonce 없이 서명만 검증 시 취약
- **타임스탬프 검증**: 요청 타임스탬프와 서버 시각의 허용 오차(skew) 설정 미비 시 오래된 요청 재사용 가능. NTP 동기화 확인 필요
- **키 관리 문제**: HMAC 시크릿 키 소스코드/환경변수에 하드코딩 여부. 키 로테이션(rotation) 정책 부재 시 유출된 키가 영구 사용 가능
- **서명 알고리즘 다운그레이드**: `algorithm` 파라미터를 클라이언트가 제어할 경우 약한 알고리즘(MD5, SHA1)으로 교체 가능

### 1.5 Firestore Rules

- **읽기/쓰기 권한 분리**: `allow read, write: if true` 같은 무분별한 허용 규칙. 읽기와 쓰기를 각각 명시적으로 분리하지 않으면 불필요한 권한 부여
- **사용자별 데이터 격리**: `request.auth.uid == resource.data.userId` 같은 소유권 검증 없이 문서 ID만으로 접근 허용 시 수평 권한 상승
- **관리자 권한 검증**: Custom Claims 기반 관리자 권한을 `request.auth.token.admin == true`로 검증하는 규칙 미적용 시 일반 사용자의 관리자 기능 접근 가능

---

## 2. OWASP Top 10 (2021) 전체 매핑

### A01:2021 — Broken Access Control

- [ ] Firestore Rules에서 인가 우회 가능성 테스트 (Firebase Emulator Suite Rules Simulator 활용)
- [ ] API Route에서 인증 없이 접근 가능한 엔드포인트 전수 스캔 (Burp Suite / httpx 활용)
- [ ] Firebase Auth UID 기반 접근 제어 검증 — 다른 UID로 문서 접근 시도
- [ ] 수평 권한 상승 (Horizontal Privilege Escalation) 테스트 — 다른 사용자의 보험 데이터 접근
- [ ] 수직 권한 상승 (Vertical Privilege Escalation) 테스트 — 관리자 전용 기능(통계, 삭제 등) 접근
- [ ] CORS 설정 검증 — `Origin` 헤더 조작으로 크로스 도메인 요청 허용 여부
- [ ] 디렉토리 트래버설 (Directory Traversal) 테스트 — `/api/files?path=../../etc/passwd`
- [ ] JWT/세션 쿠키 메타데이터 조작 — `alg:none` JWT 공격, 세션 고정 공격
- [ ] Force Browsing — 추측 가능한 URL로 인증 없이 관리자 페이지 접근

### A02:2021 — Cryptographic Failures

- [ ] HTTPS 강제 적용 확인 — HTTP 요청 시 HTTPS 리다이렉트 동작 검증
- [ ] TLS 버전 검증 — TLS 1.0/1.1 비활성화 확인 (sslscan 활용)
- [ ] 암호화 스위트 검증 — 취약한 암호화 알고리즘(RC4, 3DES, NULL) 비활성화 확인
- [ ] 민감 데이터 평문 저장 여부 — Firestore 문서에 비밀번호, 주민번호, 카드번호 평문 저장 확인
- [ ] 로그에 민감 데이터 노출 여부 — Vercel 함수 로그, Firebase 로그 검토
- [ ] API 키/비밀 하드코딩 검색 — `.env`, `next.config.js`, Git 히스토리 내 시크릿 검색
- [ ] HMAC-SHA256 시크릿 키 강도 검증 — 최소 256비트 엔트로피 확인
- [ ] 환경변수 관리 — Vercel 대시보드 Production/Preview/Development 분리 확인

### A03:2021 — Injection

- [ ] XSS Reflected — URL 파라미터, 쿼리스트링이 페이지에 반사되는 지점 테스트
- [ ] XSS Stored — 보험 견적 이름, 메모 등 사용자 입력 저장 후 렌더링 지점 테스트
- [ ] XSS DOM-based — `location.hash`, `document.referrer` 등 DOM 소스에서 Sink로의 흐름 테스트
- [ ] NoSQL Injection — Firestore 쿼리에 `{ "$gt": "" }`, `{ "$where": "..." }` 형태 주입 시도
- [ ] Server-Side Template Injection (SSTI) — Next.js SSR에서 템플릿 문자열에 `{{7*7}}` 주입
- [ ] 명령 주입 (Command Injection) — 아누 서버 Python에서 `subprocess`, `os.system` 입력값 검증
- [ ] Header Injection — `Host`, `X-Forwarded-For`, `Referer` 헤더 조작
- [ ] 이메일 헤더 주입 — 이메일 발송 기능에서 `To:`, `Subject:` 필드 개행문자 주입

### A04:2021 — Insecure Design

- [ ] 비즈니스 로직 결함 — 보험 견적 금액 파라미터 직접 조작 가능 여부
- [ ] 비교 기능 조작 — 보험 상품 비교 로직에서 가격/조건 임의 변경 가능 여부
- [ ] Rate Limiting 부재 — 로그인, 견적 요청, 이메일 발송 API에 초당 요청 제한 적용 여부
- [ ] 멱등성 (Idempotency) 처리 — 중복 결제/신청 방지 로직 구현 여부
- [ ] 에러 메시지 정보 노출 — 스택 트레이스, DB 오류, 내부 경로 노출 여부
- [ ] 안전하지 않은 직접 객체 참조 — 예측 가능한 ID(1, 2, 3...)로 타 사용자 데이터 접근

### A05:2021 — Security Misconfiguration

- [ ] Firebase 프로젝트 설정 — 불필요한 인증 프로바이더 비활성화 (전화번호 인증 등)
- [ ] Vercel 보안 헤더 — `next.config.js`의 `headers()` 설정 검토
- [ ] Content-Security-Policy (CSP) 헤더 적용 및 `unsafe-inline`, `unsafe-eval` 사용 여부
- [ ] X-Frame-Options: DENY 설정 확인 (Clickjacking 방지)
- [ ] HSTS (Strict-Transport-Security) 헤더 설정 — `max-age` 최소 1년
- [ ] Next.js `poweredByHeader` 비활성화 (`X-Powered-By: Next.js` 노출 방지)
- [ ] Next.js 디버그 모드 — 운영 환경에서 `NODE_ENV=production` 확인
- [ ] 에러 페이지 정보 노출 — 500 에러에서 스택 트레이스 숨김 처리 확인
- [ ] CORS 와일드카드 (`*`) 사용 제한 — 특정 허용 오리진 목록 설정
- [ ] 불필요한 HTTP 메서드 — PUT, DELETE, TRACE, OPTIONS 허용 여부 검토

### A06:2021 — Vulnerable and Outdated Components

- [ ] `npm audit --audit-level=high` 실행 — High/Critical 취약점 목록 확인 및 패치
- [ ] `pip audit` 실행 (아누 서버) — Python 패키지 취약점 확인
- [ ] 의존성 최신 버전 확인 — Next.js, Firebase SDK, React 최신 보안 패치 적용
- [ ] 사용하지 않는 의존성 제거 — 공격 표면 최소화
- [ ] Firebase SDK 버전 확인 — Firebase 9.x 모듈식 SDK 사용 권장
- [ ] `package-lock.json` / `requirements.txt` 버전 고정 확인

### A07:2021 — Identification and Authentication Failures

- [ ] Firebase Auth 이메일 열거 방지 — 존재/미존재 계정에 동일한 오류 메시지 반환 확인
- [ ] 비밀번호 정책 검증 — 최소 12자, 대/소문자/숫자/특수문자 조합 강제 여부
- [ ] 세션 만료 설정 — Firebase ID Token 갱신 주기 및 무효화 로직 확인
- [ ] 세션 무효화 — 로그아웃 시 서버 사이드 세션/토큰 무효화 처리
- [ ] MFA (Multi-Factor Authentication) 지원 여부 — 고위험 작업에 MFA 적용
- [ ] OAuth 설정 검증 — Google/GitHub OAuth Redirect URI 화이트리스트 확인
- [ ] 비밀번호 재설정 플로우 — 재설정 링크 만료 시간(15분 이하) 및 일회성 사용 확인
- [ ] 계정 잠금 정책 — 연속 5회 실패 시 임시 잠금 적용 여부

### A08:2021 — Software and Data Integrity Failures

- [ ] CI/CD 파이프라인 보안 — GitHub Actions 시크릿 관리, 외부 Action 버전 고정
- [ ] 의존성 무결성 — `package-lock.json` Git 커밋 확인, `npm ci` 사용
- [ ] Vercel 배포 프로세스 보안 — Preview 배포 외부 노출 제한
- [ ] 서드파티 스크립트 SRI (Subresource Integrity) — CDN 스크립트에 `integrity` 해시 적용
- [ ] 자동 업데이트 검증 — Dependabot PR 검토 절차 수립

### A09:2021 — Security Logging and Monitoring Failures

- [ ] 인증 실패 로깅 — 로그인 실패 이벤트 기록 (IP, 타임스탬프, 계정)
- [ ] 접근 제어 실패 로깅 — Firestore Rules 거부 이벤트 Firebase 콘솔에서 모니터링
- [ ] 서버 에러 로깅 — 500 에러를 Vercel 로그 또는 Sentry에 집계
- [ ] 아누 서버 로그 — `/var/log/auth.log` SSH 로그인 기록 보존 및 모니터링
- [ ] 알림 설정 — 이상 행위 감지 시 Slack/이메일 알림 (Firestore 과다 읽기, 연속 인증 실패)
- [ ] 로그 보존 기간 — 최소 90일 이상 보존 정책 수립
- [ ] 로그 무결성 — 로그 파일 권한 설정으로 변조 방지

### A10:2021 — Server-Side Request Forgery (SSRF)

- [ ] URL 파라미터 기반 외부 요청 검증 — API Routes에서 사용자 입력 URL 사용 여부 확인
- [ ] 내부 메타데이터 서비스 접근 차단 — `169.254.169.254` (AWS/GCP 메타데이터) 접근 차단
- [ ] Vercel 내부 서비스 접근 차단 — `localhost`, `127.0.0.1`, `0.0.0.0` URL 차단
- [ ] DNS Rebinding 방지 — 요청 전 DNS 재확인 또는 IP 화이트리스트 검증
- [ ] 허용 도메인 화이트리스트 — 외부 요청 가능한 도메인 명시적 화이트리스트 관리
- [ ] URL 스킴 제한 — `file://`, `gopher://`, `ftp://` 등 허용하지 않는 스킴 차단

---

## 3. OWASP API Security Top 10 (2023) 전체 매핑

### API1:2023 — Broken Object Level Authorization (BOLA)

- [ ] 모든 API 엔드포인트에서 객체 소유권 검증 — 요청한 사용자가 해당 객체의 소유자인지 확인
- [ ] Firestore 문서 ID 예측/열거 테스트 — 순차 ID 사용 시 타 사용자 문서 접근 가능 여부
- [ ] 보험 견적 ID 타인 조회 가능 여부 — `/api/quotes/{id}` 타 사용자 견적 접근 차단
- [ ] 사용자 프로필 ID 기반 접근 — 타 사용자 프로필 수정/삭제 시도

### API2:2023 — Broken Authentication

- [ ] API 키/토큰 인증 구현 검증 — Bearer 토큰 없이 API 요청 허용 여부
- [ ] 토큰 만료 및 갱신 메커니즘 — Firebase ID Token (1시간) 만료 후 갱신 로직 검증
- [ ] 토큰 서명 검증 — JWT 서명 없이 (`alg: none`) 토큰 수락 여부
- [ ] API 키 노출 여부 — 클라이언트 번들, Git 히스토리, 응답 헤더에서 API 키 검색

### API3:2023 — Broken Object Property Level Authorization

- [ ] API 응답에서 민감 필드 노출 여부 — 내부 필드(userId, adminFlag 등) 클라이언트 노출
- [ ] Mass Assignment 취약점 — `PUT /api/users/me` 요청에 `isAdmin: true` 주입 가능 여부
- [ ] 응답 필드 필터링 — 사용자 역할에 따른 응답 데이터 차등 노출 구현 여부

### API4:2023 — Unrestricted Resource Consumption

- [ ] Rate Limiting 구현 — 로그인 API: 분당 5회, 견적 API: 분당 10회 등 제한 설정
- [ ] 페이지네이션 제한 — 단일 요청으로 전체 데이터 조회 (`limit=99999`) 차단
- [ ] 파일 업로드 크기 제한 — Firebase Storage 업로드 최대 크기(예: 5MB) 제한
- [ ] Firestore 쿼리 복잡도 제한 — 중첩 쿼리, 대규모 컬렉션 그룹 쿼리 남용 방지
- [ ] 응답 타임아웃 설정 — 장시간 처리 요청에 대한 서버 사이드 타임아웃 적용

### API5:2023 — Broken Function Level Authorization

- [ ] 관리자 전용 API 접근 제어 — `/api/admin/*` 엔드포인트 역할 기반 접근 제어 확인
- [ ] HTTP 메서드 기반 접근 제어 — GET과 DELETE가 동일 인증으로 처리되는지 확인
- [ ] 미공개 API 엔드포인트 — 개발 중 임시 엔드포인트가 운영 환경에 노출 여부

### API6:2023 — Unrestricted Access to Sensitive Business Flows

- [ ] 보험 견적 요청 남용 방지 — 자동화 스크립트로 대량 견적 생성 차단 로직 확인
- [ ] 봇/자동화 탐지 — reCAPTCHA, 허니팟 필드 등 봇 차단 메커니즘 적용 여부
- [ ] 가격 비교 API 남용 — 경쟁사 데이터 수집 목적의 대량 API 호출 탐지 및 차단

### API7:2023 — Server Side Request Forgery

- [ ] URL 입력 검증 — API 파라미터에서 URL을 직접 받아 요청하는 패턴 검토
- [ ] 허용 도메인 화이트리스트 — 외부 API 연동 시 허용 도메인 명시적 관리
- [ ] 응답 내용 필터링 — 내부 서비스 응답이 외부에 그대로 반환되는지 확인

### API8:2023 — Security Misconfiguration

- [ ] CORS 설정 — API Routes의 `Access-Control-Allow-Origin` 특정 도메인 제한
- [ ] 에러 핸들링 — API 오류 응답에서 내부 구조 정보 노출 최소화
- [ ] 불필요한 엔드포인트 비활성화 — 개발/테스트용 API 운영 환경 제거 확인
- [ ] HTTP 응답 헤더 — 서버 기술 스택 정보 노출 헤더(`Server`, `X-Powered-By`) 제거

### API9:2023 — Improper Inventory Management

- [ ] API 버전 관리 — 구버전 API(`/api/v1/*`) 비활성화 또는 보안 패치 적용 여부
- [ ] 사용하지 않는 API 엔드포인트 비활성화 — 기능 폐기 후 엔드포인트 제거 확인
- [ ] API 문서화 — OpenAPI Spec 기반 API 목록 최신화 및 내부 전용 문서 관리

### API10:2023 — Unsafe Consumption of APIs

- [ ] 외부 API 응답 검증 — 보험사 API, 외부 데이터 제공자 응답의 스키마 검증
- [ ] 외부 API 오류 처리 — 외부 API 장애 시 적절한 Fallback 및 오류 메시지 처리
- [ ] 외부 API 인증 정보 관리 — 외부 API 키 환경변수 관리 및 권한 최소화

---

## 4. Firebase 특화 보안 체크리스트

### 4.1 Firestore Rules

- [ ] 기본 deny 규칙 설정 — `allow read, write: if false` 를 기본으로 필요한 규칙만 추가
- [ ] 읽기/쓰기 분리 — `allow read` 와 `allow write` 를 별도로 정의
- [ ] 컬렉션별 접근 제어 — `match /users/{userId}`, `match /quotes/{quoteId}` 각각 명시적 규칙
- [ ] `request.auth` null 체크 — `request.auth != null` 조건 없는 규칙 존재 여부 전수 확인
- [ ] 데이터 유효성 검증 — `request.resource.data` 를 통해 필드 타입/형식 검증
- [ ] 필드별 쓰기 제한 — `allow update: if request.resource.data.keys().hasOnly([...])` 로 수정 가능 필드 제한
- [ ] 배치 쓰기 제한 — 대량 쓰기 작업으로 데이터 무결성 훼손 방지
- [ ] Firebase Emulator Suite 시뮬레이터 테스트 통과 — 모든 Rules 유닛 테스트 작성 및 통과 확인
- [ ] `get()` / `exists()` 을 통한 외부 문서 참조 시 무한 재귀 주의

### 4.2 Firebase Auth

- [ ] 이메일/비밀번호 정책 강화 — Firebase Auth 비밀번호 최소 강도 설정 확인
- [ ] OAuth 프로바이더 설정 — 사용하는 프로바이더만 활성화 (불필요한 프로바이더 비활성화)
- [ ] 이메일 열거 보호 — 이메일 인증에서 동일한 오류 메시지 반환 확인
- [ ] 사용자 삭제 정책 — 탈퇴 시 Firestore 데이터 연동 삭제 처리 (Cloud Functions 활용)
- [ ] Custom Claims 검증 — 관리자 권한 Custom Claims 서버 사이드에서만 설정 가능 확인
- [ ] 세션 관리 — Firebase 세션 쿠키 `httpOnly`, `secure` 플래그 설정 확인

### 4.3 Firebase Storage Rules

- [ ] 파일 타입 제한 — `request.resource.contentType.matches('image/.*')` 등 MIME 타입 검증
- [ ] 파일 크기 제한 — `request.resource.size < 5 * 1024 * 1024` (5MB) 등 최대 크기 제한
- [ ] 경로 기반 접근 제어 — `match /users/{userId}/{allPaths=**}` 사용자별 경로 격리
- [ ] 사용자별 격리 — 자신의 파일만 읽기/쓰기/삭제 가능하도록 `request.auth.uid == userId` 검증

### 4.4 Cloud Functions 보안

- [ ] 환경변수 관리 — Firebase Functions config 또는 Secret Manager 사용
- [ ] 입력 검증 — Cloud Functions HTTP 트리거에서 모든 입력값 유효성 검사
- [ ] 에러 처리 — 스택 트레이스 등 내부 정보가 클라이언트 응답에 포함되지 않도록 처리
- [ ] 타임아웃 설정 — 최대 실행 시간 설정으로 DoS 방지 (기본 60초, 최대 540초)
- [ ] 메모리 제한 — 불필요한 메모리 할당 방지 설정

---

## 5. Vercel 특화 보안 체크리스트

### 5.1 Edge Functions

- [ ] 실행 시간 제한 — Edge Functions의 CPU 제한(1.5초) 내 처리 가능한 로직 확인
- [ ] 메모리 제한 — Edge Runtime의 128MB 메모리 제한 내 동작 확인
- [ ] 에러 처리 — Edge Function 오류 시 민감 정보 포함된 응답 반환 방지

### 5.2 환경변수

- [ ] Production/Preview/Development 분리 — 환경별 다른 Firebase 프로젝트/API 키 사용
- [ ] `NEXT_PUBLIC_` 접두사 최소화 — 클라이언트 번들에 포함되는 변수 목록 검토
- [ ] 민감 정보 암호화 — Vercel에서 암호화 저장되는 Environment Variables 사용
- [ ] `.env.local` 파일 — `.gitignore` 포함 여부 확인, Git 히스토리에서 시크릿 노출 여부 확인

### 5.3 빌드 보안

- [ ] 빌드 로그 민감 정보 검토 — Vercel 빌드 로그에서 API 키, 시크릿 출력 여부 확인
- [ ] 빌드 캐시 정책 — 캐시된 빌드 아티팩트에 민감 정보 포함 여부
- [ ] Preview 배포 접근 제어 — Preview URL에 비밀번호 보호 또는 IP 제한 적용

### 5.4 보안 헤더 (`next.config.js`)

- [ ] `Content-Security-Policy` (CSP) — `script-src`, `connect-src`, `img-src` 소스 화이트리스트
- [ ] `X-Content-Type-Options: nosniff` — MIME 타입 스니핑 방지
- [ ] `X-Frame-Options: DENY` — Clickjacking 방지 (또는 `Content-Security-Policy: frame-ancestors 'none'`)
- [ ] `X-XSS-Protection: 1; mode=block` — 레거시 브라우저 XSS 필터 활성화
- [ ] `Strict-Transport-Security: max-age=31536000; includeSubDomains; preload` — HTTPS 강제
- [ ] `Referrer-Policy: strict-origin-when-cross-origin` — 레퍼러 정보 노출 최소화
- [ ] `Permissions-Policy` — 불필요한 브라우저 API 접근 제한 (camera, microphone, geolocation)

---

## 6. 인증/인가 체크리스트
(Firebase Auth + HMAC 기반)

- [ ] Firebase ID Token 검증 — 서버 사이드에서 `admin.auth().verifyIdToken()` 으로 토큰 검증
- [ ] HMAC-SHA256 서명 검증 — 요청마다 시크릿 키 기반 서명 일치 여부 확인
- [ ] HMAC 타임스탬프 검증 — 요청 타임스탬프가 현재 시각 ±5분 이내인지 확인
- [ ] HMAC Nonce 사용 — 요청별 고유 nonce 생성 및 단일 사용 보장으로 재전송 공격 방지
- [ ] 역할 기반 접근 제어 (RBAC) — 사용자 역할(일반, 관리자)에 따른 API 접근 제어 구현
- [ ] Firebase Custom Claims — 관리자 역할을 Custom Claims에 설정하고 Firestore Rules에서 검증
- [ ] 토큰 갱신 로직 — Firebase ID Token 만료(1시간) 전 자동 갱신 처리 확인
- [ ] 로그아웃 처리 — `firebase.auth().signOut()` 후 서버 사이드 세션 무효화 확인
- [ ] 계정 비활성화 처리 — 비활성화된 Firebase 사용자의 토큰 즉시 거부 확인
- [ ] OAuth 상태 파라미터 — OAuth 인증 플로우에서 `state` 파라미터로 CSRF 방지
- [ ] 비밀번호 변경 후 기존 세션 무효화 — 비밀번호 변경 시 다른 기기의 세션 만료 처리
- [ ] 관리자 API 별도 인증 레이어 — 관리자 전용 기능에 추가 인증(MFA, IP 제한) 적용

---

## 7. 입력 검증 체크리스트

- [ ] 모든 API Route 입력값 서버 사이드 검증 — 클라이언트 검증에만 의존하지 않기
- [ ] 입력 데이터 타입 검증 — 숫자 필드에 문자열, 날짜 필드에 임의값 주입 시 거부 확인
- [ ] 입력 길이 제한 — 이름(100자), 주소(500자) 등 필드별 최대 길이 제한 구현
- [ ] 특수문자 이스케이프 처리 — HTML 특수문자(`<`, `>`, `&`, `"`, `'`) 이스케이프 확인
- [ ] 파일 업로드 검증 — 파일 확장자 화이트리스트, MIME 타입 확인, 매직 바이트 검증
- [ ] URL/이메일 형식 검증 — 정규식 기반 이메일 형식 검증 (ReDoS 취약 정규식 주의)
- [ ] 숫자 범위 검증 — 보험료, 나이 등 숫자 필드의 유효 범위(0 이상, 최대값) 확인
- [ ] JSON 페이로드 크기 제한 — 요청 바디 최대 크기 설정으로 DoS 방지
- [ ] 날짜 형식 및 범위 검증 — ISO 8601 형식 강제, 미래/과거 날짜 제한 확인
- [ ] SQL/NoSQL 메타문자 필터링 — Firestore 쿼리 파라미터에서 제어 문자 필터링
- [ ] 전화번호 형식 검증 — 국제 표준 형식 검증 및 비정상 문자 차단
- [ ] Zod/Yup 스키마 검증 라이브러리 활용 — 프론트엔드와 API Route 양쪽 스키마 공유

---

## 8. 세션 관리 체크리스트

- [ ] 세션 만료 시간 설정 — Firebase ID Token: 1시간, Refresh Token: 사용자 활동 기반 갱신
- [ ] 세션 쿠키 보안 속성 — `HttpOnly`, `Secure`, `SameSite=Strict` 또는 `SameSite=Lax` 설정
- [ ] 세션 고정 (Session Fixation) 방지 — 로그인 성공 후 새 세션 ID 발급 확인
- [ ] 비활성 세션 자동 만료 — 일정 기간(예: 30분) 비활동 시 자동 로그아웃
- [ ] 동시 세션 제한 — 동일 계정 다중 기기 세션 관리 정책 수립 (허용/차단/알림)
- [ ] 세션 무효화 목록 관리 — 강제 로그아웃 시 서버 사이드 블랙리스트 관리
- [ ] CSRF 방지 — SameSite 쿠키 속성 또는 CSRF 토큰으로 크로스 사이트 요청 위조 방지
- [ ] 세션 ID 엔트로피 — Firebase UID 기반의 충분한 무작위성 확인

---

## 9. 암호화 체크리스트

- [ ] 전송 중 암호화 (TLS 1.2+) — Vercel, Firebase, 아누 서버 모두 HTTPS 적용 확인
- [ ] TLS 인증서 유효성 — 인증서 만료일 모니터링 및 자동 갱신 설정 (Let's Encrypt)
- [ ] 저장 데이터 암호화 — Firestore의 전용 암호화(Google 관리) 확인, 추가 필드 암호화 필요 시 적용
- [ ] 비밀번호 저장 방식 — Firebase Auth의 bcrypt 기반 해싱 사용 확인 (자체 비밀번호 저장 금지)
- [ ] HMAC 시크릿 키 — 최소 256비트(32바이트) 이상의 암호학적으로 안전한 랜덤 값 사용
- [ ] 암호화 알고리즘 선택 — 취약한 알고리즘(MD5, SHA1, DES, RC4) 사용 금지
- [ ] 키 로테이션 정책 — HMAC 시크릿 키 정기 교체(6개월~1년) 절차 수립
- [ ] 환경변수 암호화 — Vercel Secret 또는 Google Secret Manager를 통한 시크릿 관리

---

## 10. 로깅/모니터링 체크리스트

- [ ] 인증 이벤트 로깅 — 로그인 성공/실패, 비밀번호 재설정, 계정 생성/삭제 이벤트 기록
- [ ] 접근 제어 이벤트 로깅 — Firestore Rules 거부 이벤트, 인가 실패 API 요청 기록
- [ ] 서버 에러 로깅 — Vercel 500 에러를 Sentry 또는 Firebase Crashlytics에 집계
- [ ] 아누 서버 시스템 로그 — `/var/log/auth.log`, `/var/log/syslog`, 애플리케이션 로그 보존
- [ ] 로그에 개인정보 포함 금지 — 비밀번호, 주민번호, 카드번호가 로그에 기록되지 않도록 마스킹
- [ ] 이상 행위 감지 알림 — 연속 인증 실패(5회 이상), 비정상 대량 요청 탐지 시 알림
- [ ] 로그 보존 기간 — 보안 감사 목적으로 최소 90일 이상 로그 보존
- [ ] 로그 접근 제어 — 로그 파일/시스템에 대한 접근 권한 최소화 (읽기 전용, 관리자만 접근)

---

## 11. CORS/CSP 체크리스트

- [ ] CORS 허용 오리진 명시 — `Access-Control-Allow-Origin: https://insuro.kr` 등 특정 도메인 지정
- [ ] CORS 와일드카드 제거 — `Access-Control-Allow-Origin: *` 인증이 필요한 API에서 제거
- [ ] CORS Preflight 처리 — OPTIONS 메서드 응답에 올바른 CORS 헤더 포함 확인
- [ ] CSP `default-src 'self'` 설정 — 기본적으로 동일 출처만 허용
- [ ] CSP `script-src` 화이트리스트 — 허용 스크립트 소스 명시, `unsafe-inline` 제거
- [ ] CSP `connect-src` 설정 — Firebase, API 도메인만 XHR/fetch 허용
- [ ] CSP `img-src` 설정 — 이미지 소스 출처 화이트리스트 (Firebase Storage, CDN 등)
- [ ] CSP 위반 보고 — `report-uri` 또는 `report-to` 설정으로 CSP 위반 수집 및 분석

---

## 12. 에러 처리 체크리스트

- [ ] 스택 트레이스 노출 차단 — 운영 환경에서 500 에러 시 내부 스택 트레이스 숨김 처리
- [ ] 일반화된 오류 메시지 — 내부 구현 정보(DB 쿼리, 파일 경로, 클래스명) 포함 오류 메시지 제거
- [ ] HTTP 상태 코드 일관성 — 인증 오류 401, 인가 오류 403, 미발견 404 정확히 반환
- [ ] 에러 응답 형식 통일 — `{ "error": "message" }` 등 일관된 응답 구조 사용
- [ ] 클라이언트 오류 로깅 — 프론트엔드 JS 오류를 Sentry 등으로 수집 및 모니터링
- [ ] 타임아웃 오류 처리 — API 타임아웃 시 503 응답 및 사용자 친화적 안내 메시지 반환

---

## 13. 서버 보안 (아누 서버) 체크리스트

**SSH 설정**
- [ ] SSH 기본 포트 변경 — 포트 22에서 비표준 포트(예: 2222)로 변경
- [ ] 비밀번호 인증 비활성화 — `PasswordAuthentication no` 설정, SSH 키 인증만 허용
- [ ] root 직접 로그인 차단 — `PermitRootLogin no` 설정
- [ ] SSH 접속 허용 IP 제한 — `AllowUsers`, `AllowGroups`, `Match Address` 설정으로 특정 IP만 허용
- [ ] SSH 키 페어 강도 — Ed25519 또는 RSA 4096비트 이상 키 사용

**방화벽 (ufw/iptables)**
- [ ] ufw 활성화 확인 — `ufw status` 로 방화벽 활성 상태 확인
- [ ] 최소 허용 포트 설정 — SSH, 웹 서버 포트만 허용, 나머지 차단
- [ ] 외부에 불필요한 포트 노출 차단 — 데이터베이스, 개발 서버 포트 외부 접근 차단
- [ ] Fail2Ban 설치 및 설정 — SSH 브루트포스 시도 시 IP 자동 차단

**파일 권한**
- [ ] 웹 서버 프로세스 전용 사용자 생성 — root가 아닌 별도 사용자(예: `anu-app`)로 실행
- [ ] 설정 파일 권한 제한 — `.env`, `config.py` 등 권한 600(소유자만 읽기/쓰기) 설정
- [ ] 웹루트 외부 파일 접근 차단 — `../` 경로 이탈 방지 설정

**프로세스 격리**
- [ ] Python 웹 서버 비root 실행 — `--user` 옵션 또는 `runuser` 로 권한 최소화
- [ ] 환경 격리 — Python venv 또는 Docker 컨테이너 기반 격리 운영

**자동 업데이트 및 패치**
- [ ] unattended-upgrades 설치 — 보안 패치 자동 적용 설정
- [ ] Python 패키지 보안 업데이트 — `pip audit` 정기 실행 및 취약 패키지 업데이트

**백업**
- [ ] 정기 백업 설정 — 데이터 및 설정 파일 일 1회 이상 백업
- [ ] 백업 암호화 — 백업 파일 AES-256 암호화 적용
- [ ] 백업 복구 테스트 — 월 1회 이상 백업에서 복구 가능 여부 테스트

---

## 14. 의존성 보안 체크리스트

- [ ] `npm audit --audit-level=high` 정기 실행 — High/Critical 취약점 즉시 패치
- [ ] `pip audit` 정기 실행 (아누 서버) — Python 패키지 CVE 취약점 확인
- [ ] `package-lock.json` Git 커밋 관리 — 의존성 버전 고정으로 예측 불가 업데이트 방지
- [ ] `requirements.txt` 버전 고정 — `==` 연산자로 정확한 버전 고정
- [ ] Dependabot 활성화 — GitHub Dependabot으로 의존성 보안 PR 자동 생성
- [ ] 의존성 라이선스 검토 — 오픈소스 라이선스 정책 준수 여부 확인
- [ ] 사용하지 않는 의존성 제거 — `depcheck` (npm), `pip-check` 등으로 미사용 패키지 제거
- [ ] 의존성 무결성 검증 — `npm ci` (package-lock.json 기반 설치) 사용, `yarn install --frozen-lockfile`

---

## 부록: PentAGI 기반 자동화 테스트 도구 참고

> PentAGI(Penetration testing Artificial General Intelligence) 분석 결과, 아래 도구들이 우리 시스템 보안 테스트에 직접 적용 가능합니다.

### 웹 애플리케이션 테스트
- `nikto` — Next.js 웹 서버 취약점 스캔 (보안 헤더, 기본 파일 노출 등)
- `nuclei` — Firebase, Vercel 환경 기반 취약점 템플릿 자동 스캔
- `ffuf` / `gobuster` — API 엔드포인트 브루트포스 및 숨겨진 경로 발견
- `sqlmap` — (해당 시) SQL 기반 백엔드 Injection 자동 탐지

### 네트워크/서버 테스트
- `nmap` — 아누 서버 오픈 포트 스캔 및 서비스 버전 식별
- `sslscan` — TLS 설정 검증 (지원 버전, 암호화 스위트)
- `hydra` / `medusa` — SSH 브루트포스 저항성 테스트 (승인된 환경에서만 실행)

### 인증/세션 테스트
- Burp Suite — Firebase 인증 토큰 조작, CORS 우회, API 요청 인터셉트 및 분석

### 의존성 스캔
- `npm audit` — JavaScript 패키지 CVE 자동 확인
- `pip audit` — Python 패키지 CVE 자동 확인
- `trivy` — 컨테이너 이미지 및 파일시스템 취약점 종합 스캔

---

*이 체크리스트는 InsuRo, InsuWiki, 아누 서버의 런칭 전 보안 검증을 위해 작성되었습니다. 각 항목은 실제 테스트 수행 후 체크박스를 완료 처리하고, 발견된 취약점은 별도 취약점 보고서에 기록하세요.*
