피드로 돌아가기
How Zod's .refine() Can Cause a Denial of Service — And How to Fix It
Dev.toDev.to
Security

Zod .refine() 실행 순서 오해로 인한 Application-layer DoS 취약점 해결

How Zod's .refine() Can Cause a Denial of Service — And How to Fix It

Hrushikesh Shinde2026년 5월 1일16intermediate

Context

Zod 라이브러리 사용 시 .min(), .max() 같은 기본 검증자가 실패해도 .refine() 내 커스텀 로직이 항상 실행되는 설계 특성 존재. 특히 Uniqueness Check를 위해 .refine() 내부에 Database Query를 포함한 경우, 유효하지 않은 입력값에도 DB 부하가 발생하는 구조적 결함 발생.

Technical Solution

  • 검증 파이프라인의 순차적 실행 가정을 폐기하고 Zod의 'Collect-all-errors' 설계 방식 인식
  • 구조적 검증과 비용이 큰 비즈니스 검증을 분리하는 Two-phase Validation 패턴 도입
  • Zod 스키마를 통한 데이터 타입 및 길이 등 기본 구조 검증을 1단계로 수행
  • 1단계 통과가 확인된 Validated Data에 대해서만 Database Query 등 Expensive Operation을 2단계에서 실행
  • 입력값 크기에 비례한 응답 시간 증가를 차단하여 리소스 고갈 방지 및 보안성 강화

- Zod .refine() 내부에 DB Query나 External API 호출이 포함되어 있는지 전수 조사 - Schema Validation 단계에서는 순수하게 데이터의 '형태'만 검증하고 있는지 확인 - 비즈니스 로직 및 상태 확인(Stateful Validation)은 parse() 완료 후 서비스 레이어에서 처리 - 입력값 크기 변화에 따른 응답 시간 차이를 측정하는 응답 시간 상관관계 테스트 수행

원문 읽기