On the Complexity of the Matching Problem of Regular Expressions with Backreferences
본 논문은 SETH 와 삼각형 탐지 가정에 따른 조건부 하한을 증명하고 1-사용 백레퍼런스에 대한 개선된 알고리즘을 제시함으로써 백레퍼런스가 포함된 정규 표현식의 매칭에 대한 세밀한 계산 복잡성을 확립한다.
원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
"백레퍼런스를 포함한 정규식의 매칭 문제 복잡성에 관한" 논문을 일상적인 언어와 비유를 사용하여 번역한 설명입니다.
큰 그림: "정규식" 교통 체증
당신은 클럽 (컴퓨터 시스템) 의 경비원이라고 상상해 보세요. 입실할 수 있는 사람을 위한 규칙 목록 (정규식) 을 가지고 있습니다.
- 단순한 규칙: "빨간 셔츠를 입은 사람만." 이는 확인하기 쉽습니다. 셔츠를 보고 "빨간색? 네, 들어오세요"라고 말합니다. 줄이 10 명이든 1 만 명이든 소요되는 시간은 동일합니다.
- 문제 (ReDoS): 때로는 해커들이 경비원이 불필요한 엄청난 작업을 하도록 속이는 특정 줄을 꾸밉니다. 한 사람을 확인하고 넘어가는 대신, 경비원은 A 를 확인하고, B 를 확인하고, 다시 A 를 확인하고, C 를 확인하고, 다시 A 를 확인합니다... 경비원이 지쳐 쓰러질 때까지 계속됩니다. 이를 서비스 거부 (ReDoS) 공격이라고 합니다.
실제 세계에서는 이로 인해 Stack Overflow 나 Cloudflare 와 같은 거대 웹사이트들이 마비되었습니다. 논문은 100 명을 확인하는 데 1 만 단계가 걸리는 "2 차 (quadratic)" 수준의 느림조차 시스템을 마비시키기에 충분하다고 지적합니다.
악당: "백레퍼런스"
표준 규칙은 단순합니다. 하지만 현대의 "정규식" 엔진에는 백레퍼런스라는 초강력 기능이 있습니다.
비유:
"단어를 찾아서 기억한 뒤, 나중에 완전히 같은 단어가 다시 나타나는지 확인하라"는 규칙을 상상해 보세요.
- 예시: "단어를 찾아 'X'라고 부르세요. 그 다음 'X'를 다시 찾으세요."
- 입력이
apple ... apple이면 작동합니다. - 입력이
apple ... banana이면 실패합니다.
이 기능은 프로그래머들에게 매우 유용하지만, 경비원의 일을 훨씬 더 어렵게 만듭니다. 경비원은 이전에 본 것을 기억하고 현재 보고 있는 것과 끊임없이 비교해야 합니다. 논문은 이렇게 질문합니다: 이러한 복잡한 규칙을 처리하면서도 지치지 않을 만큼 빠른 경비원을 만들 수 있을까요?
논문의 발견: 좋은 점, 나쁜 점, 그리고 끔찍한 점
저자들은 이러한 매칭 문제를 해결하는 것이 얼마나 어려운지 정확히 조사했습니다. 이를 어려움 (Hardness) (왜 어려운지) 과 알고리즘 (어떻게 해결할지) 두 가지 측면으로 나누어 분석했습니다.
1. 나쁜 소식: 일부 규칙은 속도를 높일 수 없습니다
논문은 특정 유형의 복잡한 규칙에 대해서는 속도를 높이는 "만병통치약"이 없음을 증명합니다.
- "삼각형" 문제: 두 개의 변수를 사용하는 규칙 (예: 두 개의 다른 단어를 기억했다가 나중에 확인하는 경우) 이 있다면, 이를 해결하는 것은 거대한 소셜 네트워크 그래프에서 삼각형을 찾는 것만큼 어렵습니다. 규칙을 빠르게 해결할 수 있다면 그래프 문제도 빠르게 해결할 수 있습니다. 그래프 전문가들은 그래프 문제가 본질적으로 느리다고 믿기 때문에, 규칙 문제 역시 느릴 수밖에 없습니다.
- "직교 벡터" 문제: 변수가 더 많은 규칙의 경우, 필요한 시간이 변수의 수에 따라 기하급수적으로 증가함을 증명했습니다. 자물쇠에서 특정 키 조합을 찾는 것과 같습니다. 키가 많을수록 무차별 대입으로 빠르게 찾는 것은 불가능해집니다.
교훈: 규칙이 너무 복잡하다면 (많은 "기억하기" 기능을 사용한다면), 이를 위한 빠른 엔진을 만들 수 없습니다. 항상 벽에 부딪히게 됩니다.
2. 좋은 소식: 단순한 경우를 위한 "거의 선형" 솔루션
그러나 논문은 절묘한 지점을 발견했습니다. 그들은 특정한 일반적인 규칙 유형에 집중했습니다.
- "ABCBD" 패턴: "단어 (A) 를 찾고, 단어 (B) 를 찾고, 단어 (C) 를 찾고, 정확히 같은 단어 B 를 다시 찾고, 단어 (D) 를 찾으세요."
- 실제 예시: "사용자 이름을 찾고, 비밀번호를 찾고, 메시지를 찾고, 같은 사용자 이름을 다시 찾고, 서명을 찾으세요."
저자들은 이것이 까다로워 보이지만 매우 효율적으로 해결될 수 있음을 발견했습니다.
- 구식 방법: 이전 방법들은 도서관에서 모든 가능한 조합을 확인하는 것과 같아 시간 (2 차) 이 소요되었습니다. 책이 1,000 페이지라면 100 만 단계가 걸렸습니다.
- 신규 방법: 저자들은 약 시간이 소요되는 새로운 알고리즘을 개발했습니다.
- 비유: 도서관이 **접미사 트리 (Suffix Trees)**와 **인수화 숲 (Factorization Forests)**을 사용하는 마법 같은 색인 시스템으로 정리되어 있다고 상상해 보세요. 모든 페이지를 읽는 대신, 경비원은 관련 섹션으로 바로 이동할 수 있습니다. 책이 1,000 페이지라면 새로운 방법은 약 1 만 단계 (또는 그보다 적음) 만 소요되어 엄청난 개선입니다.
새로운 알고리즘의 작동 원리 (마법 같은 기술들)
이 속도를 달성하기 위해 저자들은 논문에서 설명하는 몇 가지 교묘한 기법을 사용했습니다.
- 접미사 트리 (지도): 입력 문자열의 거대한 지도를 구축했습니다. 이 지도는 문자열의 모든 가능한 끝부분을 보여줍니다. 이를 통해 경비원은 "아, 이 단어 'B'는 여기에도 나타나고 저기에도 나타나네"라고 즉시 알 수 있습니다.
- 무겁고 가벼운 분해 (정렬 모자): 지도를 "무거운" 경로 (매우 흔한 경로) 와 "가벼운" 경로 (드문 경로) 로 나눴습니다. 무거운 작업은 드문 경로에서만 수행하여 시간을 절약합니다.
- 주기성 (리듬): 단어의 반복 (예: "B...B") 이 있을 때 문자열은 종종 리듬이나 패턴을 가진다는 점을 발견했습니다. 모든 글자를 확인하는 대신 수학을 사용하여 이러한 패턴을 예측했습니다.
- 인수화 숲 (색인): 이는 초고속 색인과 같은 자료 구조로, 텍스트의 길이에 상관없이 텍스트 조각이 규칙과 일치하는지 상수 시간으로 확인할 수 있게 해줍니다.
결론 요약
- 모든 ReDoS 공격을 막을 수 있을까요? 아닙니다. 규칙이 너무 복잡하다면 (너무 많은 "기억하기" 변수를 사용한다면), 수학적으로 느릴 수밖에 없음이 증명되었습니다.
- 가장 흔한 복잡한 규칙을 고칠 수 있을까요? 네! 한 단어를 기억하고 나중에 한 번 확인하는 특정 경우 ("ABCBD" 패턴) 에 대해 저자들은 단순한 규칙만큼 빠른 새로운 엔진을 만들었습니다.
- 왜 이것이 중요한가요? 이는 소프트웨어 엔지니어들에게 다음과 같이 알려줍니다: "백레퍼런스를 너무 많이 사용하지 마세요. 그렇지 않으면 느려집니다. 하지만 이 특정하고 일반적인 방식으로 사용한다면, 이제 시스템이 안전하고 빠르게 유지되도록 새로운 방법을 사용할 수 있습니다."
이 논문은 본질적으로 모래 위에 선을 그었습니다: 여기는 속도 제한이 깨지지 않는 곳이고, 여기서는 우리가 더 빠르게 운전할 방법을 찾았습니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.