웃긴 Lobsters · 2일 전

"estee가 testem의 오타라고?" 개발자를 뒷목 잡게 한 npm 알고리즘 검사기

핵심 요약
  • 오픈소스 도구의 긴 이름을 줄이기 위해 'estee'라는 짧은 패키지를 npm에 등록하려다 기존 패키지 'testem'과 유사하다는 이유로 거절당했습니다.
  • npm이 단순 레벤슈타인 거리(편집 거리 2 이하) 알고리즘을 적용한 탓에, 짧은 단어일수록 무관한 단어까지 오타로 묶여 차단되는 맹점이 드러났습니다.
  • 다른 후보 단어인 'hoid' 역시 'gopd', 'uuid' 등 온갖 단어의 오타로 인식되며 차단되었고, 고객센터 역시 기계적인 답변만 내놓았습니다.
요약 오픈소스 프로젝트 Storyteller를 개발하던 한 개발자가 긴 패키지 이름 대신 짧고 귀여운 별칭을 쓰려다 황당한 알고리즘 차단에 부딪힌 사연을 공유했습니다. 원래 프로젝트 이름인 'storyteller' 네임스페이스를 다른 사용자가 이미 선점해 둔 탓에, 개발팀은 어쩔 수 없이 '@storyteller-platform/'이라는 긴 네임스페이스를 사용해야 했습니다. 이로 인해 CLI 도구 이름도 '@storyteller-platform/align'처럼 지나치게 길어져 실행 시 입력이 매우 번거로워졌습니다. 이에 개발팀은 Storyteller의 약자인 ST에서 착안해 'estee'라는 짧고 친근한 단축 패키지명을 정하고 npm에 v0.0.1 배포를 시도했습니다. 하지만 npm 레지스트리는 '403 Forbidden' 에러를 뿜어내며 패키지 등록을 거부했습니다. 차단 사유는 기존 인기 패키지인 'espree'와 'testem'과 이름이 너무 비슷해 타이포스쿼팅(오타를 노린 악성 패키지 유포) 위험이 있다는 것이었습니다. 개발자는 생김새라도 비슷한 espree는 백번 양보해 이해하더라도, 'estee'와 'testem'이 어떻게 오타 후보로 묶일 수 있는지 어이없어했습니다. 원인을 분석해 보니 npm은 문자열 사이의 편집 거리를 재는 '레벤슈타인 거리(Levenshtein distance)' 알고리즘을 사용해 인기 패키지와 편집 거리가 2 이하인 모든 패키지명을 무차별 차단하고 있었습니다. 'estee'의 앞뒤에 't'와 'm'을 각각 삽입하면 정확히 2번의 편집으로 'testem'이 되기 때문에 걸려든 것입니다. 문제는 짧은 단어일수록 편집 거리 2라는 기준이 너무 가혹하게 작용한다는 점입니다. 4글자 패키지명 공간의 경우 단 841개 조합만으로 전체 가능한 이름의 98% 이상이 사실상 차단될 수 있는 수학적 맹점을 안고 있었습니다. 실제로 개발자가 차선책으로 생각한 4글자 이름 'hoid'를 테스트해 보니 uid, ulid, cuid, uuid, hono, zod는 물론이고 전혀 상관없어 보이는 'gopd'까지 오타 후보라며 줄줄이 경고에 걸렸습니다. 과거 오디오북 패키지 등록 당시에는 npm 고객지원팀에 문의해 수동 해제를 받았던 경험이 있어 이번에도 지원팀에 연락했으나, 이번에는 자동화된 타이포스쿼팅 차단은 예외를 둘 수 없다는 엉뚱한 매뉴얼 답변만 돌아왔다며 개발자는 허탈함을 토로했습니다.
Sponsored · 광고