핵심 요약
ReDoS(정규식 서비스 거부)는 특정 정규식이 어떤 입력에서 지수적으로 느려지는 것을 악용한다. 공격자가 짧은 문자열 하나만 보내도 정규식 엔진이 재앙적 백트래킹(catastrophic backtracking)에 빠져 CPU가 100%로 치솟고 서버가 응답 불능이 된다. 원인은 대개 중첩된 수량자다.
1. 취약한 패턴
// 위험: 중첩 수량자 (a를 여러 방식으로 쪼갤 수 있음)
/^(a+)+$/
/^(\d+)*$/
/(x+x+)+y/
(a+)+에 "aaaaaaaaaaaaaaaaaaaaX"를 넣으면, 엔진이 a들을 나누는 경우의 수를 지수적으로 시도하다 멈춘다. 글자 몇 개만 늘려도 수초→수분으로 폭발한다.
2. 왜 느려지나 — 백트래킹
정규식 엔진(대부분 백트래킹 방식)은 매칭이 실패하면 앞으로 돌아가 다른 조합을 시도한다. (a+)+처럼 같은 문자를 여러 그룹이 나눠 먹을 수 있으면 조합이 2ⁿ으로 늘어난다. 이것이 재앙적 백트래킹이다.
3. 안전하게 짜기
- 중첩 수량자 피하기 —
(a+)+→a+로 충분한 경우가 많다 - 구체적으로 —
.*남발 대신 문자 클래스를 좁혀라([^"]*등) - 앵커·경계로 매칭 범위를 명확히
- 사용자 입력에 복잡한 정규식 직접 적용 금지 — 특히 사용자가 정규식 자체를 제공하게 하지 말 것
4. 방어 장치
| 방법 | 내용 |
|---|---|
| 타임아웃 | 정규식 실행에 시간 제한(일부 엔진/라이브러리 지원) |
| 비백트래킹 엔진 | RE2(구글) 등 선형 시간 보장 엔진 사용 |
| 입력 길이 제한 | 검증 전에 최대 길이 컷 |
| 정적 분석 | ESLint 플러그인 등으로 취약 정규식 탐지 |
자주 묻는 질문
내 정규식이 취약한지 어떻게 아나요?
"중첩된 수량자"((x+)+, (x*)*)나 겹치는 대안이 있으면 의심하세요. 온라인 ReDoS 검사기나 정적 분석 도구로 점검할 수 있습니다. 확신이 없으면 입력 길이를 제한하고 타임아웃을 거세요.
RE2 같은 엔진을 쓰면 완전히 안전한가요?
RE2는 백트래킹을 쓰지 않아 선형 시간을 보장하므로 ReDoS에 근본적으로 강합니다. 다만 역참조 같은 일부 기능을 지원하지 않습니다. 사용자 입력을 정규식으로 다루는 서버라면 도입할 가치가 큽니다.
이메일 검증 정규식도 위험한가요?
지나치게 복잡한 이메일 정규식 중 일부는 ReDoS에 취약합니다. 그래서 이메일은 느슨한 정규식으로 형식만 확인하고 실제 검증은 인증 메일로 하는 게 안전합니다.

댓글 0