Node.js 학습_노드 내장모듈

Node.js 학습_노드 내장모듈

728x90

반응형

# 노드 내장 모듈

## 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/

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

## 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) => {} 형식이어야 함)

728x90

반응형

from http://dlagusgh1.tistory.com/833 by ccl(A) rewrite - 2021-10-03 15:01:04