자주 사용하는 노드 내장 모듈에 대해 알아보겠습니다!
path
path는 폴더와 파일의 경로를 쉽게 조작할 수 있도록 도와주는 모듈입니다. 운영체제별로 경로 구분자가 다르기 때문에 path를 사용하면 편리해집니다. path 모듈의 속성과 메소드는 매우 많으므로 그 때 그 때 필요한 속성이나 메소드를 찾아 사용하는 것이 좋을 것 같습니다. 다음 링크에 path 모듈의 모든 속성과 메소드, 사용 방법이 나와 있습니다.
https://nodejs.org/api/path.html
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') 로 부모로부터 메세지를 받습니다. 워커에서도 부모에 메세지를 보낼 수 있고 부모에서도 워커로부터 메세지를 받을 수 있습니다.
'Back-end > Node.js' 카테고리의 다른 글
[Node.js] 요청과 응답 서버 (http) (0) | 2021.07.10 |
---|---|
[Node.js] 파일 시스템 모듈(fs), 이벤트 (0) | 2021.07.09 |
[Node.js] 노드 내장 객체 알아보기 (0) | 2021.07.07 |
[Node.js] Express 사용하여 홈페이지 구현 (CRUD) (0) | 2021.01.05 |
[Node.js] MySQL로 JOIN 사용하여 글 생성/수정 구현 (0) | 2020.12.31 |