Skip to content
Back to skills

Api Security Checklist

ASecurity

웹앱 API 보안 체크리스트. OWASP Top 10 기반 취약점 점검, 인증/인가 패턴, 입력 검증, Rate Limiting, CORS, CSRF, SQL Injection 방어를 제공하는 backend-dev 확장 스킬. 'API 보안', 'OWASP', '인증 구현', 'SQL Injection', 'XSS 방어', 'CORS 설정', '보안 체크리스트' 등 백엔드 보안 설계 시 사용한다. 단, 침투 테스트 수행이나 WAF 구성은 이 스킬의 범위가 아니다.

  • 1,256 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added May 29, 2026
securitygosqlapibackendsecurity

Works with

  • api

Security analysis

A100/100

Scanned May 29, 2026

npx -y skills add revfactory/harness-100 --skill api-security-checklist --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Api Security Checklist?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Api Security Checklist
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/revfactory-api-security-checklist/badge)](https://www.skillsdirectory.com/skills/revfactory-api-security-checklist)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: api-security-checklist
description: "웹앱 API 보안 체크리스트. OWASP Top 10 기반 취약점 점검, 인증/인가 패턴, 입력 검증, Rate Limiting, CORS, CSRF, SQL Injection 방어를 제공하는 backend-dev 확장 스킬. 'API 보안', 'OWASP', '인증 구현', 'SQL Injection', 'XSS 방어', 'CORS 설정', '보안 체크리스트' 등 백엔드 보안 설계 시 사용한다. 단, 침투 테스트 수행이나 WAF 구성은 이 스킬의 범위가 아니다."
---

# API Security Checklist — 웹앱 API 보안 체크리스트

backend-dev 에이전트가 API 개발 시 활용하는 OWASP 기반 보안 체크리스트, 인증 패턴, 방어 코드 가이드.

## 대상 에이전트

`backend-dev` — 이 스킬의 보안 체크리스트를 API 구현에 직접 적용한다.

## OWASP API Security Top 10 점검

| 순위 | 취약점 | 점검 항목 | 방어 |
|------|--------|----------|------|
| A1 | **BOLA** (객체 수준 인가 결함) | 다른 사용자의 리소스 접근 가능? | 모든 엔드포인트에서 객체 소유권 검증 |
| A2 | **인증 결함** | 약한 비밀번호, 무제한 로그인 시도? | bcrypt 해싱, Rate Limit, MFA |
| A3 | **객체 속성 수준 인가** | 숨겨야 할 필드 노출? | 응답 DTO로 필드 필터링 |
| A4 | **무제한 리소스 소비** | 대량 요청으로 서버 마비? | Rate Limiting, 페이지네이션 강제 |
| A5 | **기능 수준 인가 결함** | 관리자 API를 일반 유저가 호출? | RBAC 미들웨어 |
| A6 | **서버 사이드 요청 위조 (SSRF)** | 외부 URL 입력으로 내부 접근? | URL 화이트리스트, 내부 IP 차단 |
| A7 | **보안 설정 오류** | 디버그 모드 노출, 기본 계정? | 프로덕션 설정 분리, 헤더 점검 |
| A8 | **비즈니스 흐름 결함** | 정상 API를 비정상 순서로 호출? | 상태 머신 검증, 비즈니스 규칙 서버측 |
| A9 | **취약 자산 관리** | 미사용 API, 구버전 노출? | API 인벤토리, 버전 폐기 정책 |
| A10 | **안전하지 않은 API 소비** | 외부 API 응답 무조건 신뢰? | 외부 응답 검증, 타임아웃 설정 |

## 인증 (Authentication) 패턴

### JWT 기반 인증

| 항목 | 권장 설정 |
|------|----------|
| Access Token 만료 | 15~30분 |
| Refresh Token 만료 | 7~14일 |
| 알고리즘 | RS256 (비대칭) 또는 HS256 (대칭) |
| 저장소 | httpOnly + secure + sameSite cookie |
| Payload | 최소 정보만 (userId, role) — PII 금지 |
| 갱신 전략 | Silent Refresh 또는 Rotation |

### 비밀번호 정책
- 최소 8자, 대소문자+숫자+특수문자 권장 (강제보다 강도 표시)
- bcrypt (cost factor 12+) 또는 Argon2id
- 비밀번호 히스토리 (최근 5개 재사용 금지)
- 로그인 실패 5회 시 임시 잠금 (15분) 또는 CAPTCHA

## 인가 (Authorization) 패턴

### RBAC (역할 기반)
```
역할 정의: admin, manager, user, viewer
권한 매핑:
  admin    → *.* (전체)
  manager  → resource.create, resource.read, resource.update
  user     → resource.create (own), resource.read (own)
  viewer   → resource.read (public)
```

### 미들웨어 체인
```
요청 → [Rate Limit] → [인증: JWT 검증] → [인가: 역할 확인] → [입력 검증] → 핸들러
```

## 입력 검증 체크리스트

| 검증 항목 | 방법 | 도구 |
|----------|------|------|
| **타입 검증** | 스키마 검증 | Zod, Joi, class-validator |
| **길이 제한** | 최소/최대 길이 | 스키마에 min/max |
| **패턴 매칭** | 이메일, URL, 전화번호 | 정규식 + 라이브러리 |
| **범위 검증** | 숫자 범위, 날짜 범위 | min/max 값 |
| **열거형** | 허용된 값 목록 | enum 타입 |
| **SQL Injection** | 파라미터화 쿼리 | ORM (Prisma, TypeORM) |
| **XSS** | HTML 이스케이핑 | DOMPurify (클라이언트), 서버 이스케이프 |
| **Path Traversal** | 경로 정규화 | path.resolve + 화이트리스트 |
| **파일 업로드** | 타입/크기 검증 | MIME 타입 + 매직넘버 검증 |

## HTTP 보안 헤더

| 헤더 | 값 | 목적 |
|------|---|------|
| `Strict-Transport-Security` | `max-age=31536000; includeSubDomains` | HTTPS 강제 |
| `X-Content-Type-Options` | `nosniff` | MIME 스니핑 방지 |
| `X-Frame-Options` | `DENY` 또는 `SAMEORIGIN` | 클릭재킹 방지 |
| `Content-Security-Policy` | `default-src 'self'` | XSS 방지 |
| `X-XSS-Protection` | `0` (CSP로 대체) | 레거시 |
| `Referrer-Policy` | `strict-origin-when-cross-origin` | 리퍼러 정보 제한 |
| `Permissions-Policy` | `camera=(), microphone=()` | 브라우저 기능 제한 |

## CORS 설정 가이드

| 환경 | 설정 |
|------|------|
| 개발 | `origin: 'http://localhost:3000'` |
| 프로덕션 | `origin: ['https://example.com']` — 도메인 명시 |
| 금지 | `origin: '*'` + `credentials: true` — 보안 위험 |

필수 설정:
- `methods`: 필요한 메서드만 허용
- `allowedHeaders`: 필요한 헤더만
- `credentials`: 쿠키 필요 시에만 true
- `maxAge`: 프리플라이트 캐싱 (86400초)

## Rate Limiting 전략

| 대상 | 제한 | 구현 |
|------|------|------|
| 인증 엔드포인트 | 5회/분/IP | IP 기반 |
| API 일반 | 100회/분/사용자 | 토큰 기반 |
| 파일 업로드 | 10회/시간/사용자 | 토큰 기반 |
| 비인증 API | 30회/분/IP | IP 기반 |

### 응답 헤더
```
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1609459200
Retry-After: 60 (429 응답 시)
```

## 에러 응답 보안

### 프로덕션 에러 응답 규칙
- 내부 구현 세부사항 절대 노출 금지 (스택 트레이스, SQL 쿼리)
- 일관된 에러 형식 사용
- 열거 공격 방지: 로그인 실패 시 "이메일 또는 비밀번호가 올바르지 않습니다" (어느 것이 틀렸는지 X)

### 에러 응답 형식
```json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "입력값이 올바르지 않습니다",
    "details": [
      {"field": "email", "message": "유효한 이메일을 입력하세요"}
    ]
  }
}
```

## 민감 데이터 처리

| 데이터 유형 | 저장 | 전송 | 로깅 |
|-----------|------|------|------|
| 비밀번호 | bcrypt 해시만 | HTTPS only | 절대 금지 |
| API Key | 환경변수 | 헤더 (Authorization) | 마스킹 (앞4자리만) |
| 개인정보 (PII) | 암호화 (AES-256) | HTTPS only | 마스킹 |
| 신용카드 | 토큰화 (PG사 위임) | PG사 SDK | 절대 금지 |
| 세션/토큰 | httpOnly cookie | HTTPS only | 절대 금지 |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.