본문 바로가기
Back-End Frameworks/Node.js

3)Nodejs_기능정리_노드 내장 모듈(2) os, path, url, querystring, crypto, util, worker_threads, child_process, 기타 모듈들

by Downy_J 2023. 7. 6.
728x90
반응형
SMALL

노드는 os 정보에도 접근 되고

클라이언트 요청 주소에 대한 정보도 갖고올수있으며

이런것들이 다 내장 모듈을 통해 가능함


노드 내장 모듈

os

웹에서 쓰는 JS는 OS 정보를 못갖고 오지만

Node에선 os 모듈에 정보가 담겨져 갖고올수가 있다

 






os 모듈은 현재 사용자 컴퓨터의 운영체제 정보를 갖고옴

 

  • os.arch() : 운영체제 아키텍쳐
  • os.platform() : .운영체제 플랫폼
  • os.type() : 운영체제명
  • os.uptime() : 운영체제가 실행된 시간
  • os.hostname() : 호스트명(컴퓨터명)
  • os.release() : 운영체제 버젼
  • os.homedir() : 홈 디렉터리 경로
  • os.tmpdir() : 임시 파일 저장 경로
  • os.cpus() : cpu정보를 담은 객체
  • os.cpus().length : 코어 갯수
  • os.freemem() : 시스템 가용 메모리
  • os.totalmem() : 시스템 총 메모리

 

일반적으로 웹 서비스 제작에 사용될 일은 없어 보임. .


path

폴더, 파일의 경로를 쉽게 조작하기위한 모듈

윈도우 타입 : [ \ ] 으로 구분
POSIX 타입 : 맥이나 리눅스에서 사용되며 [ / ] 로 구분함

 





  • path.sep : 경로 구분자
  • path.delimiter : 환경변수 구분자
  • path.dirname(경로) : 파일이 위치한 폴더의 경로
  • path.extname(경로) : 파일의 확장자
  • path.basename(경로, 확장자) : 확장자 포함 파일 이름 표시, 파일의 이름만 표시
  •  path.parse(경로) : 파일 경로를 root, dir, base, ext, name 로 분리
  • path.format(객체) : path.parse()한 객체를 파일 경로로 합치기
  • path.normalize(경로) : / or \ 를 실수로 많이 쓰거나 혼용 했을시 정상경로로 수정
  • path.isAbsolute(경로) : 파일 경로가 절대경로다 T / 아니다 상대경로다 F
  • path.relative(기준경로, 비교경로) : 경로들을 넣게 되면 첫경로에서 두번째 경로로 가는 방법을 알려줌.
  • path.join(경로, ...) : 여러 인수들 넣으면 하나의경로로 합쳐줌 .. 상대경로 .현재위치 도 알아서 처리해줌.
  • path.resolve(경로, ...) : .join(경로, ... )과 비슷함. 단, 절대경로로 인식해 앞의 경로 다 무시. (.join(경로, ...)은 상대경로로 처리)

 

상대 경로 => 현재 파일 기준. 현재 파일과 같은 경로다면 [ ./ ] 붙이고 한 단계 상위 경로라면 [ ../ ]를 붙인다

 


url

인터넷 주소 조작 모듈

 

이 url 처리 방식은 두가지가 있다

 

WHATWG의 url 구분법




  • url.parse() : url 문자열을 url 객체로 가져와 리턴. 주소를 분해함

이 둘중 아무거나 써도 되지만

차이가 있다면 서로 갖고있는 속성이 다른 부분이 있다

 

WHATWG 방식은

이렇게 특수한 객체로 반환 하므로 유용함

search는 ? 로 시작하고

그 뒤 key=value 형식으로 데이터를 전달을 함

  • get(key) : 키에 해당하는 첫번째 값
  • getAll(key) : 키에 해당하는 모든 값 가져오기
  • has(key) : 해당 키가 존재 여부 검사
  • keys() : searchParams의 모든 키를 반복기  객체로 가져옴
  • values() : searchParams의 모든 값을 반복기 객체로 가져옴
  • append(key, value) : 해당 키 추가하기
  • set(key, value) : append 와 비슷하나 같은 key 값은 전부 던지고 새호운걸 추가함
  • delete(key) : 해당 key 제거
  • toString() : 조작한 searchParams 객체를 다시 문자열로 ( 이 문자열 search에 넣으면 주소 객체에 반영됨)

querystring

기존 Node의 url 구분법

url을 사용할 때 search 부분을 사용하기 쉽게 객체로 만든 모듈

  • querystring.parse(쿼리) : url의 query부분을 JS객체로 분해
  • querystring.stringify(객체) :  분해된 query 객체를 문자열로 재조립

crypto

함호화 모듈

[ 단방향 암호화 ]

복호화 할 수 없는 암호화 방식

단방향 암호화는 한번 암호화 되면 원래 문자열을 찾을 수 없다

 

이런걸 어따 쓰냐 싶은데...

고객 비번을 암호화 해서 DB에 담아두고

로그인 할때마다 입력받은 비번을

같은 암호화 알고리즘으로 암호화 후

DB에 담긴 비번과 비교하면 된다

 

그럼 원래의 비번은 어디에도 저장되있지 않고

암호화된 문자열로만 비교를 하는것

  • createHash(알고리즘) : 사용할 Hash 알고리즘을 넣는다. (md5, sha1, sha256, sha512, 등등 있음..) 찾아보고 취약하지 않은걸 쓰면됨
  • update(문자열) : 변환할 문자열
  • digest(인코딩) : 인코딩할 알고리즘을 넣는다. (base64, hex, latin1 등이 주로 쓰이나 그중 base64가 문자열이 짧아 많이씀)
비밀 번호 -----------------------------> 해시 함수 -----------------------------> 다이 제스트
<-------------X-------------- <-----------------------------

해킹이 날로 발전함에 있어 기존의 해시 알고리즘이 약해지는 형국이다

때문에 좀더 강력한 해시 알고리즘을 사용해야 할것이며

요즘엔 pbkdfe, bcrypt, scrypt라는 알고리즘으로 암호화 하는 중이다

https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%99%94_%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98

 

암호화 해시 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 암호화 해시 함수(cryptographic hash function)은 해시 함수의 일종으로, 해시 값으로부터 원래의 입력값과의 관계를 찾기 어려운 성질을 가지는 경우를 의미한다. 암

ko.wikipedia.org

pbkdf2 알고리즘 사

randomBytes() 메서드로 64비트 길이의 문자열을 만들면 이제 이게 salt가 됨.

pdkdf2() 메서드 안에는 비밀번호, sal, 반복횟수, 출력바이트, 해시 알고리즘 순으로 인수를 준다

10만번을 횟수로 주고 적용 ( sha512로 변환한 값을 다시 sha512로 변환하는걸 10만번 한단 소리)

  salt 반복 횟수  
비밀 번호 pbkdf2 해시 알고리즘
pbkdf2

이것들은 crypto.randomBytes와 crypto.pdkdf2 메서드들은 내부적으로 스레드풀을 써

멀티 스레드로 동작 하기에 

싱글 스레트 프로그래밍한다고 블로킹 되진 않음

 

randomBytes기 땜에 돌릴때 마다 결과값이 달라진다

때문에 slat를 잘 보관해야 비번도 잘 찾을 수 있다

 

그리고 pdkdf2는 취약하다 쓰지마


[ 양방향 암호화 ]

암호화된 문자열을 복호화 할 수 있는 키 라는게 존재함

  • crypto.createCipheriv(algorithm, key, iv): 알고리즘, 키, iv를 넣는다. 알고리즘은 aes-256-cbc를 썻는데 저건  키값은 32 바이트고 iv는 16바이트여야 됨. iv란 암호화 할때 쓰는 초기 백터값을 의미. ( 사용가능 알고리즘 목록은 crypto.getCiphers() 입력해보면 알수 있음)
  • cipher.update(문자열, 인코딩, 출력 인코딩) : 암호화 대상과 대상의 인코딩, 출력결과물 인코딩을 넣는다
  • cipher.final(출력 인코딩) : 출력 결과물의 인코딩을 넣으면 암호화가 완료가됨.
  • crypto.createDecipheriv(algorithm, key, iv) : 복호화 할때 사용. 암호화 할때 썻던거 그대로 넣음됨
  • decipher.update(문자열, 인코딩, 출력 인코딩) : (암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩) 을 넣는다
  • decipher.final(출력 인코딩) : 복호화 결과물

util

유틸..

이름 부터 뭔가 각종 편의 기능을 모아둔것같은 모듈명인데

맞다

 

API가 계속 생겨나는것도 있지만

반대로 비효율적이여서 관리가 안되서 사용률 저조해서

deprecated되어 사라지기도 한다


  • util.deprecate : 함수가 deprecated 됬음을 알려준다. 첫번째 인수로 넣은 함수를 쓰면 경고 메세지 뜨고, 두번째 인수로 경고메세지 내용 넣음됨. 함수가 사라졌던가 뭐 수정됬다 싶은거 알리면됨
  • util.promisify : 콜백 패턴을 프로미스 패턴으로 바꿈. 바꿀 함술를 인자로 제공하면 된다.
  • util.callbackify : 프로미스를 콜백으로 바꿈

worker threads

노드는 싱글 스레드지만

멀티로도 사용 할 순 있다

isMainThread => 현재 코드가 메인 스레드에서 도는지 아니면 생성한 워커 스레드에서 도는지 구분한다

 

메인 스레드에선  new Worker를 통해 현재파일(__filename)을 워커 스레드에서 돌리고

 

부모에선 워커 생성 후 worker.postMessage로 워터 데이터 보낼 수 있음

그럼 워커는 parentPort.on('message') 이벤트 리스너로 부모로부터 메시지 받을 수 있고

parentPort.postMessage로 부모에게 메세지를 보냄.

 

부모는 worker.on('message')로 메세지를 받고 (메시지 한번만 받을거면 once('message') 하면됨)

 

그리고 워커에서 on 메서드를 쓸땐 직접 워커를 종료까지 해줘야함

이 parentPort.close() 를 하면 부모와 연결이 끊어져 종료됨

종료땐 worker.on('exit')이 실행된다


여러개의 worker thread 를 만들어 데이터를 넘겨보자


new Worker 호출 시 두번째 인수 workerData 속성으로 원하는 데이터를 보낼 수 있다

워커에선 workerData로 부모로 부터의 데이터를 받는데

현재 2개의 워커가 돌고 있고 각각 부모로 부터 숫자를 받어 100을 더해 돌려준다

 

돌려주는 순간 워커는 종료되어 worker.on('exit')가 실행되고 두 워커 다 종료되면 worker is done가 나온다


소수를 찾는 작업은 연산이 많이 들어가는 대표적인 작업이다

워커 스레드로 돌려 소수의 갯수를 구해보자

worker thread 사용 전
worker thread 사용 후

정말 길고 복잡하고 어렵고 쉽지않은게 바로 이 멀티스레딩 같음.

8개의 스레드를 사용해 일을 나눠 처리하게 했는데

단순 계산이라 이렇지 멀티 스레딩이란게

그 공유하는 데이터가 많은 경우엔 일을 나누는것 부터가 사실 쉽지 않다

 

스레트 생성 후 스레드 끼리 통신 하는데 상당한 비용이 발생하므로

이거 고려해서 멀티 스레딩을 해야지 그렇지 않으면 싱글스레딩 보다 더

느려질 수도 있다


child process

Node에서 다른 프로그램을 실행하려 한다거나

명령어를 수행 하고싶을 때 사용하는 모듈

 

이 모듈을 통해 다른 언어로된 코드를 실행하고 결과값을 받을 수 있다

 

이름부터 자식 프로세스인 이유는

현재 노드 이외 새 프로세스 띄워 명령을 수행하고,

노드 프로세스에 그 결과를 알려주기 때문

어머..나?

글씨가 깨지는디....

npm install iconv-lite

이거 설치해서 언어 설정 된다던데 아직 모르겠음. .

현재 폴더의 파일 목록을 보여준다

여기서 파이썬 파일도 실행을 할 수있다.

뒤에 3번째 인수로 shell: true를 넣어주면

exec 처럼 셸을 실행해 명령어를 수행한다

 

셸을 실행하는지 마는지 따라 수행할 명령어에 차이가 있다


기타 모듈들

  • assert : 값 비교 후 프로그램 작동 이상여부 테스트
  • dns : 도메인명에 대한 IP 주소 얻기
  • net : HTTP 보다 낮은 레벨인 TCP나 IPC 통신 할 때 사용
  • string decoder : 버퍼 데이터를 문자열로
  • tls : TLS와 SSL에 관한 작업을 할 때 사용
  • tty : 터미너로가 관련된 작업할 때 씀
  • dgram : UDP와 관ㄹ녀된 작업할 때 씀
  • v8 : V8 엔진에 직접 접근할 때 씀
  • vm : 가상 머신에 직접 접근할 때 씀
728x90