Crypto 모듈 사용하기

Crypto 모듈은 단방향 암호화 방식을 사용한다. 단방향 암호화 방식은 원래의 문자열로 돌려놓는 복호화가 불가능하다. 그래서 알고리즘을 사용하여 암호화하는데, MD5나 SHA1방식은 이미 뚫렸기 때문에 사용하면 안된다. 복호화가 안된다면 왜 사용하나 싶었는데, 홈페이지의 비밀번호는 다시 복호화 할 필요가 없다. 암호화가 된 사용자의 비밀번호를 저장하여 로그인 할 때마다 같은 알고리즘으로 암호화를 하여 DB에 저장된 비밀번호를 확인하면 된다.

crypto.createHash('sha512').update('1234').digest('base64');

위와 같이 Crypto 모듈을 통해 createHash 메소드를 사용하면 되는데, createHash메소드에는 사용할 알고리즘 명을, update 메소드에는 암호화 할 문자열을, digest 메소드에는 암호화된 문자열 표시 방법을 결정한다.

 

Crypto+salt 사용하기

같은 알고리즘을 사용할 때, 같은 문자열에 대한 것은 같은 암호화 결과를 반환한다. 그렇기 때문에 암호화 결과를 통해서도 원래의 암호를 유추해낼 수 있다. 이러한 데이터 베이스를 레인보우 테이블이라고 한다. 그렇기 때문에 해커가 레인보우 테이블을 사용하지 못하도록 소금을 뿌려준다. 랜덤으로 생성된 Salt를 통해 암호화하여 얻은 결과를 다시 변형할 수 있다.

crypto.randomBytes(32,(err,buf)=>{
        crypto.pbkdf2('1234',buf.toString('base64'),100000,64,'sha512',(err,key)=>{
            console.log(key.toString('base64'));
        });
    });

위 코드와 같이 먼저 randomBytes 메소드로 32바이트(또는 64바이트) 길이의 salt를 생성해준다. buf는 버퍼 형식이기 때문에 buf.toString(‘base64’)으로 base64 문자열 salt로 변경해준다. 그 다음 pbkdf2 메소드를 사용하여 단방향 암호화를 해준다. 매개변수는 차례대로 비밀번호, salt, 반복횟수, 비밀번호 길이, 해시 알고리즘이다.

 

Key stretching이란

hashing함수를 반복하여 해싱하는 것을 말한다. 동일한 횟수만큼 해시해야 일치여부를 확인할 수 있다. salt값을 알더라도 반복횟수가 일치하지 않으면 digest를 찾을 수 없다.

 


 

Request 모듈

내부 서버에서 다른 서버로 요청을 보낼 때 사용하는 모듈이다. 또한 다른 서버에서 요청을 보내서 데이터를 받아온다. request()가 리턴하는 것은 request(url)에서 보내는 http 요청에 대한 정보를 담고 있다.

'_정리&복습_' 카테고리의 다른 글

[OS] CPU스케줄링 - 스케줄링 알고리즘  (0) 2019.04.29
[OS] CPU스케줄링 - 기본 개념  (0) 2019.04.19
[솝트] 2차 세미나 (Node js란?)  (0) 2019.04.18
OAuth2.0 flow  (0) 2019.02.27
OAuth 2.0  (0) 2019.02.18

Node js란?

  • javascript 기반 서버 플랫폼
  • 크롬 V8엔진 기반 동작
  • 이벤트 기반
  • non-blocking I/O 방식
  • 싱글 스레드 기반

- V8 엔진, 이벤트 기반

  코드를 한 줄씩 해석하면서 실행하는 인터프리터 방식의 느린 속도를 해결하기 위해 크롬의 V8엔진을 사용하였다. V8엔진은 이벤트를 받아 처리하는 이벤트 루프 기능이 있다. 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식인데, Node js는 서버쪽에서 동작하는 프로그램을 만드는 것이 주임무이기 때문에 가장 중요한 기능이다.

 

- non-blocking I/O 방식 사용

  웹 서버에 파일을 업로드할 때, 업로드가 완료되기 전까지 서버에서 다른 작업을 할 수 없는 문제를 해결하기 위해 새로운 방식의 서버개발 도구를 만들기 시작했는데, 이것이 Node.js이다. 즉, 하나의 요청 처리가 끝날 때 까지 기다리지 않고 다른 요청을 동시에 처리할 수 있는 비동기 입출력(non-blocking I/O)방식을 적용했다.

먼저, blocking I/O 란 아래 그림처럼 프로그램이 읽기 요청을 하면 그 동안은 프로그램이 다른 작업을 하지 않고 기다리게 된다. 파일 시스템에서 동작을 완료하고 난 후에 프로그램이 다시 다른 작업을 시작할 수 있다.

blocking I/O인 경우

  이러한 대기 시간때문에 작업 속도가 느려지는 문제가 생기게 된다.

 

  이것을 non-blocking I/O 방식으로 바꾸면 파일을 읽어들일때 대기하는 시간이 없어진다. 다시 말해, non -blocking I/O는 시작만 해둔 채 완료되지 않은 상태에서 다른 처리 작업을 계속 진행할 수 있도록 멈추지 않고 입출력 처리를 기다리는 방법을 말한다. 이는 콜백함수(callback function) 통해 해결한다. 프로그램에서는 파일 읽기 요청을 하기 전에 콜백 함수를 등록하는데, 파일 시스템은 파일 처리가 끝나면 자동으로 콜백 함수를 호출한다. 따라서 프로그램이 파일 읽기 작업이 끝날때 까지 대기하지 않아도 파일을 다 읽은 시점에 통보를 받고 파일의 내용을 화면에 보여주는 작업을 진행할 수 있다. 

blocking I/O 방식(왼쪽)일 경우와 non-blocking I/O 방식일 경우 코드 비교

 

- 싱글스레드 기반

 먼저, 스레드란 프로세스 내에서 실행되는 여러흐름의 단위를 말한다. 보통 한 프로세스 당 여러개의 스레드가 존재한다. 멀티스레드란 여러 개의 스레드가 일을 나누어서 처리하는 것을 말한다. 그렇기 때문에 하나의 스레드에 문제가 생겨도 다른 스레드로 대체가 가능하다. 반대로 싱글스레드란 주어진 작업을 혼자 처리하는 것을 말한다. 노드에도 여러 스레드가 존재하지만 직접 제어할 수 있는 스레드는 하나뿐이라 싱글스레드라고 부른다. 

 

Node js는 비동기 입출력 방식을 사용하는 이벤트 기반의 싱글스레드
장점
  • 싱글 스레드와 비동기 입출력 처리에 기반한 빠른 속도
  • 멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용
  • 입출력 작업이 많은 서버에 적합
  • 비교적 높은 생산성
  • 웹 서버가 내장되어 있음
  • JSON형식과 호환이 쉬움
단점
  • 싱글 스레드라 하나의 큰 작업이 들어오면 부하가 크게 걸림
  • CPU작업이 많은 서버로는 부적합
  • 콜백함수가 중첩될 경우 가독성이 떨어짐
  • 규모가 큰 서버에는 관리가 어려움

 


노드를 쉽게 사용할 수 있게 해주는 '모듈'

 

모듈이란 특정한 기능을 하는 함수느 변수들의 집합을 말한다. 자체로도 하나의 프로그램이면서 다른 프로그램의 부품으로 사용이 가능하다. 모듈로 만들어두면 모듈을 재사용할 수 있다.

모듈 만들기 두 가지 방법
모듈 불러오기

 

 do it! Node.js 프로그래밍과 세미나 ppt를 참고하여 작성하였습니다.

 

'_정리&복습_' 카테고리의 다른 글

[OS] CPU스케줄링 - 스케줄링 알고리즘  (0) 2019.04.29
[OS] CPU스케줄링 - 기본 개념  (0) 2019.04.19
[솝트] 2차 세미나 (Node js 모듈 정리)  (0) 2019.04.19
OAuth2.0 flow  (0) 2019.02.27
OAuth 2.0  (0) 2019.02.18

+ Recent posts