program tip

NodeJS 애플리케이션의 안전한 배포

radiobox 2020. 12. 2. 08:19
반응형

NodeJS 애플리케이션의 안전한 배포


무엇 : NodeJS 앱을 바이너리로 배포 할 수 있습니까? 즉. V8을 통해 .js 앱을 네이티브 바이너리로 컴파일하고 바이너리를 클라이언트에 배포합니까? (NodeJS 서버에 대한 전체 액세스 권한이있는 경우) ... 아니면 가능한 모든 코드를 축소하고 있습니까?

이유 : 우리는 종종 클라이언트의 서버에서 호스팅되는 클라이언트 용 NodeJS에서 서버 측 애플리케이션을 빌드합니다. 소스 코드를 배포하면 고객이 쉽게 솔루션을 훔치고 라이선스 비용 지불을 중단 할 수 있습니다. 이것은 우리의 인식 없이도 앱을 쉽게 리버스 엔지니어링하거나 재사용 할 수있는 가능성을 열어줍니다.


예, 바이너리 형식을 만들 수 있습니다. V8을 사용하면 JavaScript를 미리 컴파일 할 수 있습니다. 이것은 노드 코어가 만든 가정에 대해 이상한 부작용이있을 수 있습니다.

소스 코드를 배포하면 고객이 쉽게 솔루션을 훔치고 라이선스 비용 지불을 중단 할 수 있습니다.

바이너리를 배포한다고해서 도난으로부터 보호 할 수는 없습니다. 그들은 여전히 ​​이진 코드를 훔치거나 분해 할 수 있습니다. 이것은 전혀 보호되지 않는 모호함을 통한 보호입니다.

서버와 통신하는 씬 클라이언트 앱을 제공하고이를 제공하지 않음으로써 서버 코드를 안전하게 유지하는 것이 좋습니다.


예, 가능합니다.이 브랜치 (0.8.18 기반)를 사용하면 'deps / v8 / src / extra-snapshot.js'에 넣은 모든 js 코드가 미리 머신 코드로 컴파일되고 v8에 포함됩니다. 일반적인 내장 객체 초기화의 일부로. 제품을 배포하려는 각 플랫폼에 대해 nodejs를 빌드해야합니다.

스냅 샷 코드는 v8 초기화 초기에 실행되며 '모듈 본문'의 내장 객체에 액세스 할 수 없습니다. 할 수있는 일은 나중에 호출 할 전역 초기화 함수에 모든 코드를 넣는 것입니다. 전의:

// 'this' points to the same as the object referenced by 
// 'global' in normal nodejs code.
// at this point it has nothing defined in it, so in order to use
// global objects a reference to it is needed.
var global = this;
global.initialize = function() {
  // You have to define all global objects you use in your code here;
  var Array = global.Array;
  var RegExp = global.RegExp;
  var Date = global.Date;
  // See ECMAScript v5 standard global objects for more
  // Also define nodejs global objects:
  var console = global.console;
  var process = global.process;
  // Your code goes embedded here
};

또한 전체 코드가 단일 파일에 정의되어 있다고 가정하므로 프로젝트에서 nodejs 모듈 시스템 (필수)을 사용하는 경우 모든 파일을 하나로 결합하고 각 파일을 속이는 클로저로 감싸는 스크립트를 작성해야합니다. 정상적인 nodejs 모듈이라고 생각하는 코드. 아마도 각 모듈 클로저는 require 함수를 노출 할 것이고,이 함수는 표준 'global.require'에 위임하거나 다른 임베디드 모듈에서 내보내기를 반환 할시기를 결정해야합니다. 아이디어를 위해 자바 스크립트 모듈 시스템이 어떻게 구현되는지 확인하세요 (requirejs가 좋은 예입니다).

이렇게하면 네이티브 코드에 대한 스택 추적이 표시되지 않으므로 코드를 디버그하기가 더 어려워집니다.

최신 정보:

v8 스냅 샷을 사용하더라도 v8은 지연 컴파일을 선호하기 때문에 코드가 node.js 바이너리에 포함됩니다. 참조 자세한 내용은.


EncloseJS .

소스없이 완전히 작동하는 바이너리를 얻습니다.

자바 스크립트 코드는 V8 내부 컴파일러를 사용하여 컴파일 타임에 네이티브 코드로 변환됩니다. 따라서 소스는 바이너리를 실행하는 데 필요하지 않으며 패키지화되지 않습니다.

완벽하게 최적화 된 네이티브 코드는 클라이언트의 컴퓨터를 기반으로 런타임에만 생성 될 수 있습니다. 이 정보가 없으면 EncloseJS는 "최적화되지 않은"코드 만 생성 할 수 있습니다. NodeJS보다 약 2 배 느리게 실행됩니다.

또한 node.js 런타임 코드는 런타임에 애플리케이션에 대한 노드 API를 지원하기 위해 코드와 함께 실행 파일 내에 배치됩니다.

사용 사례:

  • 소스없이 상용 버전의 애플리케이션을 만드십시오.
  • 소스없이 앱의 데모 / 평가 / 평가판을 만드십시오.
  • 자동 압축 해제 아카이브 또는 설치 프로그램을 만드십시오.
  • 노드 추력을 사용하여 폐쇄 소스 GUI 애플리케이션을 만듭니다.
  • 컴파일 된 애플리케이션을 배포하기 위해 node 및 npm을 설치할 필요가 없습니다.
  • 애플리케이션을 배포하기 위해 npm 설치를 통해 수백 개의 파일을 다운로드 할 필요가 없습니다. 단일 독립 파일로 배포합니다.
  • 자산을 실행 파일에 넣어 이식성을 높이십시오. 앱을 설치하지 않고 새 노드 버전에 대해 테스트하십시오.

I'm currently investigating the same thing and am looking at nexe which claims to be able to "create a single executable out of your node.js apps".

Can't tell you if it's any good just yet, but thought it'd be worth to share already.


V8 generates native machine code internally and executes it. Look here: https://github.com/v8/v8-git-mirror/blob/master/src/compiler.cc#L1178 . This feature is used in EncloseJS. EncloseJS parses the sources of your node.js project, bundles dependencies, and makes an executable binary. The sources are not included in the binary - only compiled machine code.


We have been using pkg to create binary versions of our Node.js app before distribution.

https://github.com/zeit/pkg

In order to add license key checking we use Cryptlex:

https://docs.cryptlex.com/node-locked-licenses/using-lexactivator/using-lexactivator-with-node.js

참고URL : https://stackoverflow.com/questions/9413123/secure-distribution-of-nodejs-applications

반응형