2012-02-23 3 views
53

내용 : NodeJS 응용 프로그램을 바이너리로 배포 할 수 있습니까? 즉. .js 응용 프로그램을 V8을 통해 네이티브 바이너리로 컴파일하고 클라이언트에 바이너리를 배포 하시겠습니까? (NodeJS 서버에 대한 전체 액세스 권한이있는 경우) ... 또는 할 수있는 모든 코드를 축소하고 있습니까?NodeJS 응용 프로그램의 안전한 배포

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

+1

[Node.js 코드 보호] (http://stackoverflow.com/questions/8040423/node-js-code-protection) 및 [node.js 소스 파일을 컴파일하는 방법이 있습니까?]를 참조하십시오. http://stackoverflow.com/questions/6145561/is-there-a-way-to-compile-node-js-source-files). 쉽게 가능하지 않습니다. –

+1

가지고있는 것은 [기술적 인 문제가 아닙니다] (http://programmers.stackexchange.com/q/66616/9097)입니다. – josh3736

+0

http://groups.google.com/group/nodejs/browse_thread/thread/98f21cab99878a13 –

답변

17

예 이진 형식을 만들 수 있습니다. V8을 사용하면 JavaScript를 사전 컴파일 할 수 있습니다. 이것은 노드 코어에 의한 가정에 대해 별다른 부작용이있을 수 있습니다.

소스 코드를 배포한다는 것은 클라이언트가 쉽게 우리 솔루션을 훔치고 라이센스 비용 지불을 중단 할 수 있음을 의미합니다.

바이너리를 배포했기 때문에 사용자를 도난으로부터 보호 할 수 없습니다. 그들은 여전히 ​​이진 코드를 훔치거나 분해 할 수 있습니다. 이것은 보호가 전혀없는 어둠을 통한 보호입니다.

씬 클라이언트 응용 프로그램을 사용하여 서버와 통신하고 서버 코드를 제공하지 않아도 서버 코드를 안전하게 유지하는 것이 좋습니다.

+4

@James Andino :하지만 코드를 컴파일 할 수 있다고해도 누군가가 실행 파일과 데이터 파일을 다른 컴퓨터에 설치 하시겠습니까? 코드를 컴파일하는 것은 자동차를 잠그는 것과 유사하지 않습니다. 컴파일은 보안 측정이 아닌 성능 및 패키징 방법입니다. – user4815162342

+1

그 논리에 대한 나의 유일한 방어는 이름 부름이다. – Prospero

+6

이런 일은 일반적으로지는 인종입니다. 그러나 많은 자원을 당신이 "이것을 확보하는 것"으로 몰아 넣으면 다른 쪽이 더 많은 자원을 갖게됩니다. 이 문제에 대해 걱정하지 않아도되고 비즈니스가 코드의 마술 소스에 의존하지 않고 회사가 생산하는 실제 비 코드 값에 의존하는지 확인해야합니다. – Raynos

23

가능합니다.이 branch (0.8.18 기준)을 사용하고 'deps/v8/src/extra-snapshot.js'에 넣은 js 코드는 머신 코드로 컴파일됩니다. 정상적인 기본 개체 초기화의 일부로 v8에 포함되었습니다. 제품을 전개 할 각 플 '폼마다 nodej를 빌드해야합니다.

스냅 샷 코드는 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'에 위임 할시기를 결정하거나 다른 임베디드 모듈에서 반출을 리턴해야 할 것이다. javascript 모듈 시스템이 어떻게 구현되는지 확인하십시오 (requirejs가 좋은 예입니다).

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

UPDATE : V8 게으른 편집을 선호하기 때문에

에도 사용 V8 코드를 스냅 샷은 Node.js를 바이너리에 포함됩니다. 자세한 내용은 this을 참조하십시오.

+0

고맙습니다. 매우 유용합니다. 시도해야합니다. – Prospero

3

나는 현재 동일한 것을 조사하고 있는데 "node.js 앱에서 하나의 실행 파일을 만들 수 있습니다"라고 주장하는 nexe을보고 있습니다.

아직 좋은 소식은 없지만 이미 공유 할 가치가 있다고 생각할 수는 없습니다.

+0

그것은 macos에서 xcode를 원합니다 –

2

V8은 내부적으로 원시 코드를 생성하고 실행합니다. 여기를보십시오 : https://github.com/v8/v8-git-mirror/blob/master/src/compiler.cc#L1178. 이 기능은 EncloseJS에서 사용됩니다. EncloseJS는 node.js 프로젝트의 소스를 구문 분석하고 종속성을 번들하며 실행 가능 바이너리를 만듭니다. 소스는 컴파일 된 바이너리 코드에만 포함되지 않습니다.

+1

오직 게으른 컴파일 원시 코드입니다! (최적화 된 것보다 2 배 느리다) –

7

EncloseJS.

소스가없는 완전한 기능의 바이너리를 얻을 수 있습니다.

JavaScript 코드는 V8 내부 컴파일러를 사용하여 컴파일 타임에 원시 코드로 변환됩니다. 따라서 소스는 바이너리를 실행할 필요가 없으며 패키징되지 않습니다.

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

또한 node.js 런타임 코드는 실행시 응용 프로그램의 노드 API를 지원할 수 있도록 (코드와 함께) 실행 파일에 저장됩니다.

사용 사례 :

  • 는 소스없이 응용 프로그램의 상용 버전을 확인합니다.
  • 소스없이 앱의 데모/평가판/평가판을 만드십시오.
  • 자동 압축 풀림 보관 또는 설치 프로그램을 만드십시오.
  • 노드 추력을 사용하여 닫힌 소스 GUI 응용 프로그램을 만듭니다.
  • 컴파일 된 응용 프로그램을 배포하기 위해 node와 npm을 설치할 필요가 없습니다.
  • 응용 프로그램을 배포하기 위해 npm install을 통해 수백 개의 파일을 다운로드 할 필요가 없습니다. 단일 독립 파일로 배포하십시오.
  • 자산을 실행 파일에 넣으면 이식성이 향상됩니다. 앱을 설치하지 않고 새 노드 버전을 테스트하십시오.
+3

EncloseJS의 라이센스는 상업적 용도로 허용되지 않습니다. – aleung

+0

죄송합니다,하지만, 당신은 dev에 연락해야합니다. 무료 비영리적인 용도로 사용할 수 없다는 것을 의미하지는 않습니다. 그것은 당신이 그것을 사용하기 위해 돈을 내야한다는 것을 의미합니다. –

+1

EncloseJS는 더 이상 사용되지 않습니다. 후계자'pkg'는 오픈 소스이며 MIT 라이센스하에 배포됩니다. https://github.com/zeit/pkg –

관련 문제