반응형

# 노드 내장 모듈

## OS 모듈 메서드

  • 노드에서 os 제공, 운영체제의 정보를 담고 있다.
  • 모듈은 require로 가져옴 (내장 모듈이라 경로 대신 이름만 적어줘도 됨)
  • os.arch() : process.arch와 동일
  • os.platform() : process.platform과 동일
  • os.type() : 운영체제의 종류를 보여줌
  • os.uptime() : 운영체제 부팅 이후 흐른 시간(초)을 보여줌. (process.uptime()은 노드의 실행 시간)
  • os.hostname() : 컴퓨터의 이름을 보여줌
  • os.release() : 운영체제의 버전을 보여줌
  • os.homedir() : 홈 디렉터리 경로를 보여줌
  • os.tmpdir() : 임시 파일 저장 경로를 보여줌
  • os.cpus() : 컴퓨터의 코어 정보를 보여줌
  • os.freemem() : 사용 가능한 메모리(RAM)을 보여줌
  • os.totalmem() : 전체 메모리 용량을 보여줌
  • https://nodejs.org/dist/latest-v14.x/docs/api/
 

Index | Node.js v14.18.0 Documentation

 

nodejs.org

const os = require('os');
console.log('운영체제 정보 ------------');
console.log('os.arch() : ', os.arch());
console.log('os.platform() : ', os.platform());
console.log('os.type() : ', os.type());
console.log('os.uptime() : ', os.uptime());
console.log('os.hostname() : ', os.hostname());
console.log('os.release() : ', os.release());

console.log('경로 -------------');
console.log('os.homedir() : ' + os.homedir());
console.log('os.tmpdir() : ' + os.tmpdir());

console.log('cpu 정보 ---------');
console.log('os.cpus() : ', os.cpus());	// 자주 사용.
console.log('os.cpus().length : ', os.cpus().length);

console.log('메모리 정보 --------');
console.log('os.freemem() : ', os.freemem());
console.log('os.totalmem() : ', os.totalmem());

## path

  • 폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈
  • 운영체제별로 경로 구분자가 다름(Windows : '\', POSXI : '/')
  • path.sep : 경로의 구분자 (Windows : \, POSIX : /)
  • path.delimiter : 환경 변수의 구분자. process.env.PATH를 입력하면 여러 개의 경로가 이 구분자로 구분되어 있다. (Windows : tpalzhffhs(;), POSIX : 콜론(:))
  • path.dirname(경로) : 파일이 위치한 폴더 겨올를 보여줌
  • path.extname(경로) : 파일의 확장자를 보여줌
  • path.basename(경로, 확장자) : 파일의 이름(확장자 포함)을 보여줌. 파일의 이름만 표시하고 싶다면 basename의 두 번째 인자로 파일의 확장자를 넣어주면 됨
  • path.parse(경로) : 파일 경로를 roow, dir, base, ext, name으로 분리
  • path.format(객체) : path.parse()한 객체를 파일 경로로 합친다.
  • path.normalize(경로) : /나 \를 실수로 여러 번 사용했거나 혼용했을 때 정상적인 경로로 변환해줌.
  • path.isAbsolute(경로) : 파일의 경로가 절대경로인지, 상대경로인지 true나 false로 알려줌
  • path.relative(기준경로, 비교경로) : 경로를 두 개 넣으면 첫 번째 경로에서 두 번째 경로로가는 방법을 알려줌
  • path.join(경로, .. .) : 여러 인자를 넣으면 하나의 경로로 합쳐준다. 상대경로인 .. (부모 디렉터리)와 . (현 위치)도 알아서 처리해줌
  • path.resolve(경로, .. .) : path.join()과 비슷하지만 차이가 있다.
const path = require('path');

const string = __filename;

console.log('----------path-------------------')
console.log('path.sep : ', path.sep);
console.log('path.delimiter : ', path.delimiter);
console.log('---------------------------------');
console.log('path.dirname() : ', path.dirname(string));
console.log('path.extname() : ', path.extname(string));
console.log('path.basename() : ', path.basename(string));
console.log('path.basename - extname : ', path.basename(string, path.extname(string)));
console.log('-----------------------------------');
console.log('path.parse() : ', path.parse(string));
console.log('path.format() : ', path.format({
    dir : 'C:\\users\\zero',
    name : 'path',
    ext : '.js',
}));
console.log('path.normalize() : ', path.normalize('C://users\\\\zero\\\path.js'));
console.log('-----------------------------------');
console.log('path.isAbsolute(C:\\) : ', path.isAbsolute('C:\\'));
console.log('path.isAbsolute(./home) : ', path.isAbsolute('./home'));
console.log('-----------------------------------');
console.log('path.relative() : ', path.relative('C:\\users\\zero\\path.js', 'C:\\'));
console.log('path.join() : ', path.join(__dirname, '..', '/users', '.', '/zero'));

## url

최신 방식은 WHATWG  인데, 기존 방법이 쓰이기도 함. 아래 공식문서 참고.

https://nodejs.org/dist/latest-v14.x/docs/api/url.html

 

URL | Node.js v14.18.0 Documentation

URL# Source Code: lib/url.js The url module provides utilities for URL resolution and parsing. It can be accessed using: const url = require('url'); URL strings and URL objects# A URL string is a structured string containing multiple meaningful components.

nodejs.org

## searchParams

  • WHATWG 방식에서 쿼리스트링(search) 부분 처리를 도와주는 객체
  • 쿼리스트링 : 주소에 데이터가 담겨있는 부분.
?page=3&limit=10&category=nodejs&category=javascript 부분
  • getAll(키) : 키에 해당하는 모든 값들을 가져옴. 위에서 category 키에는 두 가지 값, 즉 nodejs와 javascript의 값이 들어있음.
  • get(키) : 키에 해당하는 첫 번째 값만 가져옴
  • has(키) : 해당 키가 있는지 없는지를 검사
  • keys() : searchParams의 모든 키를 반복기(iterator, ES2015 문법) 객체로 가져옴
  • values() : searchParams의 모든 값을 반복기 객체로 가져옴
  • append(키, 값) : 해당 키를 추가. 같은 키의 값이 있다면 유지하고 하나 더 추가.
  • set(키, 값) : append와 비슷하지만, 같은 키의 값들을 모두 지우고 새로 추가.
  • delete(키) : 해당 키를 제거
  • toString() : 조작한 searchParams 객체를 다시 문자열로 만든다. 이 문자열을 search에 대입하면 주소 객체에 반영됨.

## 단방향 암호화(crypto)

  • 암호화는 가능하짐나 복호화는 불가능
  • 암호화 : 평문을 암호로 만듦
  • 복호화 : 암호를 평문으로 해독
  • 단방향 암호화의 대표 주자는 해시 기법이다. (문자열을 고정된 길이의 다른 문자열로 바꾸는 방식으로, abcdefg 문자열을 -> qvew 등으로 바꿈)

### Hash 사용하기(sha512)

  • createHash(알고리즘) : 사용할 해시 알고리즘을 넣어줍니다.
md5, sha1, sha256, sha512 등이 가능하지만, md5와 sha1은 이미 취약점이 발견됨.
현재는 sha512 정도로 충분하지만 나중에 sha512마저도 취약해지면 더 강화된 알고리즘으로 바꿔야 함.
  • update(문자열) : 변환할 문자열을 넣어줍니다.
  • digest(인코딩) : 인코딩할 알고리즘을 넣어줍니다.
base64, hax, latin1이 주로 사용되는데, 그중 base64가 결과 문자열이 가장 짧아 애용된다.
결과물로 변환된 문자열을 반환한다.

### pbkdf2

  • 컴퓨터의 발달로 기존 암호화 알고리즘이 위협받고 있음.
sha512가 취약해지면 sha3으로 넘어가야 함.
현재는 pdkdf2나 bcrypt, scrypt 알고리즘으로 비밀번호를 암호화.
Node는 pbkdf2와 scrypt 지원.
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'));
    });
});

 

## 양방향 암호화

  • 대칭형 암호화(암호문 복호화 가능)
  • Key가 사용됨
  • 암호화할 때와 복호화 할 때 같은 Key를 사용해야 함
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);
  • crypto.createCipheriv(알고리즘, 키, iv) : 암호화 알고리즘과 키, 초기화백터를 넣어줍니다.
암호화 알고리즘은 aes-256-cbc를 사용. 다른 알고리즘을 사용해도 됨.
사용 가능한 알고리즘 목록은 crypto.getCiphers()를 하면 볼 수 있다.
키는 32바이트, 초기화백터(iv)는 16바이트로 고정.

 

  • cipher.update(문자열, 인코딩, 출력 인코딩) : 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩을 넣어줍니다.
보통 문자열은 utf8 인코딩을 / 암호는 base64를 많이 사용함.
  • cipher.final(출력 인코딩) : 출력 결과물의 인코딩을 넣어주면 암호화가 안료된다.
  • crypto.createDecipheriv(알고리즘, 키, iv) : 복호화할 때 사용. 암호화할 때 사용했던 알고리즘과 키, iv를 그대로 넣어줘야 한다.
  • decipher.update(문자열, 인코딩, 출력 인코딩) : 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩을 넣어줍니다.
createCipher의 update()에서 utf8, base64 순으로 넣었다면
createDecipher의 update()에서 base64, utf8 순으로 넣으면 된다.
  • decipher.final(출력 인코딩) : 복호화 결과물의 인코딩을 넣어줍니다.
  • aws kms : 비밀번호 관리 전략을 위한 자동화 서비스? 사용 하기도 함.

## util

  • 각종 편의 기능을 모아둔 모듈
  • deprecated와 promisify가 자주 쓰인다.
const util = require('util');
const crypto = require('crypto');

const dontUseMe = util.deprecate((x, y) => {
	console.log(x + y);
}, 'dontUseMe 함수는 deprecated되었으니 더 이상 사용하지 마세요!');
dontUseMe(1, 2);

const randomBytesPromise = util.promisify(crypto.randomBytes);
randomBytesPromise(64)
	.then((buf) => {
    	console.log(buf.toString('base64');
    })
    .catch((error) => {
    	console.error(error);
    });
  • util.deprecate : 함수가 deprecated 처리되었음을 알려줍니다. (deprecated란 '중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 될' 것이라는 뜻으로 새로운 기능이 나와 기존 기능보다 더 좋을 때, 기존 기능을 deprecated 처리하곤 함. 이전 사용 기능을 제거하지는 않지만 곧 없앨 예정이므로 더 이상 사용하지 말라는 의미.)
첫 번째 인자로 넣은 함수를 사용했을 때 경고 메시지가 출력됩니다.
두 번째 인자로 경고 메시지 내용을 넣으면 됨. 함수가 조만간 사라지거나 변경될 때 알려줄 수 있어 유용함.
  • util.promisify : 콜백 패턴을 프로미스 패턴으로 바꿔줍니다.
바꿀 함수를 인자로 제공하면 된다. 이렇게 바꾸어두면 async/await 패턴까지 사용할 수 있어 좋다.
(단, 콜백이 (error, data) => {} 형식이어야 함)
반응형

+ Recent posts