Curious TechieDev Toolbox
전체 가이드/텍스트 처리8 min read

정규 표현식(Regex)의 원리와 ReDoS 보안 취약점

유한 오토마타 엔진, 문자 클래스, 수량자, 전방/후방 탐색 및 치명적 역추적(ReDoS) 방지 가이드.

핵심 요약 (Key Takeaways)
  • 정규 표현식은 유한 오토마타(DFA/NFA) 매칭 엔진에 의해 해석되는 형식 검색 패턴입니다.
  • 문자 클래스([a-z]), 수량자(+, *), 앵커(^, $)가 기본 구조를 이룹니다.
  • 중첩된 수량자로 인해 매칭 실패 시 계산 시간이 기하급수적으로 폭증하는 ReDoS(정규표현식 DoS)를 주의해야 합니다.
  • 전방 탐색 및 후방 탐색(Lookaround)은 문자열을 소비하지 않고 특정 조건을 검사합니다.

정규 표현식(Regex)은 텍스트, 로그 파일, 소스 코드 및 사용자 입력값에서 복잡한 문자열 패턴을 일치, 검증 및 추출하기 위한 간결하고 강력한 표기법입니다.

1. 정규 표현식 기초 문법과 메타 문자

정규 표현식은 리터럴 문자(예: abc) 또는 특정 문자 집합을 나타내는 메타 문자를 통해 패턴을 평가합니다:

  • \d: 모든 숫자(0-9).
  • \w: 모든 단어 문자(영문자, 숫자, 밑줄).
  • \s: 모든 공백 문자(스페이스, 탭, 줄바꿈).
  • [a-z0-9]: 사용자 정의 문자 클래스.

2. 탐욕적(Greedy) vs 게으른(Lazy) 수량자 비교

기본적으로 *(0회 이상) 및 +(1회 이상)와 같은 수량자는 탐욕적(greedy)으로 동작하여 가능한 한 가장 긴 문자열과 일치합니다. 물음표(*? 또는 +?)를 덧붙이면 게으른(lazy) 일치가 되어 가장 짧은 부분 문자열만을 선택합니다.

3. 전방 탐색(Lookahead) 및 후방 탐색(Lookbehind) 어서션

너비가 0인 어서션(Zero-width assertions)은 실제 텍스트를 소비하지 않고 위치 조건만을 확인합니다:

  • (?=...) 긍정형 전방 탐색: 뒤에 특정 패턴이 이어질 때 일치.
  • (?!...) 부정형 전방 탐색: 뒤에 특정 패턴이 이어지지 않을 때 일치.
  • (?<=...) 긍정형 후방 탐색: 앞에 특정 패턴이 선행할 때 일치.
  • (?<!...) 부정형 후방 탐색: 앞에 특정 패턴이 선행하지 않을 때 일치.

4. 파멸적 역추적(ReDoS) 방지 전략

NFA 엔진에서 중첩된 수량자(예: ([a-zA-Z]+)+$)가 포함된 패턴에 불일치 텍스트가 입력되면 계산량이 지수 함수적(O(2^n))으로 폭증하여 CPU를 독점하고 서버 스레드를 마비시키는 정규식 서비스 거부(ReDoS) 공격에 노출됩니다.