Skip to content
Published on

보안 기초에서 모던 Zero Trust까지 심화 가이드 — OWASP Top 10, OAuth/OIDC, JWT 논쟁, Passkeys, mTLS, SPIFFE/SPIRE, CSP, Supply Chain, SIEM까지 (2025)

Authors

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. AppAuthorize URL (client_id, redirect_uri, scope, code_challenge)
2. User login, consent
3. Auth Server → redirect with ?code=xyz
4. AppToken endpoint (code, code_verifier) → access_token + id_token
5. AppResource 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 — 클라우드

흔한 실수

  1. id_token을 API 인증에 — id_token은 사용자 식별, access_token이 인가
  2. access_token을 브라우저 localStorage — XSS로 탈취
  3. state 파라미터 생략 — CSRF 취약
  4. nonce 생략 — id_token replay
  5. scope를 너무 넓게 — 원칙 위반

JWT 논쟁 — 왜 탈출이 일어나는가

JWT(JSON Web Token)는 2015년 RFC 7519. 하지만 2020년대 들어 "JWT is bad for sessions" 논쟁이 가열.

JWT 장점

  • Stateless — 서버에 세션 저장 불필요
  • 분산 검증 — public key로 어느 서비스든
  • 구조화된 클레임 (role, exp, iss)

JWT 단점

  1. Revocation 어려움 — 발급 후 만료 전까지 회수 불가 (blocklist 쓰면 stateful 되니 의미 없음)
  2. Bloat — 쿠키보다 5-10배 큼
  3. 알고리즘 혼동alg: none 공격, HS256 ↔ RS256 혼용 공격
  4. 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는 별도 로테이션
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가지

  1. 모든 데이터 소스/컴퓨팅 서비스는 리소스 — 인증 대상
  2. 모든 통신은 암호화 (네트워크 위치 무관)
  3. 접근은 세션 기반 (지속적 평가)
  4. 접근은 정책 기반 — 사용자, 디바이스, 환경 속성
  5. 모든 리소스의 무결성 + 상태 모니터링
  6. 모든 접근은 인증 + 인가 동적으로
  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년부터 공개 문서화.

실전 단계

  1. Inventory — 자산, 사용자, 디바이스, 흐름 파악
  2. Identity — IdP 중앙화, MFA 필수
  3. Device — EDR 배포, 컴플라이언스 체크
  4. Network — VPN 제거, ZTNA 도입
  5. Application — 앱별 SSO, 정책
  6. Data — 분류, DLP, 암호화
  7. 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 영향

교훈

  1. 오픈소스 유지자 번아웃 — 한 사람에게 의존하는 수천 프로젝트
  2. 사회공학 장기전 — 2년+
  3. 정적 분석만으로 탐지 불가 — 테스트 파일에 위장, 런타임만 활성
  4. 우연한 발견 — Andres가 없었다면 수개월/수년 지속됐을 것

커뮤니티 대응

  • Sovereign Tech Fund (독일 정부) — 오픈소스 유지자 펀딩
  • OpenSSF Alpha-Omega — 상위 프로젝트 보안 지원
  • CRA (EU Cyber Resilience Act, 2027) — 유지자 면책 조항

실전 보안 체크리스트 (2025)

  1. MFA 강제 — 내부 계정 100%
  2. Passkeys 지원 — 외부 사용자에게 선택지
  3. Secret 관리 — Vault 또는 클라우드 Secret Manager
  4. mTLS + SPIFFE — 서비스 간 인증
  5. RBAC + RLS — 최소 권한
  6. Security Headers — HSTS, CSP, Referrer-Policy
  7. TLS 1.3 — 강제
  8. 의존성 스캔 — Dependabot + Trivy CI 통합
  9. Signing & SBOM — sigstore, cosign, Syft
  10. CSPM — 분기별 클라우드 감사
  11. SIEM 로그 통합 — 최소 90일 보관
  12. Incident Response Runbook — 분기별 훈련

10가지 흔한 안티패턴

  1. localStorage에 access token — XSS로 탈취
  2. JWT로 장기 세션 — revocation 불가
  3. 평문 비밀번호 (또는 MD5) — Argon2id 사용
  4. 모든 서비스에 root IAM — least privilege 위반
  5. Security Group 0.0.0.0/0 — 인터넷 전체 오픈
  6. 에러 메시지에 stack trace — 내부 노출
  7. HTTP Basic Auth 프로덕션 — MFA 없음, phishing 쉬움
  8. 하드코딩된 API key 커밋 — git history에 영원히
  9. CI/CD에서 비밀 로그 출력echo $SECRET
  10. 로그인 실패 메시지 구체적 — "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

을 다룬다. '왜 분산 시스템은 어려운가'라는 본질 질문부터 실전 설계 패턴까지, 현대 백엔드 엔지니어가 마주하는 가장 깊은 주제를 추적한다.