느린 정규식과 서비스 마비를 부르는 파국적 백트래킹(ReDoS) 피하기.
정규식 대부분은 매우 빠르지만, 특정 패턴은 입력 길이에 따라 실행 시간이 기하급수적으로 늘어날 수 있습니다. 이를 파국적 백트래킹이라 하고, 악의적 입력으로 서버를 멈추게 만드는 공격을 ReDoS(정규식 서비스 거부)라고 합니다.
가장 흔한 원인은 중첩된 수량자입니다. (a+)+ 나 (.*)* 처럼 반복 안에 반복이 겹치고 뒤가 실패하면, 엔진이 가능한 모든 분할을 시도하며 폭발합니다. (a|a)* 같은 모호한 교대도 같은 문제를 일으킵니다.
예방의 핵심은 모호함을 없애는 것입니다. 겹치는 반복을 하나로 합치고, .* 대신 [^x]* 처럼 범위를 좁히며, 가능하면 원자 그룹이나 소유 수량자(자바스크립트에는 없음)를 고려합니다. 입력 길이 제한도 실무에서 효과적입니다.
이 테스터는 브라우저에서 실행되므로 위험한 패턴은 여러분의 탭만 잠깐 느리게 할 뿐이지만, 같은 패턴을 서버에서 신뢰할 수 없는 입력에 쓰기 전에는 반드시 성능을 점검하세요.