0deps 운동: 로컬 종속성 및 보안

소프트웨어 개발자는 거의 모든 프로젝트에서 수백 개의 외부 라이브러리를 설치합니다. 현대적인 프레임워크는 종종 수천 개의 숨겨진 종속성에 의존합니다. 이는 소프트웨어 공급망에 거대한 위험을 초래합니다.

0deps 운동은 단순한 질문을 던집니다: 만약 여러분의 애플리케이션이 여러분이 직접 제어하는 코드만 실행한다면 어떻게 될까요?

모든 종속성은 공격 표면(attack surface)을 넓힙니다. 종속성은 다음과 같은 문제를 일으킬 수 있습니다:

  • 보안 결함 유발.
  • 공격의 대상이 됨.
  • 업데이트 중단.
  • 코드가 변경되어 앱이 중단됨.
  • 새로운 숨겨진 종속성 추가.

0deps 모델에서는 모든 종속성을 프로젝트 저장소에 직접 넣습니다. 빌드 중에 다운로드하지 않습니다. 처음부터 모든 것이 저장소 내부에 유지됩니다.

이 방식은 다음과 같은 이점을 제공합니다:

  • 재현 가능한 빌드.
  • 외부 레지스트리에 대한 의존도 감소.
  • 더 쉬운 보안 감사.
  • 더 예측 가능한 코드.

핵심 아이디어는 코드의 변경을 막는 것이 아닙니다. 알고리즘과 보안 패치는 변경되어야 합니다. 변하지 않는 것은 공개 계약(public contract)입니다.

라이브러리는 특정 함수 세트를 보여줍니다. 이 함수들이 계약을 형성합니다.

  • authenticate()
  • createSession()
  • verifyPasskey()

라이브러리 내부의 구현은 완전히 바뀔 수 있습니다. 알고리즘이나 데이터 구조를 교체할 수 있습니다. 인터페이스는 그대로 유지되므로 애플리케이션의 나머지 부분은 영향을 받지 않습니다.

보안 결함이 발견되면 두 가지 문제에 직면합니다:

  1. 결함 수정.
  2. 업데이트가 앱을 망가뜨리지 않도록 보장하기.

0deps 아키텍처는 두 번째 문제를 해결합니다. 인터페이스 뒤의 코드를 업데이트하면 됩니다. 공개 API는 그대로 유지됩니다. 애플리케이션은 아무런 변경 없이 계속 작동합니다.

외부 도구를 내부 어댑터 뒤로 격리합니다: Application ↓ Public Interface ↓ Adapter ↓ Implementation

라이브러리가 사라지더라도 어댑터만 변경하면 됩니다. 앱의 나머지 부분은 안전하게 유지됩니다. 라이브러리 버전은 큰 골칫거리가 아닌 사소한 세부 사항이 됩니다.

목표는 소프트웨어를 완벽하게 만드는 것이 아닙니다. 목표는 공급망 위험을 줄이는 것입니다. 동적 설치를 제거함으로써 다음과 같은 상황을 방지할 수 있습니다:

  • 악성 패키지 배포.
  • 침해된 레지스트리.
  • 종속성 혼란(Dependency confusion) 공격.

모든 코드 라인이 프로젝트의 일부가 됩니다. 이를 통해 완전한 제어와 검토가 가능해집니다.

프로젝트는 수년간 지속됩니다. 라이브러리와 프레임워크는 사라집니다. 0deps를 사용하면 생태계가 변하더라도 애플리케이션은 동일한 계약을 계속 사용할 수 있습니다.

출처: https://dev.to/fullagenticstack/0deps-movement-local-dependencies-immutable-contracts-and-security-by-design-8gi