반응형
# 노드 내장 모듈
## 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) => {} 형식이어야 함)
반응형
'인프런 강의 학습 > Node.js 교과서' 카테고리의 다른 글
Node.js 학습_파일 시스템(fs) 모듈 / 버퍼와 스트림 / pipe와 스트림 메모리 효율 확인 (0) | 2021.10.03 |
---|---|
Node.js 학습_노드 내장 객체 worker_threads / child_process (0) | 2021.10.03 |
Node.js 학습_REPL 사용 / JS파일 실행 / 모듈 생성 / 노드 내장 객체 (0) | 2021.10.02 |
Node.js 학습_자바스크립트 문법(화살표 함수) (0) | 2021.10.02 |
Node.js 학습_자바스크립트 문법(호출 스택 / 이벤트 루프 / const, let / 템플릿 문자열, 객체 리터럴) (0) | 2021.09.30 |