설모의 기록

bcrypt-nodejs 모듈 사용하기 본문

언어/Javascript

bcrypt-nodejs 모듈 사용하기

HA_Kwon 2018. 1. 8. 00:22

  회원정보를 관리하는 어플리케이션이나 웹페이지를 구현할 때 가장 중요한 것은 보안입니다. 보안 중에서도 가장 중요한 것이 사용자의 비밀번호를 암호화해 로그인을 함부로 할 수 없도록 하는 것입니다. 비밀번호를 텍스트 그대로 데이터베이스에 저장해 관리하는 것은 해커에게 "가져가라~" 라고 말하는 것과 같습니다. 오늘은 그 중에서도 비밀번호를 암호화해 저장하기 위해 만들어진 bcrypt 에 대해 알아보겠습니다. 아래 코드들은 node.js 를 이용해 개발하는 프로젝트에서의 예시입니다.


  bcrypt 모듈 종류는 bcrypt 모듈, bcrypt-nodejs 모듈 그리고 bcryptjs 모듈이 있습니다. 각자 프로젝트에 맞게 설치해주시면 됩니다. 저는 bcrypt-nodejs 모듈을 사용하겠습니다. 모듈을 적용하려는 프로젝트에서 package.json 파일이 존재하는 경로에서 모듈을 설치해줍니다.

$ npm install -g bcrypt-nodejs


  bcyrpt-nodejs 모듈을 사용하려는 파일에서 모듈을 선언합니다. 

const bcrypt = require(bcrypt-nodejs);

  이제 bcrypt-nodejs 모듈을 사용할 준비가 끝났습니다. 



bcrypt 모듈에서의 'salt'

  bcrypt 모듈을 사용하려 할 때 '대체 salt 값이 뭐지?' 하는 생각이 드실겁니다. bcrypt 는 단방향 해시 함수를 이용한 모듈입니다. 물론 비밀번호를 암호화하지 않고 텍스트 그대로 데이터베이스에 저장하는 것 보단 안전합니다. 그러나 비밀번호에 대한 해시값을 구하는데에는 1초보다도 훨씬 적은 시간이 걸립니다. 사용자가 아이디와 비밀번호를 입력하는데에 걸리는 5초보다도 해커가 해시함수를 이용해 비밀번호의 해시값을 구하는 시간이 더 적게 걸리는거죠. 그렇기 때문에 해커들은 비밀번호를 금새 유추할 수 있습니다. 이런 점을 예방하기 위해 salt 라는 개념을 사용합니다. salt 값과 해시된 비밀번호를 합쳐 데이터베이스에 저장하게 되면 같은 "1234" 라는 비밀번호를 해시함수에 넣게 되어도 다른 암호화 된 비밀번호가 반환되는 것입니다. 항상 같은 salt 값을 붙이지 않고 사용자에 따라 다른 값을 붙이게 된다면 해커들을 더 힘들게 할 수 있습니다. 


  이제 예제를 살펴보겠습니다. 우선 bcrypt.getsalt(rounds, callback) 메소드를 이용해 salt 값을 생성합니다. 생성된 salt 값은 callback 함수의 인자로 넘어가게 됩니다. 그 값과 password 를 bcrypt.hash(plainTextPassword, salt, prograss, callback) 메소드의 인자로 넘겨줍니다. prograss 는 해시 값을 계산할 때 진행됨을 나타내는 콜백메소드 입니다. 마지막으로 callback 메소드의 인자로 넘어오는 해시 값을 사용하면 됩니다. 

1
2
3
4
5
6
7
8
9
10
11
bcrypt.genSalt(10function(err, salt) {
    if (err) {
        console.log('bcrypt.genSalt() errer : ', err.message);
    } else {
        bcrypt.hash(plainTextPassword, salt, null, function(err, hash) {
            if (err) { console.log('bcrypt.hash() errer : ', err.message); } 
            else { console.log(hash); }
        });
    }
  });
});



  이 후, 로그인 시 사용자가 입력한 비밀번호의 해시값이 데이터베이스에 저장된 해시값과 같은지 비교해야 합니다. 이 때, bcrypt.compare(비교해볼 문자열, 해시값, 콜백메소드) 메소드를 사용합니다. 콜백메소드로 넘어오는 res 값은 boolean 값으로 비교해 볼 문자열과 해시 값이 같으면 true, 다르면 false 를 반환합니다.

1
2
3
4
5
6
7
8
9
bcrypt.compare(plainTextPassword, hashedPassword, function(err, res) {
    if (err) {
        console.log('bcrypt. compare() errer : ', err.message);
    } else {
        if (res) { console.log('plainTextPassword === hashedPassword'); } 
        else { console.log('plainTextPassword !== hashedPassword'); }
    }
  });
});


  bcrypt 모듈의 메소드를 더 보시려면 아래의 사이트를 참조하시면 될 것 같습니다.

참고 사이트 : https://www.npmjs.com/package/bcrypt-nodejs

'언어 > Javascript' 카테고리의 다른 글

nodemailer 모듈 사용하기  (0) 2018.01.13
async.waterfall() 메소드  (1) 2018.01.08
Map 과 Set  (0) 2018.01.04
싱글톤(singleton) 패턴  (0) 2017.12.16
자바스크립트 메모이제이션(Memoization) 패턴  (0) 2017.12.16
Comments