LabHub

블로그

보안 기초에서 모던 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 느려진 것을 발견해 적발. 소셜 엔지니어링 + 장기 은닉 + 오픈소스 공급망 공격의 교과서 사례.

공통 교훈

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)

방어:

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

A06 — Vulnerable Components

A07 — Identification and Authentication Failures

A08 — Software/Data Integrity Failures

A09 — Security Logging and Monitoring Failures

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 — 정확히 이해하기

보안에서 가장 자주 오해되는 주제. 용어 정리부터:

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

2019년 OAuth 2.1 초안 — Implicit Flow, ROPC(Resource Owner Password Credentials) deprecated. 여전히 쓰면 안 됨.

주요 구현

흔한 실수

  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 장점

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 같은 개발자들이 블로그로 재확산.

권장:

Set-Cookie: sid=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=604800

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 표준 기반.

원리

이점

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)

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

용도

운영 문제

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 자동 발행

사용 기업

Istio 1.0부터 SPIFFE 사용. Linkerd도 호환.

Zero Trust Architecture — NIST 800-207

NIST가 2020년 발표한 공식 문서. "절대 신뢰하지 말고 항상 검증하라".

원칙 7가지

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

구현 요소

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 관리

문제

HashiCorp Vault

가장 표준적. Secret을 동적으로 발급 (DB 자격증명도 TTL 기반).

vault kv put secret/myapp password=abc123

# 앱은 Vault Agent로 자동 인증
vault agent -config=vault-agent.hcl

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';

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 세 가지 값

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년 급성장 분야.

주요 제품

표준 체크

DSPM (Data Security Posture)

CSPM의 확장. 데이터 위치 + 분류 + 접근 권한 스캔. Cyera, Varonis, BigID.

SIEM (Security Information and Event Management)

로그 수집 + 상관관계 분석 + 알림.

전통적 SIEM

클라우드 네이티브 SIEM

XDR (Extended Detection and Response)

SIEM + EDR + NDR 통합.

Cloud-native 보안 도구

Supply Chain 공격 — XZ Utils 심층

XZ Utils 사건(2024.03)은 앞으로 몇 년간 사례 연구 대상.

타임라인

교훈

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

커뮤니티 대응

실전 보안 체크리스트 (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년 분산 시스템의 실무적 중요도는 어느 때보다 높다.

다음 글에서는:

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

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다