Community

2024년, 첫 시작부터 고장 난 NPM 🙈

uncenter 님의 블로그를 의역/요약한 글입니다. --- 모든 것의 시작 10년전, PatrickJS는 npm에 “everything” 패키지를 게시합니다. everything 패키지는 첫 5년 동안 npm으로 등록된 모든 패키지를 포함한 패키지입니다. everything은 몇년 간 초기 배포된 상태로 방치되고 있었지만, trashh_dev의 트윗으로 인해 PartickJS는 현존하는 모든 NPM 패키지를 포함하는 새로운 버전 2.0.0을 배포하기로 마음 먹습니다. 다만, NPM에 등록할 수 있는 패키지 사이즈 제한 (10MB)이 있다는 걸 알게 되었고 우린 이 제한을 우회할 수 있는 방법을 고민했습니다. 처음으로 시도한 방법은 패키지를 좀 더 작은 범위로 나누는 것이었습니다. 알파벳과 숫자를 기준으로 나눈 뒤 배포를 시도하려 했지만 예상치 못한 제한에 또 걸리고 말았습니다. 알고 보니 NPM 패키지가 의존할 수 있는 최대 패키지 수가 정해져 있었습니다. 대략 800개 정도만 의존할 수 있습니다. 이 내용은 NPM 문서 어디에도 없어서 저희 개발자 중 한명이 직접 테스트하다가 알게된 수치입니다. 새로운 방법은 패키지를 800개 기준으로 청크 (chunk) 내는 것이었습니다. 총 3246 개의 청크가 나왔고 이는 여전히 800개 리밋을 넘어버리는 수준이라서 다시 한 번 3246개를 청크 했습니다. 그리고 메인 “everything” 패키지는 이 청크된 패키지들만 의존하도록 수정했습니다. 12월 29일 경 우리는 배포를 시도했습니다. 다만, Rate limit이 걸려있었고 이를 해결하기 위해 Github Actions의 배포 스크립트를 수정했습니다. 12월 30일 오후 11시 30분 쯤, 250만의 패키지를 의존하는 “everything” 패키지를 NPM으로 배포했습니다. 결과 배포 후 반응이 이상했습니다. 사람들이 우리 레포로 찾아와서 “내 패키지를 NPM에서 내리고 싶은데 everything 때문에 안 내려져” 류의 댓글을 달기 시작했습니다. 뭔소린가 싶어서 살펴보니, NPM 패키지는 다른 패키지가 의존하고 있으면 NPM에서 해당 패키지를 내릴 수 없도록 설계되어 있었습니다. 여기까지는 일반적으로 문제가 되지 않습니다. 문제는 의존성을 명시할 때 버전 설정을 할 수 있는데 이걸 시맨틱 버저닝 “x.y.z” 으로 명시하지 않고 스타 “*”로 명시 할 때 입니다. “*”로 명시하는 순간 해당 패키지의 모든 버전을 뜻하게 되어서 모든 버전이 NPM에서 영구 박제 되는 효과를 갖게 됩니다. 우린 바로 Github와 NPM 측에 이 이슈를 전달했지만 연말이라 커뮤니케이션 하는데 어려움이 있었습니다. 그 기간 동안 우린 여러 사람들에게 다양한 피드백을 들었습니다. 다행히 1월 2일 쯤 Github 측에서 상황을 인지하고 우리 레포와 NPM 레지스트리를 삭제해주었습니다. 마지막으로 “everything” 패키지로 인해 피해를 받은 모든 분들에게 진심으로 사과드립니다. 우린 잘못을 했고 바로 잡기 위해 최선을 다했습니다. 이 일은 단지 작은 장난에서 시작되었으며, 우린 절대 다수의 사람들에게 피해를 입히려고 한 것이 아닙니다. --- 비교적 최근에 벌어진 everything 패키지 소동에 참여했던 uncenter 가 직접 쓴 글입니다. everything 패키지에 대한 반응 여러가지인데요. 당연히 화난 사람도 많고 이 기회에 npm을 고쳐보자(?)라는 사람도 많습니다. npm의 취약점을 또 한번 보여준 사례인 것 같습니다. 누구나 패키지를 제작 배포 할 수 있어서 유용한 코드도 많고 커뮤니티가 커지는 건 맞지만, leftpad, faker나 everything처럼 한순간 npm 커뮤니티 전체에 해가 되는 원 투 펀치를 맞다 보면 “이게 맞나?” 싶기도 합니다. 특히, npm 패키지 의존성은 거미줄처럼 얽히고 설켜 있어서 관리하기 힘들고 어딘가 고장 나면 모두가 힘들어지는 것 같아요 🤔 원글: https://uncenter.dev/posts/npm-install-everything

알림

알림이 없습니다