Back-end/Node.js

[Node.js] 노드 내장 모듈 알아보기

poppy 2021. 7. 7. 18:56
반응형

자주 사용하는 노드 내장 모듈에 대해 알아보겠습니다!

 

 path 

path는 폴더와 파일의 경로를 쉽게 조작할 수 있도록 도와주는 모듈입니다. 운영체제별로 경로 구분자가 다르기 때문에 path를 사용하면 편리해집니다. path 모듈의 속성과 메소드는 매우 많으므로 그 때 그 때 필요한 속성이나 메소드를 찾아 사용하는 것이 좋을 것 같습니다. 다음 링크에 path 모듈의 모든 속성과 메소드, 사용 방법이 나와 있습니다.

https://nodejs.org/api/path.html

 

Path | Node.js v16.4.2 Documentation

Path# Source Code: lib/path.js The path module provides utilities for working with file and directory paths. It can be accessed using: const path = require('path'); Windows vs. POSIX# The default operation of the path module varies based on the operating s

nodejs.org

 

 url 

url은 인터넷 주소를 쉽게 조작할 수 있도록 도와주는 모듈입니다. 이 두가지가 주로 사용하는 메소드입니다.

  • url.parse(주소) - 주소를 분해한다
  • url.format(객체) - 분해되었던 url 객체를 다시 원래 상태로 조립한다
const url = require('url');

const parsedUrl = url.parse('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor');
console.log('url.parse():', parsedUrl);
console.log('url.format():', url.format(parsedUrl));

출력 결과

 

 crypto 

crypto는 암호화를 도와주는 모듈입니다. 암호화 방식에는 단방향 암호화와 양방향 암호화가 있습니다. 

 

1. 단방향 암호화

단방향 암호화는 복화화 할 수 없는 암호화 방식입니다. 단방향 암호화에서는 주로 해시 기법을 사용합니다.

crpyto.createHash(알고리즘).update(암호화할 문자열).digest(인코딩) 으로 암호화 할 수 있습니다.

const crypto = require('crypto');
console.log('base64:', crypto.createHash('sha512').update('비밀번호').digest('base64'));

출력 결과

 

위의 방법으로 암호화를 할 경우 단어사전 공격으로 정보가 유출될 수 있습니다. 위의 방법보다는 pbkdf2, bcrypt, scrypt 을 사용하는 것이 좋습니다. pbkdf2는 암호화할 문자열에 salt라는 문자열을 붙인 후 해시 알고리즘을 반복하여 적용하는 것이다. 다음은 pbkdf2를 사용한 암호화 코드입니다.

const crypto = require('crypto');

crypto.randomBytes(64, (err, buf) => {
  const salt = buf.toString('base64');
  console.log('salt:', salt);
  crypto.pbkdf2('비밀번호', salt, 100000, 64, 'sha512', (err, key) => {
    console.log('password:', key.toString('base64'));
  });
});

출력 결과

randomBytes() 메소드로 64바이트 길이의 랜덤 문자열을 만든 후 이것을 salt로 사용합니다.

crpyto.pbkdf2(암호화할 문자열, salt, 반복 횟수, 출력 길이, 알고리즘) 으로 암호화 합니다. salt는 랜덤 문자열로 실행할 때마다 달라지므로 salt를 잘 보관하고 있어야 합니다.

 

2. 양방향 암호화

양방향 암호화는 문자열을 암호화/복호화 모두 가능합니다. 양방향 암호화를 알아야 다음 코드를 이해할 수 있습니다.

const crypto = require('crypto');

const algorithm = 'aes-256-cbc'; // 암호화 알고리즘
const key = 'abcdefghijklmnopqrstuvwxyz123456'; // 키
const iv = '1234567890123456'; // 초기화 벡터

// 암호화
const cipher = crypto.createCipheriv(algorithm, key, iv); 
let result = cipher.update('암호화할 문장', 'utf8', 'base64');
result += cipher.final('base64');
console.log('암호화:', result);

// 복호화
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let result2 = decipher.update(result, 'base64', 'utf8');
result2 += decipher.final('utf8');
console.log('복호화:', result2);

update(암호화할 문자열, 인코딩, 출력 인코딩) 으로 출력 결과물을 만든 후 final(출력 인코딩) 을 하면 암호화 또는 복호화가 완료됩니다.

 

 worker_threads 

노드에서 멀티 스레드 방식으로 작업하고 싶을 때 worker_threads 모듈을 사용하면 됩니다.

const {
  Worker, isMainThread, parentPort,
} = require('worker_threads');

if (isMainThread) { // 부모일 때
  const worker = new Worker(__filename);
  worker.on('message', message => console.log('from worker', message));
  worker.on('exit', () => console.log('worker exit'));
  worker.postMessage('ping');
} else { // 워커일 때
  parentPort.on('message', (value) => {
    console.log('from parent', value);
    parentPort.postMessage('pong');
    parentPort.close();
  });
}

출력 결과

isMainThread을 통해 현재 코드가 메인 스레드에서 실행되는지 워커스레드에서 실행되는지 알 수 있습니다. 부모에서 워커 생성 후 worker.postMessage(보낼 메세지) 로 워커에 데이터를 보낼 수 있습니다. 워커는 parentPort.on('message') 로 부모로부터 메세지를 받습니다. 워커에서도 부모에 메세지를 보낼 수 있고 부모에서도 워커로부터 메세지를 받을 수 있습니다.

반응형