설모의 기록
bcrypt-nodejs 모듈 사용하기 본문
회원정보를 관리하는 어플리케이션이나 웹페이지를 구현할 때 가장 중요한 것은 보안입니다. 보안 중에서도 가장 중요한 것이 사용자의 비밀번호를 암호화해 로그인을 함부로 할 수 없도록 하는 것입니다. 비밀번호를 텍스트 그대로 데이터베이스에 저장해 관리하는 것은 해커에게 "가져가라~" 라고 말하는 것과 같습니다. 오늘은 그 중에서도 비밀번호를 암호화해 저장하기 위해 만들어진 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(10, function(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 모듈의 메소드를 더 보시려면 아래의 사이트를 참조하시면 될 것 같습니다.
'언어 > 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 |