2014년에 임시로 만든 PHP 수정 코드가 2천만 번 가까이 설치되었습니다. 오늘 저는 이 코드의 지원 중단을 선언합니다.

이 기사는 2014년에 개발자가 임시로 만들었던 프로그래밍 코드 조각을 공식적으로 은퇴시킨다는 이야기입니다. 여기서 'PHP'는 웹사이트를 만들 때 널리 쓰이는 프로그래밍 언어이고, '콘텐츠 관리 시스템'은 블로그나 웹사이트를 쉽게 관리하도록 돕는 프로그램입니다. 개발자는 AOL이라는 회사의 시스템을 업그레이드하면서 사라진 특정 기능인 'http_build_url'을 대신하기 위해 174줄짜리 임시 코드를 작성했습니다. 다른 프로그래머들이 이 코드를 쉽게 가져다 쓸 수 있도록 '패키지'라는 공개 저장소에 올렸고, 이것이 다른 프로그램들에 도구처럼 포함되면서 무려 2천만 번 가까이 설치되었습니다.

단 몇 년만 쓰고 버릴 줄 알았던 임시 코드가 예상보다 훨씬 오랜 기간 동안 수많은 웹사이트와 대형 플러그인에 쓰였다는 점이 밝혀졌습니다. 개발자는 최근 몇 년간 PHP 개발을 떠나 있었고 오랫동안 코드를 방치했는데, 그동안 경로에 특정 글자가 지워지는 버그가 방치되어 있었다는 사실을 뒤늦게 발견했습니다. 코드를 직접 고치거나 다른 사람에게 관리 권한을 넘기는 대신, 이제는 더 안전하고 표준화된 최신 도구들이 있으니 이 코드를 공식적으로 중단하기로 결정했습니다. 검증되지 않은 새로운 관리자에게 권한을 넘겼다가 발생할 수 있는 보안 위험을 피하고, 개발자들이 더 나은 최신 기술로 완전히 갈아타도록 유도하기 위해서입니다.

2014년에 임시로 만든 PHP 수정 코드가 2천만 번 가까이 설치되었습니다. 오늘 저는 이 코드의 지원 중단을 선언합니다.

2026년 9월 15일

12년 전, 저는 에이오엘(AOL, 미국의 대형 인터넷 기업)의 콘텐츠 관리 시스템(CMS, 웹사이트의 글과 그림을 쉽게 관리하는 프로그램)을 임시로 고치기 위해 PHP(웹사이트를 만드는 데 널리 쓰이는 프로그래밍 언어) 코드 174줄을 작성했습니다. 누군가 이 수정 도구가 필요할지 몰라 '패키지스트(Packagist, PHP 프로그램 부품을 모아두고 공유하는 온라인 저장소)'에 올려두었는데, 어째서인지 그동안 2천만 번 가까이 설치되었습니다. 오늘 저는 이 코드에 '지원을 중단함(더 이상 고치거나 관리하지 않음)'이라는 표지를 붙였습니다.

임시 땜질용 코드

2014년 당시 우리는 에이오엘의 콘텐츠 관리 시스템을 PHP 버전 5.2에서 5.3으로 업그레이드하는 중이었습니다. 그 업그레이드 과정의 일부로 'pecl_http'라는 확장 프로그램의 1번 버전을 쓰지 않게 되었는데, 이 안에는 'http_build_url()'이라는 함수(프로그램에서 특정 동작을 수행하는 명령어 묶음)가 들어 있었습니다. 콘텐츠 관리 시스템은 웹 주소(URL)를 아주 많이 다루기 때문에, 우리 시스템도 이 함수를 여러 곳에서 불러다 쓰고 있었습니다. 저는 그 기존 코드들을 일일이 건드리고 싶지 않았습니다. 그 함수를 다시 만드는 일은 그리 어렵지 않아 보여서, 진짜 함수가 컴퓨터에 없을 때만 대신 작동하는 저만의 'http_build_url()' 함수를 직접 작성했습니다. 기존 코드는 무언가 바뀐 줄도 모른 채 그대로 작동했습니다.

당시에는 '컴포저(Composer, 프로그래밍 부품을 관리하는 도구)'가 막 인기를 끌기 시작하던 때여서 만든 코드를 남들과 공유하기가 아주 쉬웠습니다. 저는 PHP 개발 생태계가 더 나은 기술로 넘어갈 때까지 1년이나 2년 정도만 제 역할을 해주면 되겠지 하고 생각했습니다.

어마어마한 설치 횟수

글쎄요, 임시용이 아니었습니다. 이 코드는 패키지스트를 통해 2천만 번 가까이 설치되었으며, 지금도 한 달에 40만 번이 넘는 설치가 이루어지고 있습니다.

2026년 9월 15일 기준 'jakeasmith/http_build_url' 패키지의 패키지스트 설치 통계에 따르면 총 설치 횟수는 19,864,271회이며, 최근 30일 동안의 설치 횟수는 401,308회입니다. 하루 설치 횟수는 2014년 거의 0에 가까웠던 것에서 꾸준히 늘어나 2026년에는 하루 평균 약 13,000회를 기록하고 있습니다.

게다가 알고 보니 컴포저는 전체 그림의 일부에 불과했습니다. 워드프레스(전 세계에서 가장 많이 쓰이는 웹사이트 제작 도구) 시장에서 점유율 1위인 다국어 지원 플러그인(부가 기능 프로그램) 'WPML'이 제 코드를 프로그램 소스 안에 통째로 넣어서 배포하고 있었고, WPML 측은 이 플러그인이 150만 개가 넘는 웹사이트에 설치되어 있다고 밝혔습니다. 인터넷 주소 관련 라이브러리(미리 만들어 둔 프로그램 부품 모음)인 'idna-convert'도 제 코드에 의존하고 있으며, 이것이 프랑스의 콘텐츠 관리 시스템인 'SPIP'의 소스 코드에 포함되고 데비안(Debian)과 우분투(Ubuntu, 리눅스 운영체제 종류) 같은 리눅스 운영체제에도 패키지 형태로 들어가게 된 경위입니다. 이 모든 것을 종합해 보면, 여러분이 평소에 방문한 웹사이트 중에도 제 코드가 아직 돌아가고 있는 곳이 있을 확률이 꽤 높습니다.

이렇게까지 멀리 갈 줄은 상상도 못 했습니다.

다시 들여다보다

저는 몇 달 전에 몇 년 만에 처음으로 이 프로그램을 살펴보기 전까지는 이 코드가 얼마나 널리 퍼졌는지 전혀 실감하지 못했습니다. 사용자가 있다는 것은 알고 있었습니다. 2021년쯤에는 PHP를 떠나 다른 일을 한 지 꽤 되었는데, 다운로드 수가 너무 놀라워서 새로운 관리자를 구하겠다고 공개적으로 요청하기도 했습니다. 세 사람이 나섰습니다. 하지만 관리자를 구한다고 올린 직후에 집안에 갑작스러운 우환이 생겨 한동안 삶이 완전히 뒤흔들렸습니다. 저는 결국 후속 조치를 하지 못했고, 그것은 전적으로 제 잘못입니다. 상황이 어느 정도 진정되었을 때는 다른 목표들에 쫓기느라 이 프로그램의 존재를 몇 년 동안 잊고 살았습니다.

설치 수치와 함께 깃허브(GitHub, 개발자들이 코드를 공유하고 수정 사항을 논의하는 온라인 공간)에 올라온 몇 가지 문제 제기 글도 눈에 띄었습니다. 그중에는 웹 주소 뒤에 붙는 슬래시(/) 기호에 다른 경로를 이어 붙일 때 주소 안의 모든 알파벳 'a'가 통째로 지워져 버린다는 내용의 버그(프로그램 오류) 신고도 있었습니다. '단순하다'고 생각했던 코드가 사실은 그렇지 않았던 것입니다. '슬래시 처리용 임시 방편'이라고 적어둔 주석 아래에서, 제 코드는 주소 경로 끝에 항상 잘라낼 마지막 조각이 있도록 억지로 'a'를 붙인 다음 '찾아서 바꾸기' 기능으로 그것을 잘라내도록 만들어져 있었습니다. 경로가 슬래시로 끝날 때 그 마지막 조각은 하필 제가 억지로 붙인 'a'가 되고, 이 '찾아서 바꾸기' 과정이 경로 전체에 있던 다른 모든 'a'까지 같이 지워버리게 된 것입니다. 이 버그가 그렇게 오랫동안 아무도 모르게 방치되었다는 사실이 믿기지 않습니다.

그래서 저는 결정을 내려야 했습니다. 거의 10년 만에 다시 PHP 세계로 뛰어들거나, 예전에 관리자를 하겠다고 나섰던 사람 중 한 명에게 이 프로그램을 넘기거나, 아니면 그냥 이대로 내버려 두는 것 중 하나를 선택해야 했습니다.

그 어느 쪽도 아닙니다.

이 코드는 원래 잠시 쓰려고 만든 것이므로 이제 은퇴시키려고 합니다. 그동안 프로그래밍 언어 PHP를 사용하는 사람들이 모인 커뮤니티에서는 PHP 리그의 URL 라이브러리라는 도구를 대안으로 써왔으며, 최근 PHP 8.5 버전부터는 표준 규칙을 따르는 URL API가 언어 자체에 포함되어 출시되었습니다. (이 사실을 알려준 jawira에게 감사를 전합니다.) 이 두 가지 모두 2014년에 174줄로 대충 만들어 붙였던 임시 코드보다 훨씬 훌륭합니다. 이 프로그램을 계속 유지보수하는 것은 모든 사람이 나아가야 할 올바른 전환을 늦추기만 할 뿐이며, 다른 사람에게 관리를 넘기는 것은 그 위에 위험을 하나 더 얹는 일입니다. 관리를 자원해 준 분들을 의심하는 것은 아니며, 실제로 ozh라는 개발자는 'YOURLS'라는 프로그램에서 쓰기 위해 이 코드를 따로 복사해 고쳐 쓰는 포크를 계속 유지해 왔습니다. 하지만 이렇게 널리 설치된 프로그램에 원래 사용자들이 검증하지 못한 새로운 관리자가 나타나는 상황은 바로 해커들이 노리는 표적이 됩니다. 유튜브 채널 베리타시움의 xz Utils 백도어 관련 영상은 이러한 상황이 실제로 어떻게 전개되는지 보여주는 가장 훌륭한 설명입니다.

이 패키지는 앞으로도 설치는 계속할 수 있지만, 빠진 글자 'a'를 채워 넣는 버그 수정을 포함하여 새로운 수정 사항은 더 이상 제공되지 않습니다. 이렇게 오랜 시간 동안 변경이 없던 상태였기 때문에, 단 한 줄만 고치는 코드 수정이라 하더라도 이를 지원해 줄 사람이 없는 상황에서는 누군가에게 예상치 못한 부작용을 일으킬 수 있습니다. 설명서 파일인 README에는 다른 안전한 도구로 갈아타는 방법이 안내되어 있습니다.

저는 저 자신과 저와 똑같이 고통스러운 프로그램 전환 과정을 겪고 있는 다른 개발자들을 돕기 위해 이 코드를 작성했습니다. 그동안 코드를 고쳐달라고 제안하는 풀 리퀘스트를 보내주거나 직접 관리하겠다고 나서주신 분들, 그리고 제가 더 이상 읽지 않게 된 이후에도 한참 동안 오류를 계속 보고해 주신 모든 분께 진심으로 감사드립니다. 임시로 만든 해결책치고는 참 훌륭하고 긴 여정이었습니다.

추신으로, 우리는 AOL의 콘텐츠 관리 시스템(CMS)을 이 '임시' 코딩 보조 도구에서 끝내 벗어나게 하지 못했습니다. 이 코드는 2020년경 그 플랫폼 전체가 완전히 문을 닫을 때까지 그곳에서 계속 실행되었습니다.

일반 독자 입장에서는 내가 자주 방문하는 웹사이트가 워드프레스의 다국어 플러그인이나 다른 도구를 통해 오래된 코드를 여전히 백그라운드에서 실행하고 있을 가능성이 있습니다. 개발자가 이 패키지를 공식 은퇴시키고 지원을 중단하더라도 기존에 설치된 프로그램이 당장 멈추거나 망가지는 것은 아니며 다운로드 기능 자체는 당분간 유지됩니다. 다만 앞으로 새로운 보안 취약점이나 버그가 고쳐지지 않으므로, 개발자들은 안내에 따라 최신 기술인 PHP 표준 기능이나 다른 전문 라이브러리로 코드를 바꾸어야 합니다.