TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 26 READS

20년 지나도 살아남은 '임시방편' 코드, 2천만 설치의 폴리필이 남긴 교훈

20년 지나도 살아남은 '임시방편' 코드, 2천만 설치의 폴리필이 남긴 교훈
SOURCE IMAGE · HACKER NEWS

소프트웨어에서 '임시'라는 단어만큼 오래 살아남는 것도 드물다. 개발자 제이크 스미스(Jake Smith)는 2014년 급한 마이그레이션을 넘기려고 174줄짜리 PHP 코드를 하나 작성했는데, 그 코드가 12년 동안 약 2천만 회 설치되며 지금도 매달 40만 건 넘게 내려받아지고 있다. 그리고 그는 최근 이 패키지를 공식적으로 폐기(deprecated) 처리했다. 이 사례는 오픈소스 생태계에서 '작은 셈'이 어떻게 인프라의 일부가 되고, 유지보수 부담과 보안 위험으로 되돌아오는지를 압축해 보여준다.

임시 폴리필이 인프라가 되기까지

2014년 당시 그는 AOL의 콘텐츠 관리 시스템(CMS)을 PHP 5.2에서 5.3으로 올리는 작업을 하고 있었다. 이 업그레이드 과정에서 pecl_http 확장의 버전 1이 빠지게 됐고, 그와 함께 CMS 곳곳에서 수십 군데나 쓰이던 http_build_url() 함수도 사라질 처지였다. 기존 코드를 일일이 고치는 대신, 그는 진짜 함수가 없을 때만 정의되는 동일한 이름의 대체 함수를 직접 구현했다. 이렇게 하면 기존 코드는 아무것도 바뀐 줄 모른 채 그대로 동작한다. 이것이 바로 폴리필(polyfill)의 전형적인 패턴이다.

마침 의존성 관리 도구인 Composer가 막 자리를 잡던 시기여서 공유가 쉬웠다. 그는 이 코드를 Packagist에 올려두면 같은 문제를 겪는 사람이 1~2년쯤 요긴하게 쓰다가 PHP 커뮤니티가 더 나은 대안으로 옮겨갈 것이라 예상했다. 하지만 예상은 빗나갔다. 설치는 Composer를 통한 직접 다운로드에만 그치지 않았다. 워드프레스의 대표적 다국어 플러그인 WPML이 이 폴리필을 코드베이스에 직접 번들로 포함시켰고, WPML은 자사 플러그인이 150만 개 이상의 사이트에 설치돼 있다고 밝힌다. 도메인 이름 처리 라이브러리 idna-convert도 이 코드에 의존하는데, 이를 통해 프랑스 CMS인 SPIP의 소스에 실렸고 결국 데비안과 우분투 패키지에까지 포함됐다.

'간단해 보이던' 함수에 숨어 있던 버그

흥미로운 대목은 이 코드가 오래 방치됐다는 사실 자체다. 저자는 2021년 무렵 이미 PHP를 떠난 상태였고, 뜻밖에 많은 다운로드 수를 보고 새 관리자를 구하는 글을 올렸다. 세 명이 자원했지만, 직후 가족을 예기치 않게 잃는 일을 겪으며 후속 조치를 하지 못했고 그 뒤로는 패키지 자체를 잊고 지냈다고 털어놓는다. 오픈소스 유지보수가 결국 개인의 삶과 여력에 묶여 있다는 현실을 그대로 드러내는 대목이다.

방치된 사이 GitHub에는 몇 건의 이슈가 쌓였는데, 그중 하나는 상징적이다. 끝에 슬래시가 붙은 URL에 경로를 이어 붙이면 경로에서 모든 알파벳 'a'가 사라진다는 버그였다. 원인은 '// Workaround for trailing slashes'라는 주석 아래의 우회 코드였다. 잘라낼 마지막 구간을 항상 확보하려고 경로 끝에 'a'를 붙인 뒤 문자열 치환으로 그 구간을 제거하는 방식인데, 경로가 슬래시로 끝나면 마지막 구간이 그냥 'a' 하나가 되고, 치환이 경로 안의 다른 'a'까지 함께 지워버린 것이다. '간단해 보였다'던 함수가 실제로는 그렇지 않았음을 보여주는 사례이자, 널리 쓰이는 코드에서도 특정 조건의 버그가 오래 발견되지 않을 수 있다는 점을 일깨운다.

넘겨주기보다 폐기를 택한 이유

선택지는 세 가지였다. 거의 10년 만에 다시 PHP로 돌아와 직접 손보거나, 자원한 사람에게 넘기거나, 그대로 두는 것이다. 그는 폐기를 택했다. 근거는 명확하다. 이미 PHP League의 URI 라이브러리가 수년째 커뮤니티의 표준적 대안으로 자리 잡았고, PHP 8.5부터는 표준을 따르는 URI API가 언어 자체에 내장됐다. 둘 다 2014년의 174줄짜리 셈보다 낫다는 것이다. 패키지를 계속 유지하는 것은 모두가 해야 할 이전을 늦출 뿐이라는 판단이다.

넘겨주기를 택하지 않은 이유는 특히 실무자들이 새겨둘 만하다. 다운스트림에서 아무도 검증하지 않은 새 관리자에게 널리 설치된 패키지를 넘기는 것은 공격자가 노리는 전형적인 시나리오라는 것이다. 그는 지난해 큰 파장을 일으킨 xz Utils 백도어 사건을 예로 들었다. 오랫동안 방치된 인기 오픈소스 프로젝트에 선의를 가장한 인물이 유지보수 권한을 얻어 공급망을 오염시키는 방식이다. 넓게 배포된 의존성일수록 소유권 이전 자체가 하나의 공격 표면이 된다는 통찰이다.

결국 이 패키지는 앞으로도 설치는 되지만 'a'가 사라지는 버그를 포함해 어떤 수정도 받지 않는다. 저자는 이렇게 오래 변경이 없던 코드는 한 줄짜리 수정조차 어딘가에서 예기치 못한 부작용을 낳을 수 있고, 이제는 그것을 책임질 사람도 없다고 말한다. README에는 대안으로 갈아타는 방법이 안내돼 있다. 사족처럼 붙은 마지막 문장이 오히려 이 이야기의 성격을 규정한다. 정작 AOL의 CMS는 이 '임시' 폴리필에서 끝내 벗어나지 못했고, 2020년경 플랫폼 전체가 종료될 때까지 그대로 돌아갔다. 임시 코드는 우리가 지운다고 사라지는 것이 아니라, 그것이 놓인 시스템이 수명을 다할 때에야 함께 사라진다는 점을 실무자들은 기억할 필요가 있다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://jakeasmith.com/blog/http-build-url/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...