Node.js 시작하기

Download node.js eBook

비고

Node.js는 Google의 V8 JavaScript 엔진을 사용하는 이벤트 기반 비 차단 비동기 I / O 프레임 워크입니다. 클라이언트 측에서뿐만 아니라 서버 측에서도 JavaScript를 실행할 수있는 기능을 많이 사용하는 응용 프로그램을 개발하는 데 사용되므로 코드 재사용 성 및 컨텍스트 전환 부족으로 이익을 얻습니다. 그것은 오픈 소스 및 크로스 플랫폼입니다. Node.js 응용 프로그램은 순수한 JavaScript로 작성되었으며 Windows, Linux 등에서 Node.js 환경에서 실행할 수 있습니다.

버전

번역 출시일
v8.2.1 2017-07-20
v8.2.0 2017-07-19
v8.1.4 2017-07-11
v8.1.3 2017-06-29
v8.1.2 2017-06-15
v8.1.1 2017-06-13
v8.1.0 2017-06-08
v8.0.0 2017-05-30
v7.10.0 2017-05-02
v7.9.0 2017-04-11
v7.8.0 2017-03-29
v7.7.4 2017-03-21
v7.7.3 2017-03-14
v7.7.2 2017-03-08
v7.7.1 2017-03-02
v7.7.0 2017-02-28
v7.6.0 2017-02-21
v7.5.0 2017-01-31
v7.4.0 2017-01-04
v7.3.0 2016-12-20
v7.2.1 2016-12-06
v7.2.0 2016-11-22
v7.1.0 2016-11-08
v7.0.0 2016-10-25
v6.11.0 2017-06-06
v6.10.3 2017-05-02
v6.10.2 2017-04-04
v6.10.1 2017-03-21
v6.10.0 2017-02-21
v6.9.5 2017-01-31
v6.9.4 2017-01-05
v6.9.3 2017-01-05
v6.9.2 2016-12-06
v6.9.1 2016-10-19
v6.9.0 2016-10-18
v6.8.1 2016-10-14
v6.8.0 2016-10-12
v6.7.0 2016-09-27
v6.6.0 2016-09-14
v6.5.0 2016-08-26
v6.4.0 2016-08-12
v6.3.1 2016-07-21
v6.3.0 2016-07-06
v6.2.2 2016-06-16
v6.2.1 2016-06-02
v6.2.0 2016-05-17
v6.1.0 2016-05-05
v6.0.0 2016-04-26
v5.12.0 2016-06-23
v5.11.1 2016-05-05
v5.11.0 2016-04-21
v5.10.1 2016-04-05
v5.10 2016-04-01
v5.9 2016-03-16
v5.8 2016-03-09
v5.7 2016-02-23
v5.6 2016-02-09
v5.5 2016-01-21
v5.4 2016-01-06
v5.3 2015-12-15
v5.2 2015-12-09
v5.1 2015-11-17
v5.0 2015-10-29
v4.4 2016-03-08
v4.3 2016-02-09
v4.2 2015-10-12
v4.1 2015-09-17
v4.0 2015-09-08
io.js v3.3 2015-09-02
io.js v3.2 2015-08-25
io.js v3.1 2015-08-19
io.js v3.0 2015-08-04
io.js v2.5 2015-07-28
io.js v2.4 2015-07-17
io.js v2.3 2015-06-13
io.js v2.2 2015-06-01
io.js v2.1 2015-05-24
io.js v2.0 2015-05-04
io.js v1.8 2015-04-21
io.js v1.7 2015-04-17
io.js v1.6 2015-03-20
io.js v1.5 2015-03-06
io.js v1.4 2015-02-27
io.js v1.3 2015-02-20
io.js v1.2 2015-02-11
io.js v1.1 2015-02-03
io.js v1.0 2015-01-14
v0.12 2016-02-09
v0.11 2013-03-28
v0.10 2013-03-11
v0.9 2012-07-20
v0.8 2012-06-22
v0.7 2012 년 1 월 17 일
v0.6 2011-11-04
v0.5 2011 년 8 월 26 일
v0.4 2011 년 8 월 26 일
v0.3 2011 년 8 월 26 일
v0.2 2011 년 8 월 26 일
v0.1 2011 년 8 월 26 일

Hello World HTTP 서버

먼저, 플랫폼에 맞는 Node.js설치 하십시오.

이 예에서는 Hello, World! 를 보내는 포트 1337에서 수신하는 HTTP 서버를 만듭니다 Hello, World! 브라우저에. 포트 1337을 사용하는 대신 다른 서비스에서 현재 사용하지 않는 포트 번호를 사용할 수 있습니다.

http 모듈은 Node.js 코어 모듈입니다 (Node.js의 소스에 포함되어 추가 리소스를 설치할 필요가없는 모듈). http 모듈은 http.createServer() 메소드를 사용하여 HTTP 서버를 만드는 기능을 제공합니다. 응용 프로그램을 만들려면 다음 JavaScript 코드가 포함 된 파일을 만듭니다.

const http = require('http'); // Loads the http module

http.createServer((request, response) => {

    // 1. Tell the browser everything is OK (Status code 200), and the data is in plain text
    response.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    // 2. Write the announced text to the body of the page
    response.write('Hello, World!\n');

    // 3. Tell the server that all of the response headers and body have been sent
    response.end();

}).listen(1337); // 4. Tells the server what port to be on
 

모든 파일 이름으로 파일을 저장하십시오. 이 경우 hello.js 라는 이름을 지정하면 파일이있는 디렉토리로 이동하여 다음 명령을 사용하여 응용 프로그램을 실행할 수 있습니다.

const http = require('http'); // Loads the http module

http.createServer((request, response) => {

    // 1. Tell the browser everything is OK (Status code 200), and the data is in plain text
    response.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    // 2. Write the announced text to the body of the page
    response.write('Hello, World!\n');

    // 3. Tell the server that all of the response headers and body have been sent
    response.end();

}).listen(1337); // 4. Tells the server what port to be on
 

그런 다음 브라우저에서 http : // localhost : 1337 또는 http://127.0.0.1:1337 URL을 사용하여 생성 된 서버에 액세스 할 수 있습니다.

아래의 스크린 샷과 같이 상단에 "Hello, World!"텍스트가있는 간단한 웹 페이지가 나타납니다.

스크린 샷

편집 가능한 온라인 예제.

코어 모듈

Node.js는 브라우저 외부에서 Javascript를 실행할 수있게 해주는 Javascript 엔진 (C ++로 작성된 Chrome 용 Google V8 엔진)입니다. 노드의 기능을 확장하기 위해 수많은 라이브러리를 사용할 수 있지만 엔진에는 기본 기능을 구현하는 일련의 코어 모듈 이 제공됩니다.

현재 34 개의 핵심 모듈이 노드에 포함되어 있습니다.

[ 'assert',
  'buffer',
  'c/c++_addons',
  'child_process',
  'cluster',
  'console',
  'crypto',
  'deprecated_apis',
  'dns',
  'domain',
  'Events',
  'fs',
  'http',
  'https',
  'module',
  'net',
  'os',
  'path',
  'punycode',
  'querystring',
  'readline',
  'repl',
  'stream',
  'string_decoder',
  'timers',
  'tls_(ssl)',
  'tracing',
  'tty',
  'dgram',
  'url',
  'util',
  'v8',
  'vm',
  'zlib' ]
 

이 목록은 노드 설명서 API https://nodejs.org/api/all.html (JSON 파일 : https://nodejs.org/api/all.json )에서 가져 왔습니다.

모든 핵심 모듈을 한 눈에 파악

단언하다

assert 모듈은 불변 값을 테스트하는 데 사용할 수있는 간단한 assertion 테스트 세트를 제공합니다.

완충기

ECMAScript 2015 (ES6)에 TypedArray 가 도입되기 전에는 JavaScript 언어에 바이너리 데이터 스트림을 읽거나 조작 할 수있는 메커니즘이 없었습니다. Buffer 클래스는 TCP 스트림 및 파일 시스템 작업과 같은 컨텍스트에서 옥텟 스트림과 상호 작용할 수 있도록 Node.js API의 일부로 도입되었습니다.

이제 TypedArray 가 ES6에 추가되었으므로 Buffer 클래스는 Node.js의 사용 사례에 더 최적화되고 적합한 방식으로 Uin t8Array API를 구현합니다.

c / c ++ _ addons

Node.js Addons는 C 또는 C ++로 작성된 동적으로 링크 된 공유 객체로서 require() 함수를 사용하여 Node.js에로드 할 수 있으며 일반적인 Node.js 모듈처럼 사용할 수 있습니다. 이들은 주로 Node.js에서 실행되는 JavaScript와 C / C ++ 라이브러리 간의 인터페이스를 제공하는 데 사용됩니다.

child_process

child_process 모듈은 popen (3)과 유사하지만 동일하지 않은 방식으로 자식 프로세스를 생성하는 기능을 제공합니다.

클러스터

Node.js의 단일 인스턴스는 단일 스레드에서 실행됩니다. 멀티 코어 시스템을 이용하려면 사용자는로드를 처리하기 위해 Node.js 프로세스의 클러스터를 시작해야하는 경우가 있습니다. 클러스터 모듈을 사용하면 모든 서버 포트를 공유하는 하위 프로세스를 쉽게 만들 수 있습니다.

콘솔

console 모듈은 웹 브라우저에서 제공하는 JavaScript 콘솔 메커니즘과 유사한 간단한 디버깅 콘솔을 제공합니다.

암호

crypto 모듈은 OpenSSL의 해시, HMAC, 암호, 해독, 서명 및 확인 기능을위한 래퍼 집합을 포함하는 암호화 기능을 제공합니다.

deprecated_apis

Node.js는 (a) API 사용이 안전하지 않은 것으로 간주되거나 (b) 대체 API가 개선되었거나 (c) API에 대한 변경 사항이 향후 주요 릴리스에서 예상 될 때 .

DNS

dns 모듈은 두 개의 다른 범주에 속하는 함수를 포함합니다.

  1. 기본 운영 체제 기능을 사용하여 이름 확인을 수행하고 네트워크 통신을 반드시 수행하지는 않는 기능. 이 범주는 하나의 함수 만 포함합니다 : dns.lookup() .
  2. 실제 DNS 서버에 연결하여 이름 확인을 수행하고 항상 네트워크를 사용하여 DNS 쿼리를 수행하는 기능 이 범주에는 dns.lookup() 제외한 dns 모듈의 모든 기능이 포함됩니다.

도메인

이 모듈은 지원 중단 예정 입니다. 대체 API가 완료되면이 모듈은 완전히 사용 중지됩니다. 대부분의 최종 사용자는이 모듈을 사용할 필요가 없습니다 . 도메인이 제공하는 기능을 반드시 가지고 있어야하는 사용자는 당분간이 기능을 사용할 수 있지만 나중에 다른 솔루션으로 마이그레이션해야 할 것으로 예상됩니다.

이벤트

Node.js 코어 API의 상당 부분은 특정 객체 ( "이미 터"라고 함)가 주기적으로 명명 된 이벤트를 내 보내어 Function 객체 ( "리스너")를 호출하게 만드는 관용적 인 비동기 이벤트 중심 아키텍처를 기반으로합니다.

FS

파일 I / O는 표준 POSIX 함수를 둘러싼 간단한 래퍼에 의해 제공됩니다. 이 모듈을 사용하려면 require('fs') . 모든 메소드에는 비동기 및 동기 양식이 있습니다.

http

Node.js의 HTTP 인터페이스는 전통적으로 사용하기 어려운 프로토콜의 많은 기능을 지원하도록 설계되었습니다. 특히, 큰, 아마도 청크로 인코딩 된 메시지. 인터페이스는 전체 요청이나 응답을 절대 버퍼링하지 않도록주의하십시오. 사용자는 데이터를 스트리밍 할 수 있습니다.

https

HTTPS는 TLS / SSL을 통한 HTTP 프로토콜입니다. Node.js에서는 별도의 모듈로 구현됩니다.

기준 치수

Node.js는 간단한 모듈 로딩 시스템을 가지고 있습니다. Node.js에서 파일과 모듈은 일대일로 대응됩니다 (각 파일은 별도의 모듈로 처리됩니다).

그물

net 모듈은 비동기 네트워크 랩퍼를 제공합니다. 여기에는 서버와 클라이언트 (스트림이라고 함)를 작성하는 기능이 있습니다. 이 모듈을 require('net'); 와 함께 포함 할 수 있습니다 require('net'); .

운영 체제

os 모듈은 여러 가지 운영 체제 관련 유틸리티 메소드를 제공합니다.

통로

path 모듈은 파일 및 디렉토리 경로로 작업하기위한 유틸리티를 제공합니다.

펀치 코드

Node.js에 번들 된 punycode 모듈의 버전은 더 이상 사용되지 않습니다 .

질겁

querystring 모듈은 URL 쿼리 문자열을 구문 분석하고 형식을 지정하는 유틸리티를 제공합니다.

readline

readline 모듈은 한 번에 한 줄씩 Readable 스트림 (예 : process.stdin )에서 데이터를 읽는 인터페이스를 제공합니다.

repl

repl 모듈은 독립 실행 형 프로그램 또는 다른 응용 프로그램에서 사용할 수있는 REPL (Read-Eval-Print-Loop) 구현을 제공합니다.

흐름

스트림은 Node.js에서 스트리밍 데이터로 작업하기위한 추상 인터페이스입니다. stream 모듈은 스트림 인터페이스를 구현하는 객체를 쉽게 만들 수있는 기본 API를 제공합니다.

Node.js에서 제공하는 많은 스트림 객체가 있습니다. 예를 들어 HTTP 서버와 process.stdout 대한 요청은 모두 스트림 인스턴스입니다.

string_decoder

string_decoder 모듈은 인코딩 된 복수 바이트 UTF-8 및 UTF-16 문자를 유지하는 방식으로 Buffer 객체를 문자열로 디코딩하는 API를 제공합니다.

타이머

timer 모듈은 향후 일정 시간에 호출 할 함수를 예약하기위한 전역 API를 제공합니다. 타이머 함수는 전역 변수이므로 API를 사용 require('timers') 를 호출 할 필요가 없습니다.

Node.js의 타이머 기능은 웹 브라우저에서 제공하는 타이머 API와 비슷한 API를 구현하지만 Node.js 이벤트 루프 주위 구축 된 다른 내부 구현을 사용합니다.

tls_ (ssl)

tls 모듈은 OpenSSL 위에 구축 된 TLS (Transport Layer Security) 및 SSL (Secure Socket Layer) 프로토콜의 구현을 제공합니다.

트레이싱

추적 이벤트는 V8, 노드 코어 및 사용자 공간 코드에서 생성 된 추적 정보를 중앙 집중화하는 메커니즘을 제공합니다.

Node.js 응용 프로그램을 시작할 때 --trace-events-enabled 플래그를 전달하여 추적을 활성화 할 수 있습니다.

티티

tty 모듈은 tty.ReadStreamtty.WriteStream 클래스를 제공합니다. 대부분의 경우이 모듈을 직접 사용할 필요는 없으며 가능하지도 않습니다.

dgram

dgram 모듈은 UDP 데이터 그램 소켓의 구현을 제공합니다.

url

url 모듈은 URL 분석 및 구문 분석을위한 유틸리티를 제공합니다.

유틸리티

util 모듈은 주로 Node.js의 자체 내부 API의 필요를 지원하도록 설계되었습니다. 그러나 많은 유틸리티는 응용 프로그램 및 모듈 개발자에게 유용합니다.

v8

v8 모듈은 Node.js 바이너리에 내장 된 V8 버전의 API를 공개합니다.

참고 : API 및 구현은 언제든지 변경 될 수 있습니다.

VM

vm 모듈은 V8 가상 시스템 컨텍스트 내에서 코드를 컴파일하고 실행하기위한 API를 제공합니다. JavaScript 코드는 즉시 컴파일되거나 실행되거나 나중에 컴파일, 저장 및 실행될 수 있습니다.

참고 : vm 모듈은 보안 메커니즘이 아닙니다. 신뢰할 수없는 코드를 실행하는 데 사용하지 마십시오 .

zlib

zlib 모듈은 Gzip 및 Deflate / Inflate를 사용하여 구현 된 압축 기능을 제공합니다.

NodeJS 응용 프로그램 디버깅

노드 속성을 사용할 수 있습니다. 이 명령을 실행하여 npm을 통해 설치합니다.

npm install -g node-inspector
 

그런 다음 다음을 사용하여 응용 프로그램을 디버깅 할 수 있습니다.

npm install -g node-inspector
 

Github 저장소는 다음에서 찾을 수 있습니다. https://github.com/node-inspector/node-inspector


네이티브 디버깅

다음과 같이 node.js를 기본적으로 디버깅 할 수도 있습니다.

npm install -g node-inspector
 

원하는 코드 행에서 디버거를 정확하게 중단하려면 다음을 사용하십시오.

npm install -g node-inspector
 

자세한 내용은 여기를 참조 하십시오 .

node.js 8에서 다음 명령을 사용하십시오.

npm install -g node-inspector
 

그런 다음 Google 크롬의 최신 버전에서 about://inspect 를 열고 Node 스크립트를 선택하여 Chrome DevTools의 디버깅 환경을 가져옵니다.

온라인으로 응용 프로그램 배포

응용 프로그램을 (Node.js 특정) 호스트 환경에 배포 할 때이 환경은 일반적으로 서버를 실행하는 데 사용할 수있는 PORT 환경 변수를 제공합니다. process.env.PORT 포트 번호를 변경하면 응용 프로그램에 액세스 할 수 있습니다.

예를 들어,

http.createServer(function(request, response) {
   // your server code
}).listen(process.env.PORT);
 

또한 디버깅 중에 오프라인으로 액세스하려는 경우 다음을 사용할 수 있습니다.

http.createServer(function(request, response) {
   // your server code
}).listen(process.env.PORT);
 

여기서 3000 은 오프라인 포트 번호입니다.

Hello World 기본 라우팅

노드가있는 HTTP 서버 를 만드는 방법을 이해하면 사용자가 탐색 한 경로를 기반으로 노드를 만드는 방법을 이해하는 것이 중요합니다. 이 현상을 "라우팅"이라고합니다.

가장 기본적인 예제는 if (request.url === 'some/path/here') 확인한 다음 새 파일로 응답하는 함수를 호출하는 것입니다.

이것의보기는 여기에서 보일 수있다 :

const http = require('http');

function index (request, response) {
    response.writeHead(200);
    response.end('Hello, World!');
}

http.createServer(function (request, response) {
    
    if (request.url === '/') {
        return index(request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

그러나 이와 같이 "경로"를 계속 정의한다면 거대한 콜백 함수로 끝날 것이고 그렇게 거대한 엉망이 생기는 것을 원하지 않으므로이를 정리할 수 있는지 알아 보겠습니다.

먼저 모든 경로를 객체에 저장합니다.

const http = require('http');

function index (request, response) {
    response.writeHead(200);
    response.end('Hello, World!');
}

http.createServer(function (request, response) {
    
    if (request.url === '/') {
        return index(request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

객체에 2 개의 경로를 저장 했으므로 이제 우리는 주 콜백에서 경로를 확인할 수 있습니다.

const http = require('http');

function index (request, response) {
    response.writeHead(200);
    response.end('Hello, World!');
}

http.createServer(function (request, response) {
    
    if (request.url === '/') {
        return index(request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

이제는 웹 사이트를 탐색 할 때마다 경로에서 해당 경로의 존재 여부를 확인하고 해당 기능을 호출합니다. 경로가 없으면 서버는 404 (찾을 수 없음)로 응답합니다.

그리고 HTTP 서버 API로 라우팅하는 것은 매우 간단합니다.

Hello World 명령 줄

Node.js는 또한 명령 행 유틸리티를 작성하는 데 사용될 수 있습니다. 아래 예제는 명령 줄에서 첫 번째 인수를 읽고 Hello 메시지를 인쇄합니다.

유닉스 시스템에서이 코드를 실행하려면 :

  1. 새 파일을 만들고 아래 코드를 붙여 넣으십시오. 파일 이름은 부적절합니다.
  2. 이 파일을 chmod 700 FILE_NAME 실행 가능하게 만드십시오.
  3. ./APP_NAME David 와 앱 실행

Windows에서 1 단계를 수행하고 node APP_NAME David 와 함께 실행하십시오.

#!/usr/bin/env node

'use strict';

/*
    The command line arguments are stored in the `process.argv` array, 
    which has the following structure:
    [0] The path of the executable that started the Node.js process
    [1] The path to this application
    [2-n] the command line arguments

    Example: [ '/bin/node', '/path/to/yourscript', 'arg1', 'arg2', ... ]
    src: https://nodejs.org/api/process.html#process_process_argv
 */

// Store the first argument as username.
var username = process.argv[2];

// Check if the username hasn't been provided.
if (!username) {

    // Extract the filename
    var appName = process.argv[1].split(require('path').sep).pop();

    //  Give the user an example on how to use the app.
    console.error('Missing argument! Example: %s YOUR_NAME', appName);

    // Exit the app (success: 0, error: 1). 
    // An error will stop the execution chain. For example:
    //   ./app.js && ls       -> won't execute ls
    //   ./app.js David && ls -> will execute ls
    process.exit(1);
}

// Print the message to the console.
console.log('Hello %s!', username);
 

REPL의 Hello World

인수없이 호출되면 Node.js는 " 노드 셸 "이라고도하는 REPL (읽기 - 평가 - 인쇄 루프)을 시작합니다.

명령 프롬프트에서 node 입력 node .

$ node
>
 

노드 쉘 프롬프트에서 > 유형에 "Hello World!"

$ node
>
 

Express가있는 Hello World

다음 예제는 Express를 사용하여 "Hello, World!"로 응답하는 포트 3000에서 수신 대기하는 HTTP 서버를 작성합니다. Express는 HTTP API를 만드는 데 유용한 일반적으로 사용되는 웹 프레임 워크입니다.

먼저 myApp 와 같은 새 폴더를 만듭니다. myApp 로 이동하여 다음 코드가 포함 된 새 JavaScript 파일을 만듭니다 (예 : hello.js 로 이름 지정). 그런 다음 명령 줄에서 npm install --save express 를 사용하여 고속 모듈을 설치하십시오. 패키지를 설치하는 방법에 대한 자세한 내용은 이 설명서 를 참조하십시오 .

// Import the top-level function of express
const express = require('express');

// Creates an Express application using the top-level function
const app = express();

// Define port number as 3000
const port = 3000;

// Routes HTTP GET requests to the specified path "/" with the specified callback function
app.get('/', function(request, response) {
  response.send('Hello, World!');
});

// Make the app listen on port 3000
app.listen(port, function() {
  console.log('Server listening on http://localhost:' + port);
});
 

명령 줄에서 다음 명령을 실행하십시오.

// Import the top-level function of express
const express = require('express');

// Creates an Express application using the top-level function
const app = express();

// Define port number as 3000
const port = 3000;

// Routes HTTP GET requests to the specified path "/" with the specified callback function
app.get('/', function(request, response) {
  response.send('Hello, World!');
});

// Make the app listen on port 3000
app.listen(port, function() {
  console.log('Server listening on http://localhost:' + port);
});
 

브라우저를 열고 http://localhost:3000 또는 http://127.0.0.1:3000 이동하여 응답을 확인하십시오.

Express 프레임 워크에 대한 자세한 내용은 Express가있는 Web Apps 섹션을 확인하십시오.

기본 HTTPS 웹 서버를 설치하고 실행하는 방법!

시스템에 node.js가 설치되면 아래 절차에 따라 HTTP 및 HTTPS를 모두 지원하는 기본 웹 서버를 실행할 수 있습니다!



1 단계 : 인증 기관 구축

  1. 키 및 인증서를 저장할 폴더를 만듭니다.

    mkdir conf


  1. 해당 디렉토리로 이동하십시오.

    cd conf


  1. ca.cnf 파일을 가져 ca.cnf 구성 바로 가기로 사용하십시오.

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf


  1. 다음 구성을 사용하여 새 인증 기관을 만듭니다.

    openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem


  1. 이제 ca-key.pemca-cert.pem 에 인증 기관 ca-cert.pem 으므로 서버의 개인 키를 생성 해 봅시다.

    openssl genrsa -out key.pem 4096


  1. server.cnf 파일을 가져 server.cnf 구성 바로 가기로 사용하십시오.

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf


  1. 이 구성을 사용하여 인증서 서명 요청을 생성하십시오.

    openssl req -new -config server.cnf -key key.pem -out csr.pem


  1. 요청서에 서명하십시오 :

    openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem



2 단계 : 인증서를 루트 인증서로 설치

  1. 루트 인증서 폴더에 인증서를 복사하십시오.

    sudo cp ca-crt.pem /usr/local/share/ca-certificates/ca-crt.pem


  1. CA 스토어 업데이트 :

    sudo update-ca-certificates



3 단계 : 노드 서버 시작

먼저 실제 서버 코드가 포함 된 server.js 파일을 만들고 싶습니다.

Node.js의 HTTPS 서버에 대한 최소 설정은 다음과 같습니다.

var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);
 

http 요청을 지원하려면 다음과 같이 약간 수정해야합니다.

var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);
 
  1. server.js 가 위치한 디렉토리로 이동하십시오 :

    cd /path/to


  1. server.js 실행하십시오.

    node server.js

Node.js 설치 및 실행

시작하려면 개발 컴퓨터에 Node.js를 설치하십시오.

Windows : 다운로드 페이지로 이동하여 설치 프로그램을 다운로드 / 실행하십시오.

Mac : 다운로드 페이지로 이동하여 설치 프로그램을 다운로드 / 실행합니다. 또는 brew install node 사용하여 Homebrew를 통해 Node를 설치할 수 있습니다. Homebrew는 Macintosh 용 명령 줄 패키지 관리자이며 Homebrew 웹 사이트 에서 자세한 정보를 찾을 수 있습니다.

Linux : 명령 행 설치 페이지 에서 디스트리뷰터의 지시 사항을 따르십시오.


노드 프로그램 실행하기

Node.js 프로그램을 실행하려면 node app.js 또는 nodejs app.js 를 실행 node app.js . 여기서 app.js 는 노드 앱 소스 코드의 파일 이름입니다. 실행할 스크립트를 찾으려면 노드에 .js 접미어를 포함 할 필요가 없습니다.

또는 UNIX 기반 운영 체제에서 노드 프로그램을 터미널 스크립트로 실행할 수 있습니다. 이렇게하려면 #!/usr/bin/env node 와 같은 Node 인터프리터를 가리키는 시작 (shebang)으로 시작해야 #!/usr/bin/env node . 이 파일은 또한 실행 가능으로 설정되어야하며 chmod 사용하여 수행 할 수 있습니다. 이제 스크립트는 명령 행에서 직접 실행할 수 있습니다.

TLS 소켓 : 서버 및 클라이언트

이것과 일반적인 TCP 연결의 가장 큰 차이점은 개인 키와 옵션 개체로 설정해야하는 공용 인증서뿐입니다.

키와 인증서를 만드는 방법

이 보안 프로세스의 첫 번째 단계는 개인 키를 만드는 것입니다. 이 개인 키는 무엇입니까? 기본적으로 정보를 암호화하는 데 사용되는 임의의 노이즈 세트입니다. 이론 상으로는 하나의 키를 생성하여 원하는 키를 암호화 할 수 있습니다. 그러나 특정 사안에 대해 다른 키를 갖는 것이 가장 좋습니다. 누군가가 귀하의 비공개 키를 훔칠 경우 귀하의 집 열쇠를 훔치는 것과 유사합니다. 자동차, 차고, 사무실 등을 잠그기 위해 같은 열쇠를 사용했다면 상상해보십시오.

openssl genrsa -out private-key.pem 1024

개인 키가 있으면 CSR (Certificate Signing Request)을 생성 할 수 있습니다. 이는 CSR이 서명 한 비공개 키를 요청한 것입니다. 그래서 회사와 관련된 정보를 입력해야합니다. 이 정보는 서명 기관에서 확인하고 귀하를 확인하는 데 사용됩니다. 우리의 경우, 입력 한 내용은 중요하지 않습니다. 다음 단계에서 우리는 우리 자신의 인증서에 서명 할 것이기 때문입니다.

openssl req -new -key private-key.pem -out csr.pem

이제 종이 작업을 완료 했으므로 멋진 서명 기관인 척해야 할 때입니다.

openssl x509 -req -in csr.pem -signkey private-key.pem -out public-cert.pem

이제 개인 키와 공개 인증서를 얻었으므로 두 NodeJS 앱간에 보안 연결을 설정할 수 있습니다. 그리고 예제 코드에서 볼 수 있듯이 매우 간단한 프로세스입니다.

중대한!

우리가 공개 인증서를 만들었으므로 모든 정직한면에서 우리 인증서는 가치가 없습니다. 왜냐하면 우리는 아무 것도 없기 때문입니다. NodeJS 서버는 기본적으로 그러한 인증서를 신뢰하지 않으므로 rejectUnauthorized 옵션을 false로 사용하여 인증서를 실제로 신뢰하도록해야합니다. 매우 중요 : 프로덕션 환경에서는이 변수를 true로 설정하지 마십시오.

TLS 소켓 서버

'use strict';

var tls = require('tls');
var fs = require('fs');

const PORT = 1337;
const HOST = '127.0.0.1'

var options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('public-cert.pem')
};

var server = tls.createServer(options, function(socket) {

    // Send a friendly message
    socket.write("I am the server sending you a message.");

    // Print the data that we received
    socket.on('data', function(data) {

        console.log('Received: %s [it is %d bytes long]',
            data.toString().replace(/(\n)/gm,""),
            data.length);

    });

    // Let us know when the transmission is over
    socket.on('end', function() {

        console.log('EOT (End Of Transmission)');

    });

});

// Start listening on a specific port and address
server.listen(PORT, HOST, function() {

    console.log("I'm listening at %s, on port %s", HOST, PORT);

});

// When an error occurs, show it.
server.on('error', function(error) {

    console.error(error);

    // Close the connection after the error occurred.
    server.destroy();

});
 

TLS 소켓 클라이언트

'use strict';

var tls = require('tls');
var fs = require('fs');

const PORT = 1337;
const HOST = '127.0.0.1'

var options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('public-cert.pem')
};

var server = tls.createServer(options, function(socket) {

    // Send a friendly message
    socket.write("I am the server sending you a message.");

    // Print the data that we received
    socket.on('data', function(data) {

        console.log('Received: %s [it is %d bytes long]',
            data.toString().replace(/(\n)/gm,""),
            data.length);

    });

    // Let us know when the transmission is over
    socket.on('end', function() {

        console.log('EOT (End Of Transmission)');

    });

});

// Start listening on a specific port and address
server.listen(PORT, HOST, function() {

    console.log("I'm listening at %s, on port %s", HOST, PORT);

});

// When an error occurs, show it.
server.on('error', function(error) {

    console.error(error);

    // Close the connection after the error occurred.
    server.destroy();

});
 

Stats

24028 Contributors: 66
Sunday, July 23, 2017
아래 라이선스: CC-BY-SA

와 제휴하지 않음 Stack Overflow
Rip Tutorial: info@zzzprojects.com

eBook 다운로드