My temporary PHP fix from 2014 has nearly 20M installs. Today I'm deprecating it
2014년에 만든 임시 PHP 패치가 2,000만 회 설치됐습니다 — 오늘 deprecated 처리합니다
저자가 2014년 AOL CMS 업그레이드 중 임시로 작성한 http_build_url() 폴리필이 12년간 Packagist에서 약 2,000만 회 설치되고 WordPress 플러그인·Debian 등에 번들되며 널리 퍼졌습니다. PHP 8.5에 표준 URI API가 도입된 지금, 저자는 유지보수나 인수인계 대신 패키지를 deprecated 처리하기로 결정했습니다.
- 주제
본문
12년 전, 저자는 AOL의 콘텐츠 관리 시스템을 PHP 5.2에서 5.3으로 업그레이드하던 중 임시방편으로 PHP 코드 174줄을 작성했습니다. 업그레이드 과정에서 pecl_http 확장 버전 1을 제거해야 했고, 그 확장이 제공하던 http_build_url() 함수를 CMS가 수십 군데에서 호출하고 있었기 때문에, 실제 함수가 없을 때만 정의되는 자체 구현을 만들어 기존 코드가 변경을 알아채지 못하게 했습니다. 당시 막 떠오르던 Composer 덕분에 공유가 쉬웠고, PHP 커뮤니티가 더 나은 대안으로 넘어갈 때까지 한두 해 쓰이겠거니 생각했습니다.
임시였던 코드의 확산
임시는 아니었습니다. 이 패키지는 Packagist에서 약 2,000만 회 설치됐고 지금도 월 40만 회 이상 설치됩니다. Composer만이 전부도 아닙니다. 시장 점유율 1위 WordPress 다국어 플러그인인 WPML이 이 폴리필을 코드베이스에 직접 번들하고 있고, WPML은 150만 개 이상의 사이트에 설치돼 있다고 밝힙니다. 도메인명 라이브러리 idna-convert도 이 패키지에 의존하는데, 이를 통해 프랑스 CMS인 SPIP 소스에 포함되고 Debian과 Ubuntu에 패키징됐습니다. 저자는 여러분이 지금도 자신의 코드가 돌고 있는 웹사이트를 방문했을 가능성이 꽤 높다고 말합니다.
숨어 있던 버그
몇 달 전 몇 년 만에 패키지를 다시 살보며 확산 규모를 파악했습니다. GitHub 이슈 중에는 슬래시로 끝나는 URL에 경로를 붙일 때 경로에서 문자 'a'가 전부 지워진다는 것이 있었습니다. '// Workaround for trailing slashes'라는 주석 아래에서, 코드는 경로에 'a'를 붙여 항상 잘라낼 마지막 세그먼트를 만든 뒤 찾아바꾸기로 제거하는데, 경로가 슬래시로 끝나면 그 마지막 세그먼트가 'a' 자체여서 경로에 있던 다른 'a'들까지 함께 지워집니다. 저자는 이 버그가 그렇게 오래 발견되지 않았다는 게 믿기지 않는다고 씁니다.
인계도 유지도 아닌 선택
선택지는 PHP로 복귀하거나, 자원했던 세 명 중 한 명에게 넘기거나, 그대로 두는 것이었지만 저자는 어차피 임시로 만들어진 것이므로 은퇴시키기로 했습니다. PHP League의 URI 라이브러리가 수년간 커뮤니티의 표준 답이었고, PHP 8.5부터는 언어 자체에 표준 준수 URI API가 내장됩니다. 유지보수는 모두가 가야 할 이주를 늦출 뿐이고, 인계는 위험을 얹는 셈입니다. 널리 설치된 패키지를 다운스트림이 검증하지 못한 새 메인테이너에게 넘기는 것은 공격자들이 노리는 바로 그 지점이며, 저자는 xz Utils 백도어 사례를 다룬 Veritasium 영상을 가장 잘 된 설명으로 꼽습니다. 패키지는 계속 설치되지만 'a' 버그를 포함한 새 수정은 나오지 않으며, README에 이주 방법을 안내했습니다. 덧붙여 AOL의 CMS는 끝내 이 '임시' 폴리필에서 벗어나지 못했고, 플랫폼 전체가 2020년경 종료될 때까지 그대로 돌았습니다.
Hacker News 반응
- @jakeasmith — 저자입니다. 질문이 있으면 답하겠습니다. http_build_url 폴리필이 이렇게까지 퍼질 줄은 상상도 못 했습니다. 12년이 지난 지금, 커뮤니티와 PHP 자체의 새로운 선택지들을 고려하면 deprecated 처리가 맞는 결정이라고 봅니다.
- @HackerThemAll — JavaScript 세계에는 이 패치가 복잡한 프로젝트처럼 보일 만큼 조잡한 것들이 널려 있습니다. is-odd, is-even, left-pad, is-whitespace-character, isarray 같은 패키지들을 보세요.
- @amhoab — AOL에서 같이 일했었죠. 여기서 보니 반갑네요. 잘 지내시길 바랍니다!
- @yard2010 — 이 글을 읽으니 2014년으로 돌아간 느낌입니다. 그때 AOL에서 일하는 건 어땠나요?
- @hdjrudni — 11년간 업데이트가 없었는데 '살려두고 있었다'고 부르기는 어렵지 않을까요.
원문: Hacker News / 번역·요약: Trawling