핵심 요약
2024~2026년 사이 보안 위협의 무게중심이 변했다. SQL Injection·XSS는 여전하지만 새로 등장한 것은 (1) 공급망 공격 (npm·PyPI 악성 패키지), (2) secret leak (GitHub·CI), (3) AI 생성 코드의 보안 취약점.
- OWASP Top 10 2024 갱신
- 공급망 공격 — npm·PyPI 악성 사례 다수
- SBOM 의무화 (EU CRA, US Executive Order)
- SLSA 프레임워크 표준화
1. OWASP Top 10 2024
- Broken Access Control (1위 유지)
- Cryptographic Failures
- Injection (SQL·NoSQL·Command)
- Insecure Design
- Security Misconfiguration
- Vulnerable and Outdated Components
- Identification and Authentication Failures
- Software and Data Integrity Failures
- Security Logging and Monitoring Failures
- Server-Side Request Forgery
2. SQL Injection — 여전히 흔함
// ❌ 절대 금지
const user = await db.query(`SELECT * FROM users WHERE id = ${req.params.id}`)
// ✅ Parameterized
const user = await db.query('SELECT * FROM users WHERE id = $1', [req.params.id])
// ✅ ORM (자동 escape)
const user = await prisma.user.findUnique({ where: { id: parseInt(req.params.id) } })3. XSS
// React — 기본 안전
<div>{userInput}</div> // 자동 escape
// ❌ 위험
<div dangerouslySetInnerHTML={{ __html: userInput }} />
// ✅ 외부 HTML은 sanitize
import DOMPurify from 'isomorphic-dompurify'
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(userInput) }} />4. CSRF
# Next.js Server Actions는 자동 CSRF 보호 (2026)
# 일반 API는 명시적 토큰
<form>
<input type="hidden" name="_csrf" value={csrfToken} />
...
</form>
# 또는 SameSite cookie
Set-Cookie: session=...; SameSite=Strict; HttpOnly; Secure5. Authentication 베스트 프랙티스
- password: bcrypt rounds 12+ (또는 argon2id)
- session: HttpOnly + Secure + SameSite
- JWT는 refresh token 쌍, refresh는 쿠키만
- MFA 강제 (admin 계정)
- OAuth 2.1 (PKCE 필수)
- password reset: 1회용 토큰, 짧은 TTL (15분)
6. 공급망 공격 — npm·PyPI
방어 1) lockfile 정확성
# package.json 변경 시 항상 lockfile 함께 commit
# CI에서 npm ci (npm install 아님)
# pnpm은 더 엄격
pnpm install --frozen-lockfile방어 2) audit 자동화
# GitHub Actions
- run: npm audit --audit-level=high
- run: pnpm audit
# 또는 Snyk·Dependabot
# main에 매주 PR 자동 생성방어 3) 새 패키지 검증
- 다운로드 수 (1만+ 권장)
- 출시 후 30일 이상 (악성 패키지는 빨리 발견됨)
- 유지보수 활동성
- 의존성 트리 깊이 (5+ 의심)
7. Secret Management
절대 금지
# ❌ 코드에 하드코딩
const API_KEY = 'sk-...'
# ❌ .env를 git에 commit
# ❌ Slack·Discord에 공유
# ❌ Docker 이미지에 빌드 타임 ARG로 주입권장
# 1) 환경변수 (개발)
import { config } from 'dotenv'
config()
# 2) 클라우드 secret manager (운영)
# AWS Secrets Manager, GCP Secret Manager, Azure Key Vault
import { SecretsManager } from '@aws-sdk/client-secrets-manager'
const sm = new SecretsManager()
const { SecretString } = await sm.getSecretValue({ SecretId: 'app/db' })
# 3) 1Password Connect / Vault (멀티클라우드)8. 코드에서 Secret 자동 검출
# pre-commit hook
npm install -D @secretlint/secretlint-rule-preset-recommend
npx secretlint "**/*"
# CI에서
- name: TruffleHog
uses: trufflesecurity/trufflehog@v3
with:
extra_args: --only-verified9. SBOM (Software Bill of Materials)
# Syft로 생성
syft yourimage:tag -o spdx-json > sbom.spdx.json
syft yourimage:tag -o cyclonedx-json > sbom.cdx.json
# 컨테이너에 첨부
cosign attest --predicate sbom.cdx.json yourimage:tag
# 검증
cosign verify-attestation yourimage:tag10. SLSA Framework
| Level | 요구사항 |
|---|---|
| 1 | 빌드 process 문서화 |
| 2 | 버전 관리 + 빌드 서비스 |
| 3 | 출처 검증 가능 (provenance) |
| 4 | 이중 리뷰 + 봉인된 빌드 |
EU CRA·미국 정부 계약은 SLSA 3 이상 요구.
11. AI 생성 코드 보안
Copilot·Cursor 등으로 생성된 코드의 보안 검토:
- SQL string concatenation 자주 발생 (특히 helper 함수)
- password hashing 없이 평문 비교 사례
- JWT secret 하드코딩
- open redirect 패턴
# 권장 — AI 생성 코드 자동 검토
# .github/workflows/ai-security-review.yml
# Claude·GPT로 보안 관점 자동 리뷰12. 컨테이너 보안
# 베이스 이미지 minimal
FROM node:20-alpine # 풀 ubuntu 대신
# non-root 사용자
USER 1000
# 빌드 시점 보안 스캔
# .github/workflows/...
- name: Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: yourimage:latest
severity: CRITICAL,HIGH13. 운영 모니터링
- 실패한 인증 5회 연속 → 알림
- 관리자 권한 변경 → 즉시 알림
- 새 IP에서의 admin 로그인 → 알림
- 비정상 outbound 트래픽 (Falco)
14. 네트워크
- 모든 외부 노출은 TLS (Let's Encrypt 자동)
- internal 통신도 mTLS (service mesh)
- WAF (Cloudflare·AWS WAF)
- rate limiting (10 req/sec/IP 기본)
15. 보안 체크리스트 — 신규 서비스
- [ ] HTTPS 강제 (HSTS preload)
- [ ] 모든 입력 validation·sanitization
- [ ] Parameterized queries
- [ ] CSP 헤더
- [ ] X-Frame-Options: DENY
- [ ] 인증·인가 RBAC
- [ ] 패스워드 bcrypt 12+ 또는 argon2id
- [ ] Session HttpOnly + Secure + SameSite
- [ ] CSRF 토큰 또는 SameSite
- [ ] secret manager (코드에 절대 하드코딩 안 함)
- [ ] 의존성 자동 업데이트 (Dependabot)
- [ ] SBOM 생성·검증
- [ ] 로깅 (PII는 마스킹)
- [ ] WAF + rate limit
- [ ] 침해 대응 매뉴얼

댓글 0