Moviento 0deps: 로컬 종속성과 보안
대부분의 프로젝트에서 소프트웨어 개발자들은 수백 개의 외부 라이브러리를 설치합니다. 현대적인 프레임워크는 수천 개의 간접 종속성(transitive dependencies)에 의존합니다. 이는 여러분의 애플리케이션이 수백 명의 알 수 없는 사람들이 작성한 코드를 실행한다는 것을 의미합니다.
이러한 생태계는 개발 속도를 높여주지만, 동시에 거대한 공급망 리스크(supply chain risks)를 초래합니다.
0deps 운동은 단순한 질문을 던집니다: 만약 여러분의 애플리케이션이 실제로 제어할 수 있는 코드만 실행한다면 어떨까요?
모든 종속성은 새로운 공격 표면(attack surface)을 추가합니다. 종속성은 다음과 같은 문제를 일으킬 수 있습니다:
- 보안 결함을 유발할 수 있습니다.
- 공급망 공격의 대상이 될 수 있습니다.
- 제작자에 의해 방치될 수 있습니다.
- 공개 API를 변경할 수 있습니다.
- 하위 호환성을 깨뜨릴 수 있습니다.
0deps 모델에서는 필요한 모든 종속성을 프로젝트 저장소(repository)로 직접 옮깁니다. 빌드 시점에 패키지를 동적으로 다운로드하는 것을 중단합니다. 앱을 실행하는 데 필요한 모든 것이 클론(clone)하는 순간부터 저장소에 머무르게 됩니다.
이 접근 방식은 다음과 같은 이점을 제공합니다:
- 재현 가능한 빌드(Reproducible builds).
- 외부 패키지 레지스트리에 대한 의존도 감소.
- 중앙 집중식 보안 감사.
- 예측 가능한 결과.
목표는 코드를 정적으로 만드는 것이 아닙니다. 버그를 수정하고 보안을 유지하기 위해 구현체(implementation)와 알고리즘은 진화해야 합니다. 목표는 공개 계약(public contract)을 안정적으로 유지하는 것입니다.
각 라이브러리는 특정 인터페이스를 노출합니다. 예를 들어:
authenticate()createSession()verifyPasskey()
이러한 함수들은 하나의 계약을 형성합니다. 기반 코드를 다시 작성하더라도 계약은 동일하게 유지됩니다. 애플리케이션의 나머지 부분을 망가뜨리지 않고도 라이브러리를 교체하거나 프로토콜을 변경할 수 있습니다.
취약점이 발견되면 보통 두 가지 문제에 직면합니다:
- 버그 수정.
- 업데이트가 앱을 망가뜨리는지 확인.
0deps 아키텍처에서는 두 번째 문제가 사라집니다. 인터페이스 뒤의 구현체만 업데이트하면 됩니다. 공개 API는 동일하게 유지되며, 애플리케이션은 코드 변경 없이 계속 작동합니다.
외부 코드를 내부 어댑터(adapter) 뒤로 격리함으로써 장기적인 리스크를 줄일 수 있습니다. 만약 내일 어떤 라이브러리가 사라지더라도, 어댑터만 업데이트하면 됩니다.
0deps는 오픈 소스에 반대하는 것이 아닙니다. 오픈 소스를 소비하는 방식을 바꾸는 것입니다. 라이브러리는 동적인 외부 링크가 아닌 통합된 구성 요소가 됩니다.
이를 통해 예측 가능하고, 탄력적이며, 유지보수가 쉬운 소프트웨어를 만들 수 있습니다. 구현체는 진화하지만, 계약은 유지됩니다.
