웹 브라우저에 사용되는 자바스크립트는 운영체제의 정보를 가져올 수 없지만, 노드는 OS 모듈에 정보가 담겨있기 때문에 가져오는게 가능
os.arch() : 프로세서 아키텍처 정보
os.platform() : 운영체제 플랫폼 정보
os.type() : 운영체제의 종류
os.uptime() : 운영체제 부팅 이후 흐른 시간
os.hostname() : 컴퓨터의 이름
os.release() : 운영체제의 버전
os. constants : 각종 에러와 신호에 대한 정보
(EADDTINUSE / ECONNRESET 같은 에러 코드)
폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈
windows는 \ / POSIX(macOS, 리눅스같은 유닉스기반)은 /
path.sep : 경로의 구분자(windows의 경우 \ )
path.delimiter : 환경변수의 구분자(windows의 경우 ; )
path.dirname(경로) : 파일이 위치한 폴더의 경로
path.extname(경로) : 파일의 확장자
path.basename(경로,확장자) : 파일의 이름(확장자 포함)
인터넷 주소를 쉽게 조작하도록 도와주는 모듈
WHATWG 방식과 기존 방식으로 구분된다.
▼ WHATWG의 url 구분 방식
url.parse(주소) : 주소를 분해
(WHATWG 방식과 비교하면 username과 passwort 대신 auth 속성,
searchParams 대신 query)
url.format(객체) : 분해 되었던 url 객체를 원래 상태로 조립
(WHATWG 방식에서도 사용 가능)
기존 노드의 url을 사용할 때 search 부분을 사용하기 쉽게 객체로 만드는 모듈
const url = require('url');
const querystring = require('querystring');
const parsedUrl = url.parse('http://www.gilbut.co.kr/?page=3&limit=10&category=nodejs&category=javascript');
const query = querystring.parse(parsedUrl.query);
console.log('querystring.parse() : ' , query);
console.log('querystring.stringify() : ', querystring.stringify(query));
querystring.parse() : [Object: null prototype] {
page: '3',
limit: '10',
category: [ 'nodejs', 'javascript' ]
다양한 방식의 암호화를 도와주는 모듈
비밀번호를 암호화하지 않을 경우 DB가 해킹되는 순간 유출됨
복호화를 할 수 없는 암호화 방식
여기서 복호화란, 암호화된 문자열을 원래 문자열로 되돌려놓는 것을 의미한다.
한번 암호화하면 다시 문자열을 찾을 수 없음
비밀번호는 보통 단방향 암호화 방식으로 암호화한다
암호화된 문자열로만 값을 비교
주로 해시기법
을 사용하는데, 해시기법이란 어떠한 문자열을 고정된 길이의 다른 문자열로 바꾸는 방식을 의미한다
(입력 문자열의 길이가 서로 달라도 출력 문자열의 길이는 고정)
const crypto = require('crypto');
console.log('base64:', crypto.createHash('sha512').update('비밀번호').digest('base64'));
console.log('hex:', crypto.createHash('sha512').update('비밀번호').digest('hex'));
console.log('base64:',crypto.createHash('sha512').update('다른 비밀번호').digest('base64'));
base64: dvfV6nyLRRt3NxKSlTHOkkEGgqW2HRtfu19Ou/psUXvwlebbXCboxIPmDYOFRIpqav2eUTBFuHaZri5x+usy1g==
hex: 76f7d5ea7c8b451b773712929531ce92410682a5b61d1b5fbb5f4ebbfa6c517bf095e6db5c26e8c483e60d8385448a6a6afd9e513045b87699ae2e71faeb32d6
base64: cx49cjC8ctKtMzwJGBY853itZeb6qxzXGvuUJkbWTGn5VXAFbAwXGEOxU2Qksoj+aM2GWPhc1O7mmkyohXMsQw==
createHash(알고리즘) : 사용할 해시 알고리즘을 넣어준다.
md5, sha1, sha256, sha512 등이 있는데, 현재는 sha512로 충분하다.
update(문자열) : 변환할 문자열을 넣어준다.
digest(인코딩) : 인코딩할 알고리즘을 넣어준다.
base64, hex, latin1등이 있는데, base64가 주로 사용된다.
가끔 출력 문자열이 똑같은 출력 문자열로 바뀔 때도 있는데,
이런 경우 충돌
이 발생했다고 말한다.
해킹용 컴퓨터
는 어떤 문자열이 같은 출력 문자열을 반환하는지 찾아낸다.
따라서, 해시 알고리즘
또한 강력하게 진화하고 있다.
현재는 주로 pdkdf2, bcrypt, scrypt 알고리즘으로 비밀번호를 암호화하는데,
노드에서 지원하는건 pdkdf2
이다.
pdkdf2 : 기존 문자열에 salt라고 불리는 문자열을 붙인 후
해시 알고리즘을 반복해서 적용한다.
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'));
});
});
salt : ildNtimc+wN3vl5ytlkftnQ3jyGC/UrS0hPts2miRdgsBUg8L0SKbO+fBARNBghVdrnu5pKWxNns9KdpUYoA2A==
password : muJM7aU981AMcqv8tK12qTzfab5X3CvHf5rxM99HyM0/Ayn98CrbpSvqi6T99w/SAmKZU2Mv7MyLdYaCUwjUdQ==
먼저, randomBytes() 메서드로 64 바이트 길이의 문자열을 만들어준다.
pbkdf2() 메서드에는 순서대로 비밀번호, salt, 반복 횟수, 출력 바이트, 해시 알고리즘을 인자로 넣어준다.
해당 과정을 10만번 반복해준다.
(컴퓨터 성능에 따라 반복 횟수를 조절해준다.
키(열쇠)를 이용해서 암호화된 문자열을 복호화 할 수 있다.
암호를 복호화 하려면 암호화할 때 사용한 키와 같은 키가 필요하다.
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);
실행결과
암호화 : iiopeG2GsYlk6ccoBoFvEH2EBDMWv1kK9bNuDjYxiN0=
복호화 : 암호화할 문장
crypto.createCipher(알고리즘, 키) : 암호화 알고리즘과 키를 넣어준다.
cipher.update(문자열, 인코딩, 출력 인코딩) : 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩을 넣어준다.
(보통 문자열은 utf8, 암호는 base64)
cipher.final(출력 인코딩) : 출력 결과물의 인코딩을 넣어주면 암호화 완료
crypto.createDecipher(알고리즘, 키) : 복호화할 때 사용. 암호화할 때 사용했던 알고리즘과 키를 그대로 넣어준다.
decipher.update(문자열, 인코딩, 출력 인코딩) : 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩을 넣어준다.
(보통 문자열은 utf8, 암호는 base64 => cipher과 반대 순서)
decipher.final(출력 인코딩) : 복호화 결과물의 인코딩을 넣어준다.
각종 편의 기능을 모아둔 모듈, 계속해서 업데이트됨
util.deprecate : 함수가 deprecate 되었음을 알린다.
함수가 조만간 사라지거나 변경될 경우 알림을 출력할 수 있다.
util.promisify : 콜백 패턴을 프로미스 패턴으로 바꿔준다.
async/await 패턴까지 사용이 가능하다.