이번 내용은 개발 얘기가 아닌
(나름 개발 얘기긴 합니다)개발자 단체에서 진행하는 알쓸신잡 시리즈 전용으로 쓴 글입니다.
이번에는 아시는분들은 아시는 당연한거 아닌가 NPM left-pad 이야기를 해보려고 합니다
NPM은 노드 개발자 (js) 가 제일 많이 사용하는 패키지 매니저 중 하나입니다. 파이썬의 pip과 같은 친구라고 생각하면 됩니다.
PIP과 같이 모든 개발자들이 자유롭게 올릴수도 있고 또 자유롭게 사용도 할수 있습니다.
많은 패키지들이 서로를 의존하며 공존하고 있는 패키지들이죠. 그리고 그 부분 때문에 npm이 터질뻔한적도 있죠 everything패키지가 어떻게 npm을 조질뻔했나
하지만 저 사건 이전에 left-pad사건이라고 2016년도에 터진 유명한 사건이 있습니다.
Everything사건처럼 패키지 삭제 및 업데이트 문제를 일으키지는 않았지만 전세계 웹사이트를 마비시킨 사건이죠.
left-pad 는 npm에 올라갔었던 패키지 이름입니다. 당시 단 11줄의 코드와 깃허브 기준 10개의 스타 가 찍혀있던 아무도 모르던 패키지였습니다.
기능은..
스트링 왼쪽에 패딩 (스페이스)를 추가 해주는 코드 였습니다.
네 그게 끝입니다.
"hello world"왼쪽에 패딩을 추가 하고싶으면
const leftPad = require('left-pad')
original_string = "hello world";
new_string = leftPad(original_string, 5);
console.log(new_string);
-> " hello world"
라는 정말 간단한 코드 였습니다.
심지어 소스 코드도 아래가 끝이었습니다.
module.exports = leftPad;
function leftPad (str, len, ch) {
str = String(str);
var i = -1;
if (!ch && ch !== 0) ch = ' ';
ch = ch + '';
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str
}
아주 정만 간단한 패키지 였죠. 이런 간단한 기능을 가진 패키지도 사람들이 사용하는데 이 글을 읽고 계신 여러분들도 한번 아무거나 올려보는거 어떨까요?
그래서 이런 간단한 패키지가 어떻게 전세계 웹사이트들을 마비시켰을까요?
Kik이라는 캐나다산 메신저 앱이 있습니다. 나름 당시 전세계에서 많이 사용하던 메신저 앱이죠. 한국인들은 카톡만 사용해서 모르는..
그래서 북미와 유럽에서는 잘 나가던 앱이였습니다만... 지금은 몇몇사건 이후 나락으로 간 메신저이죠. kik을 사용해 미성년자와 나쁜짓을 하려다가 적발된 케이스
하여튼 이 Kik이라는 회사가 아주 중요합니다. 물론 이 회사가 left-pad
패키지를 만든건 아니지만요.
Azer Koçulu 라는 독일인 개발자가 있었습니다. 이 사람은 공교롭게도 Kik이라는 오픈소스 패키지를 만들고 관리를 하고 있었습니다.
그런데 어느날 갑자기 이메일이 하나 날아옵니다.
Azer Koculu에게
님 우리가 npm에 우리 회사 이름으로 패키지를 올릴려는데 이름이 이미 사용되고 있더라구요? 찾아보니 님이 소유자임. Kik이라는 이름은 우리가 상표권을 갖고 있으니 고소 당하기 싫으면 이름 바꾸삼.꼬우면 대기업 하던가
-Kik-
뭐 진짜 저렇게 온거는 아니지만 비슷하게 날아옵니다.
하지만 대부분의 개발자들 처럼 오픈소스의 중요성과 의미를 존중하는 개발자인 Koculu씨는 이 같은 요청을 무시 합니다
응 나 바꿔줄 생각 없음. 고소 할거면 하삼
물론 법적으로는 Kik이 당연히 유리하고 고소를 하면 이름을 갖고 올수는 있지만 시간과 돈이 아까운 Kik은 대신 NPM에 연락을 겁니다.
NPM님들아
저기 1인 개발자가 우리꺼 이름 가지고 감. 우리가 상표권 있으니 저거 삭제하게 하던가 이름 바꾸라고 하던가 하삼.
-Kik-
횡포 그자체
하지만 법을 따라야하는 NPM은 Koculu씨한테 통보를 합니다.
님 패키지 이름 바꾸삼
그래서 기분이 나빠진 Koculu씨는 기분이 팍 상해부러쓰 npm에게 대려 통보를 합니다.
님들 대기업 편 드는거임? 나 이제 npm에 오픈소스 안올릴꺼임. 기존에 올라가있던거들도 삭제 해주삼.
중요한점은 Koculu씨가 npm에 거의 300개 가까이 패키지들을 올린 상태였고 그 패키지를 사용하는 패키지를 사용하는 패키지를 사용하는 패키지를 사용하는 패키지를.... 그만 이 많았죠. (무한 의존성)
하지만 개발자가 원하는걸 해줘야되는 npm은 결국 Koculu씨가 올렸던 패키지들을 삭제합니다.
그래서 결국 패키지들이 삭제가 되었는데.... Kik이라는 패키지를 삭제함과 동시에 Koculu씨가 쓴 Kik이 사용하는 패키지들 (의존 패키지들)도 삭제를 합니다. 즉 Koculu씨가 쓴 left-pad
라는 패키지와 kik
, 등등을 다 삭제를 한거죠.
그랬는데..... 인터넷이 마비가 됩니다
당시 생긴 오류:
새로운 업데이트를 위해 npm build
또는 npm run
등등을 실행할때 위와 같은 메시지가 뜨면서 실패를 합니다.
Koculu씨는 몰랐지만.. left-pad
라는 패키지는 사실 line-numbers
라는 패키지에서 사용을 했고 그 패키지는 사실 무려 Babel 패키지에서 사용되었던겁니다.
바벨이 뭔지는 찾아보시면 되는데... 대부분 패키지에 사용되는 중요한 패키지라고 아시면 됩니다. 코드 버젼 호환 되게 해주는...
무너진 바벨탑 처럼 이름값 한 바벨
그래서 이 바벨이 사용된 패키지들을 사용한 당시 회사들을 알아보면
Facebook, Paypal, Netflix, Spotify등등... 그리고 Kik.
네 진짜로 그 당시 Kik도 터졌습니다. 자업자득
개발자들이 고작 11줄 짜리 코드를 짜기 싫어서 사용했던 left-pad
를 삭제하니 저렇게 중요하고 많은 회사들의 사이트들이 터진겁니다. 월급루팡
가끔은 돌아가도 건드려야될수도 있습니다
저희가 어떤 언어로 개발을 하든 제3자가 만든 오픈소스 패키지들을 많이 사용합니다. 그리고 프레임워크나 패키지를 사용할때 그 패키지가 갖고 있는 의존성들을 저희가 사실 모르는 상태로 설치가 되는 경우가 많죠.
하지만 그런 부분에서 신경을 안쓴다면 만약에 위 같은 상황이 또 일어날경우 또 터지는겁니다.
물론 저 사건 이후 npm이 패키지들을 마음대로 삭제를 못하게 바꿨습니다
그리고 이 바뀐 정책이 everything 사건에 영향을 줍니다
요즘 소프트웨어를 개발하다 보면 패키지들을 많이 가져다 쓰고 그걸 확인 안하고 쓰는 경우가 많은데 사실 이런 방식으로 해킹을 당하는 경우도 많습니다. 그 패키지에 뭐가 쓰여있을지는 누가 압니까?
누가 관리하는지도 모르는 패키지 의존성
그리고 패키지를 적게 사용할수록 컴파일이나 빌드 시간이 축소 되고 사이즈도 작아집니다. 만약에 패키지를 한두개의 함수를 사용하려고 설치하시는거면 그냥 직접 만들어서 사용하는게 어떨까요?
제 프로젝트만 멀쩡하면 된겁니다
읽어주셔서 감사합니다
이런 현실을 풍자하려 is-thirteen이라는 라이브러리가 나왔는데 점점 살이 붙더니 광기가 엿보이는 지경에 이르렀습니다.
https://github.com/jezen/is-thirteen?tab=readme-ov-file