✍️ 필사 모드: 보안 기초에서 모던 Zero Trust까지 심화 가이드 — OWASP Top 10, OAuth/OIDC, JWT 논쟁, Passkeys, mTLS, SPIFFE/SPIRE, CSP, Supply Chain, SIEM까지 (2025)
한국어TL;DR — 2020년대 보안 사건들(SolarWinds 2020, Log4Shell 2021, MOVEit 2023, XZ Utils 백도어 2024)이 모두의 감각을 바꿨다. "방화벽 안쪽은 안전"이라는 경계 방어 모델은 죽었고, Zero Trust Architecture(NIST 800-207, 2020)가 대세가 됐다. 2024년 Passkeys(WebAuthn 기반)가 주요 빅테크 — Apple/Google/Microsoft — 가 완전 채택하며 패스워드의 종말이 시작됐다. 서비스 간 인증은 mTLS + SPIFFE/SPIRE가 표준이 됐고, JWT 피로 — 2024년 여러 보안 전문가의 "JWT is bad" 재점화 — 로 session 기반으로의 회귀도 일부 일어났다. 이 글은 OWASP Top 10 실전 방어부터 OAuth 2.0/OIDC의 정확한 이해, Passkeys 구현, XZ Utils 공격 분석, Cloud Security Posture Management까지 — 현대 웹/클라우드 보안의 전 지형도를 정리한다.
2020년대 보안 사건 — 패러다임 전환의 계기
SolarWinds (2020.12)
러시아 정보기관 SVR이 SolarWinds Orion 빌드 인프라에 침투. 악성 업데이트가 18,000+ 고객에게 배포 — 포함: 미국 재무부, 국방부, 핵 연구소, Microsoft. 침투는 2019년부터 시작, 탐지는 FireEye가 자사 침투 조사 중 발견. 공급망 공격의 대명사가 됨.
Log4Shell (2021.12)
Apache Log4j의 JNDI 주입 취약점. 로그 문자열에 ${jndi:ldap://...} 넣으면 원격 코드 실행. 인터넷 30% 영향 추정. CVE 역사상 최악의 '공격 용이성 + 영향도' 결합.
MOVEit Transfer (2023.05)
Progress Software의 파일 전송 SW에 SQL injection. Clop ransomware gang이 이용, 수백 기업 데이터 유출 — BBC, 영국 항공, PwC, Sony 포함.
XZ Utils Backdoor (2024.03)
리눅스 압축 라이브러리 xz에 백도어가 **유지자 "Jia Tan"**이 2년간 커뮤니티 침투 후 심어짐. Andres Freund(Microsoft)가 sshd 로그인이 500ms 느려진 것을 발견해 적발. 소셜 엔지니어링 + 장기 은닉 + 오픈소스 공급망 공격의 교과서 사례.
공통 교훈
- 네트워크 경계(방화벽) 방어는 이미 뚫린 상태 기본 가정
- 최소 권한, 제로 트러스트 필수
- 공급망은 코드 + 인프라 + 빌드 + 유지자 모두 포함
- 탐지/대응(Detection/Response)이 예방(Prevention)만큼 중요
OWASP Top 10 (2021) — 실전 방어
OWASP(Open Worldwide Application Security Project)가 3-4년마다 발표하는 웹 보안 위험 순위. 2025년 버전 작업 중.
A01 — Broken Access Control (34% 앱에서 발견)
가장 흔한 취약점. "URL 직접 조작해서 다른 유저 데이터 접근".
❌ GET /api/users/42/orders — 아무나 접근
✅ GET /api/users/me/orders — 세션 기반
✅ GET /api/orders?userId=42 — 인가 체크 (본인/admin)
방어:
- 서버 측 모든 요청에 인가 검증
- RLS (Postgres Row Level Security)
- deny by default, allow 명시
- Object-level + field-level 인가
A02 — Cryptographic Failures
"HTTPS 안 씀", "비밀번호 평문 저장", "MD5 해시" 같은 기본 실수.
❌ password: 평문 저장
❌ MD5, SHA-1 (충돌 공격)
✅ Argon2id (권장, 2015 Password Hashing Competition 우승)
✅ bcrypt (레거시 허용, cost 12+)
✅ scrypt
TLS 1.3 강제, HSTS 헤더 (1년+), 쿠키 Secure; HttpOnly; SameSite=Lax.
A03 — Injection (SQL, NoSQL, Command, LDAP)
// ❌ SQL Injection
const query = `SELECT * FROM users WHERE email = '${email}'`
// ✅ Parameterized query
const result = await db.query('SELECT * FROM users WHERE email = $1', [email])
// ✅ ORM
const user = await prisma.user.findUnique({ where: { email } })
Command Injection:
// ❌
exec(`ffmpeg -i ${filename}`)
// 사용자가 filename = "x.mp4; rm -rf /" 입력 가능
// ✅
execFile('ffmpeg', ['-i', filename])
A04 — Insecure Design
"에러 메시지로 DB 구조 노출", "계정 열거 가능 (존재 여부 메시지로)", "rate limit 없음" 등 설계 단계 결함.
A05 — Security Misconfiguration
- 기본 계정/비밀번호
- 불필요한 기능 활성 (samples, admin)
- 민감 정보 에러 메시지
- 최신 패치 미적용
A06 — Vulnerable Components
- Log4Shell이 여기
- Dependabot, Renovate, Snyk, Trivy 필수
A07 — Identification and Authentication Failures
- 약한 비밀번호 허용
- 세션 고정 공격
- MFA 없음
A08 — Software/Data Integrity Failures
- 서명 없는 업데이트 허용
- CI/CD 파이프라인 보안 (SolarWinds)
- SLSA + sigstore가 답
A09 — Security Logging and Monitoring Failures
- 로그인 실패 로그 없음
- 중요 트랜잭션 감사 없음
- SIEM 부재
A10 — Server-Side Request Forgery (SSRF)
# ❌ 사용자가 URL 파라미터 제어
GET /fetch?url=http://169.254.169.254/latest/meta-data/
# → AWS 메타데이터 서비스에서 IAM 크레덴셜 탈취
방어: URL 스키마/호스트 allowlist, IMDSv2 강제, private IP 차단.
OAuth 2.0 + OpenID Connect — 정확히 이해하기
보안에서 가장 자주 오해되는 주제. 용어 정리부터:
- OAuth 2.0 — 인가(authorization). "이 앱이 내 구글 드라이브 파일에 접근 가능"
- OpenID Connect (OIDC) — 인증(authentication). "이 사용자는 google.com에 로그인된 Alice"
- OIDC는 OAuth 2.0 위에
id_token을 추가한 것
Authorization Code Flow (with PKCE)
가장 표준적 플로우. 2024년 PKCE는 모든 클라이언트에서 필수.
1. App → Authorize URL (client_id, redirect_uri, scope, code_challenge)
2. User login, consent
3. Auth Server → redirect with ?code=xyz
4. App → Token endpoint (code, code_verifier) → access_token + id_token
5. App → Resource API (Authorization: Bearer access_token)
PKCE(code_verifier)로 중간 탈취된 code 재사용 방지.
Grant Types
- Authorization Code + PKCE — SPA, 모바일, Web (모든 클라이언트)
- Client Credentials — 서버 간 인증
- Device Code — TV, CLI, IoT
- Refresh Token — access token 갱신
2019년 OAuth 2.1 초안 — Implicit Flow, ROPC(Resource Owner Password Credentials) deprecated. 여전히 쓰면 안 됨.
주요 구현
- Auth0 (Okta 인수 2021) — SaaS 표준
- Keycloak (Red Hat) — 오픈소스 1위
- Authelia, Authentik — 경량 self-hosted
- Ory (Hydra, Kratos) — Go 기반 모듈러
- Azure AD (Microsoft Entra ID), Google Workspace, AWS Cognito — 클라우드
흔한 실수
- id_token을 API 인증에 — id_token은 사용자 식별, access_token이 인가
- access_token을 브라우저 localStorage — XSS로 탈취
- state 파라미터 생략 — CSRF 취약
- nonce 생략 — id_token replay
- scope를 너무 넓게 — 원칙 위반
JWT 논쟁 — 왜 탈출이 일어나는가
JWT(JSON Web Token)는 2015년 RFC 7519. 하지만 2020년대 들어 "JWT is bad for sessions" 논쟁이 가열.
JWT 장점
- Stateless — 서버에 세션 저장 불필요
- 분산 검증 — public key로 어느 서비스든
- 구조화된 클레임 (role, exp, iss)
JWT 단점
- Revocation 어려움 — 발급 후 만료 전까지 회수 불가 (blocklist 쓰면 stateful 되니 의미 없음)
- Bloat — 쿠키보다 5-10배 큼
- 알고리즘 혼동 —
alg: none공격, HS256 ↔ RS256 혼용 공격 - expiration vs security tradeoff — 짧게 하면 UX, 길게 하면 보안
2024년 "Stop Using JWT" 재점화
Paragon Initiative의 Scott Arciszewski, Thai Duong 등 암호학자들이 지속 경고. 2024년 Phil Sturgeon, Lucas Kanashiro 같은 개발자들이 블로그로 재확산.
권장:
- 전통적 세션 쿠키 (signed cookie) + Redis 세션
- JWT는 단기(1분) access token만, refresh는 별도 로테이션
Session Cookie 방식
Set-Cookie: sid=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=604800
- 서버는 Redis에서
sid:abc123→{user_id: 42, ...} - 로그아웃 즉시 Redis 삭제 → 완벽한 revocation
- CSRF 방어는 SameSite=Lax + CSRF token
PASETO — JWT 대체
Paragon이 제안한 Platform-Agnostic Security Token. 알고리즘 협상 제거 (v1/v2/v3/v4 고정), 명확한 퍼포스(local vs public).
v4.local.xxxxx // 대칭키 암호화
v4.public.xxxxx // 비대칭 서명
채택 속도 느리지만 보안 커뮤니티에서 권장.
Passkeys — 패스워드의 종말
2022년 Apple/Google/Microsoft 공동 발표. 2024년 본격 주류화. FIDO2 + WebAuthn 표준 기반.
원리
- 사용자 디바이스(Mac, iPhone, Android, YubiKey)가 private/public key 쌍 생성
- 사이트는 public key만 저장
- 로그인 시 사이트가 challenge 보냄 → 디바이스가 private key로 서명 → 검증
이점
- Phishing 불가 — origin이 키에 바인딩, 가짜 사이트는 서명 못 받음
- 비밀번호 없음 — 탈취할 게 없음
- 디바이스 간 동기 — iCloud Keychain, Google Password Manager 동기화
WebAuthn API
// 등록 (첫 로그인)
const credential = await navigator.credentials.create({
publicKey: {
challenge: new Uint8Array(/* ... */),
rp: { name: "Example" },
user: { id: userId, name: email, displayName: name },
pubKeyCredParams: [{ type: "public-key", alg: -7 }], // ES256
authenticatorSelection: {
userVerification: "preferred",
residentKey: "required"
}
}
})
// 로그인
const assertion = await navigator.credentials.get({
publicKey: {
challenge: newChallenge,
allowCredentials: [] // 저장된 credential 자동 선택
}
})
서버는 SimpleWebAuthn, py_webauthn 같은 라이브러리로 검증.
채택 사례 (2024)
- GitHub, Google, Apple ID, Microsoft 계정
- Amazon, Target, eBay
- CVS, Best Buy (2024)
- Adobe, Shopify, TikTok
Passkey vs Password Manager
혼동 주의: 1Password/Bitwarden은 패스워드 관리자 + Passkey 저장 둘 다 지원. Passkey는 애초 비밀번호가 아님.
mTLS — 서비스 간 인증
HTTPS는 보통 서버만 인증 (클라이언트는 쿠키/토큰). **mTLS (mutual TLS)**는 양쪽 모두 인증서로 인증.
구조
Client Cert (CA 서명) ↔ Server Cert (CA 서명)
↓ ↓
verify by server verify by client
용도
- 서비스 메시 내부 (Istio, Linkerd 자동)
- VPN 대체 (Cloudflare Access, Tailscale)
- API 파트너 (은행, 카드사 B2B)
운영 문제
- 인증서 배포 — 수천 Pod에 어떻게?
- 회전(rotation) — 짧은 유효기간 자동 갱신
- 해지(revocation) — CRL, OCSP의 한계
→ SPIFFE/SPIRE가 답.
SPIFFE/SPIRE — 워크로드 ID 표준
SPIFFE (Secure Production Identity Framework For Everyone) — 2018년 CNCF 입성. 2022년 Graduated.
SPIFFE ID
서비스에 URI 형태 ID 부여:
spiffe://acme.com/ns/prod/sa/checkout-service
SVID (SPIFFE Verifiable Identity Document)
ID를 담은 X.509 인증서 또는 JWT. 수명 짧음 (1시간 등), 자동 갱신.
SPIRE (SPIFFE Runtime Environment)
구현체. Server + Agent 구조. K8s Pod에 자동 ID 부여.
# SPIRE Server는 새 Pod이 뜨면
# ServiceAccount + Namespace 기반으로
# SPIFFE ID 자동 발행
사용 기업
- Uber, Square, Bloomberg
- Pinterest, Netflix, Intuit
- Apple 내부 워크로드
Istio 1.0부터 SPIFFE 사용. Linkerd도 호환.
Zero Trust Architecture — NIST 800-207
NIST가 2020년 발표한 공식 문서. "절대 신뢰하지 말고 항상 검증하라".
원칙 7가지
- 모든 데이터 소스/컴퓨팅 서비스는 리소스 — 인증 대상
- 모든 통신은 암호화 (네트워크 위치 무관)
- 접근은 세션 기반 (지속적 평가)
- 접근은 정책 기반 — 사용자, 디바이스, 환경 속성
- 모든 리소스의 무결성 + 상태 모니터링
- 모든 접근은 인증 + 인가 동적으로
- 수집한 정보로 보안 태세 지속 개선
구현 요소
- Identity Provider (IdP) — Okta, Azure AD, Google Workspace
- Device Trust — Jamf, Kolide, Intune (디바이스 컴플라이언스)
- Secure Access Service Edge (SASE) — Cloudflare, Zscaler, Netskope
- Policy Engine — OPA (Open Policy Agent), Cedar (AWS)
- Micro-segmentation — K8s NetworkPolicy, Illumio
Google BeyondCorp
Zero Trust의 원조 실전. 2011년 Aurora 공격(중국 정부) 이후 Google이 VPN 없애고 context-aware access로 전환. 2017년부터 공개 문서화.
실전 단계
- Inventory — 자산, 사용자, 디바이스, 흐름 파악
- Identity — IdP 중앙화, MFA 필수
- Device — EDR 배포, 컴플라이언스 체크
- Network — VPN 제거, ZTNA 도입
- Application — 앱별 SSO, 정책
- Data — 분류, DLP, 암호화
- Monitoring — SIEM, UEBA
Secret 관리
문제
- 하드코딩된 API key
.env파일 git commit- CI/CD pipeline variable 노출
- 서비스 크레덴셜 회전 부재
HashiCorp Vault
가장 표준적. Secret을 동적으로 발급 (DB 자격증명도 TTL 기반).
vault kv put secret/myapp password=abc123
# 앱은 Vault Agent로 자동 인증
vault agent -config=vault-agent.hcl
- Dynamic Secrets — DB 유저를 요청 시 생성, 1시간 후 자동 삭제
- Transit Encryption — "encryption as a service"
- PKI — 짧은 수명 인증서 발급
AWS Secrets Manager, Google Secret Manager, Azure Key Vault
클라우드별 관리형. 간단하지만 기능 제한.
External Secrets Operator
K8s Secret을 외부 Secret Manager와 동기화. CNCF Incubating.
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata: { name: db-secret }
spec:
secretStoreRef:
name: aws-secrets-manager
kind: SecretStore
target: { name: db-secret }
data:
- secretKey: password
remoteRef: { key: prod/db/password }
SOPS (Secrets OPerationS)
git에 암호화된 secret을 저장. Mozilla 프로젝트.
sops --encrypt --gcp-kms keyRing secrets.yaml > secrets.enc.yaml
git add secrets.enc.yaml
dotenvx, infisical, 1Password Secrets Automation
신흥 options.
Content Security Policy (CSP) — XSS 방어
Content-Security-Policy:
default-src 'self';
script-src 'self' https://cdn.example.com;
style-src 'self' 'unsafe-inline';
img-src * data:;
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
'unsafe-inline','unsafe-eval'피하기- Nonce 또는 hash로 인라인 스크립트
strict-dynamic지시어로 script 동적 로딩report-uri로 위반 수집
Next.js, Remix 2024년 기본 CSP helper 제공.
CSRF 방어 (2025)
SameSite 쿠키 + CSRF token 조합이 현대 표준.
// SameSite=Lax (default since Chrome 80)
Set-Cookie: sid=xyz; SameSite=Lax; Secure; HttpOnly
// Double Submit Cookie
Set-Cookie: csrf=random-value; SameSite=Lax
// 각 POST/PUT/DELETE 요청에 header X-CSRF-Token 포함 요구
SameSite 세 가지 값
- Strict — 도메인 변경 시 쿠키 전송 안 함 (가장 안전)
- Lax — top-level navigation 시 전송 (기본값)
- None — 모든 요청 (Secure 필수)
XSS 방어 (2025)
1. Output Encoding
// ❌ innerHTML
el.innerHTML = userInput
// ✅ textContent
el.textContent = userInput
// ✅ React 기본
<div>{userInput}</div> // 자동 escape
2. DOMPurify
Rich text 입력 받을 때:
import DOMPurify from 'dompurify'
const clean = DOMPurify.sanitize(dirtyHTML)
3. Trusted Types (Chrome 83+)
Content-Security-Policy: require-trusted-types-for 'script'
모든 innerHTML/eval이 TrustedType 요구 → 런타임 보호.
Cloud Security Posture Management (CSPM)
클라우드 설정 미스를 스캔하고 교정. 2024-2025년 급성장 분야.
주요 제품
- Wiz — 2024년 Google 인수 $32B 제안 후 독립 유지 결정
- Prisma Cloud (Palo Alto) — 엔터프라이즈
- Lacework — 2024년 재정 어려움
- Orca Security — agentless
- AWS Security Hub, GCP Security Command Center, Azure Defender
표준 체크
- S3 bucket public access
- 무지개 IAM 권한 (wildcard
*) - 암호화 안 된 RDS/EBS
- Security Group 전체 오픈
- IMDSv1 사용
- Secrets 노출 환경변수
DSPM (Data Security Posture)
CSPM의 확장. 데이터 위치 + 분류 + 접근 권한 스캔. Cyera, Varonis, BigID.
SIEM (Security Information and Event Management)
로그 수집 + 상관관계 분석 + 알림.
전통적 SIEM
- Splunk — 2023년 Cisco 인수 $28B. 여전히 1위
- IBM QRadar — 엔터프라이즈
- ArcSight (HP → Micro Focus) — 레거시
- LogRhythm — 중견
클라우드 네이티브 SIEM
- Panther — 검출 코드 기반 (Python으로 규칙)
- Datadog Cloud SIEM — APM 통합
- Elastic Security — ELK 스택
- Chronicle (Google) — Mandiant 통합
- Sumo Logic, Securonix — 중견
XDR (Extended Detection and Response)
SIEM + EDR + NDR 통합.
- CrowdStrike Falcon — 엔드포인트 1위
- SentinelOne — AI 기반
- Microsoft Defender XDR — Microsoft 365 생태계
Cloud-native 보안 도구
- Falco (CNCF) — eBPF 런타임 이상 감지
- Kyverno, OPA Gatekeeper — K8s admission policy
- Tetragon — eBPF 보안
- Kubescape — K8s 취약점 스캔
- Cilium Tetragon — eBPF 기반 런타임 보호
Supply Chain 공격 — XZ Utils 심층
XZ Utils 사건(2024.03)은 앞으로 몇 년간 사례 연구 대상.
타임라인
- 2021: "Jia Tan" 유지자가 xz 커뮤니티 등장
- 2022: 원 유지자 Lasse Collin이 번아웃 → Jia Tan에게 권한 이관
- 2024.02: Jia Tan이 백도어 포함 릴리스 5.6.0
- 2024.03.29: Andres Freund (Microsoft) 발견 —
sshd로그인 500ms 지연 분석 중 - ssh 연결 시점에 원격 코드 실행 가능
- Fedora 41, Debian testing, Arch 영향
교훈
- 오픈소스 유지자 번아웃 — 한 사람에게 의존하는 수천 프로젝트
- 사회공학 장기전 — 2년+
- 정적 분석만으로 탐지 불가 — 테스트 파일에 위장, 런타임만 활성
- 우연한 발견 — Andres가 없었다면 수개월/수년 지속됐을 것
커뮤니티 대응
- Sovereign Tech Fund (독일 정부) — 오픈소스 유지자 펀딩
- OpenSSF Alpha-Omega — 상위 프로젝트 보안 지원
- CRA (EU Cyber Resilience Act, 2027) — 유지자 면책 조항
실전 보안 체크리스트 (2025)
- MFA 강제 — 내부 계정 100%
- Passkeys 지원 — 외부 사용자에게 선택지
- Secret 관리 — Vault 또는 클라우드 Secret Manager
- mTLS + SPIFFE — 서비스 간 인증
- RBAC + RLS — 최소 권한
- Security Headers — HSTS, CSP, Referrer-Policy
- TLS 1.3 — 강제
- 의존성 스캔 — Dependabot + Trivy CI 통합
- Signing & SBOM — sigstore, cosign, Syft
- CSPM — 분기별 클라우드 감사
- SIEM 로그 통합 — 최소 90일 보관
- Incident Response Runbook — 분기별 훈련
10가지 흔한 안티패턴
- localStorage에 access token — XSS로 탈취
- JWT로 장기 세션 — revocation 불가
- 평문 비밀번호 (또는 MD5) — Argon2id 사용
- 모든 서비스에 root IAM — least privilege 위반
- Security Group 0.0.0.0/0 — 인터넷 전체 오픈
- 에러 메시지에 stack trace — 내부 노출
- HTTP Basic Auth 프로덕션 — MFA 없음, phishing 쉬움
- 하드코딩된 API key 커밋 — git history에 영원히
- CI/CD에서 비밀 로그 출력 —
echo $SECRET - 로그인 실패 메시지 구체적 — "email does not exist" vs "password incorrect" = 계정 열거
다음 글 예고 — "분산 시스템의 본질적 어려움" — CAP, PACELC, Consensus(Raft/Paxos), Vector Clock, Lamport Clock, Saga, Event Sourcing
보안이 '시스템의 신뢰'를 다룬다면, 분산 시스템은 그 시스템의 '진실성'을 다룬다. Kubernetes, Kafka, PostgreSQL, Cloudflare Workers, Spanner — 우리가 쓰는 모든 인프라의 심장에 분산 컨센서스와 시간/순서의 문제가 있다. 2024-2025년 분산 시스템의 실무적 중요도는 어느 때보다 높다.
다음 글에서는:
- CAP 정리 재해석 — 왜 "선택"이 아니라 "네트워크 파티션 때만 관련"
- PACELC — CAP의 보완, 지연 vs 일관성
- Consistency Models — Strong, Linearizable, Sequential, Causal, Eventual
- Raft 깊이 — Leader Election, Log Replication, Safety
- Paxos — 왜 이해하기 어려운가, Multi-Paxos
- Lamport Clock, Vector Clock, HLC — "시간"의 분산 정의
- Distributed Transactions — 2PC, 3PC, Saga 패턴
- Event Sourcing + CQRS — Kafka, EventStore, Axon
- Outbox Pattern — 일관성 없이 이벤트 발행 불가
- Saga 패턴 — 마이크로서비스 트랜잭션
- Exactly-Once Semantics — 실제 존재 여부 논쟁
- FLP Impossibility — 왜 비동기 시스템은 완벽한 합의 불가
- Google Spanner, CockroachDB, TiDB — 현대 분산 DB
을 다룬다. '왜 분산 시스템은 어려운가'라는 본질 질문부터 실전 설계 패턴까지, 현대 백엔드 엔지니어가 마주하는 가장 깊은 주제를 추적한다.
현재 단락 (1/319)
러시아 정보기관 SVR이 SolarWinds Orion 빌드 인프라에 침투. **악성 업데이트가 18,000+ 고객에게 배포** — 포함: 미국 재무부, 국방부, 핵 연구소, Mi...