user 비밀번호를 회원가입을 통해 입력시 그대로 DB에 저장되는데 이 비밀번호는 반드시
Hash처리가 되어야 보안상 좋을 것이다.
이 Hash는 결과값과 알고리즘을 알아도 원래 입력값을 알 수 없다는 점이 특이한 점이다.
function func(inputNum) {
var result = inputNum+10;
return result;
}
입력값에 10을 더해 리턴하는 이 무난한 함수가 Hash 함수를 만난다면 어떻게 될까?
function hashFunc(inputNum) {
var str = inputNum.toString();
var result = str[0] + str[str.length-1];
return result;
}
해쉬함수의 예이다.
1입력시 1을 반환하고 123입력시 13을 반환한다. 0번째 인덱스와 마지막 인덱스를 리턴하는 함수이다. 하지만 입력값이 1, 11, 121, 132341와 같은 경우 똑같이 11을 반환한다. 알고리즘을 알고 있어도 같은 결과 값을 리턴한다는 것이 바로 이런 것이다.
user1이 비밀번호를 새로 생성했다면 DB에는 password1이 저장되지 않고 hash값이 저장된다. 사용자가 로그인하려고 할 때 password1을 입력하면 서버는 password1에 대한 hash 생성 후 이 값과 DB에 저장되어 있는 값이 같은 지를 비교하여 같으면 로그인이 성공하게 된다.
이 해쉬값은 어떻게 보면 정말 안전하지만 해당 알고리즘을 지속적으로 반복하다보면 언젠가는 이 값을 얻을 수 있기 때문에 비밀번호를 정기적으로 바꾸는 것이 좋다고 하는 것이다.
bcrypt
var bcrypt = require('bcryptjs');
compareSync
: 저장된 hash와 입력받은 password의 hash가 일치하는지 확인
if(!user.isNew){
if(!user.currentPassword){
user.invalidate('currentPassword', 'Current Password is required!');
}
else if(!bcrypt.compareSync(user.currentPassword, user.originalPassword)){ // 2
user.invalidate('currentPassword', 'Current Password is invalid!');
}
...
Schema.pre
: 첫 번째 파라미터로 설정된 event가 일어나기 전(pre)에 먼저 callback 함수를 실행
userSchema.pre('save', function (next){
var user = this;
if(!user.isModified('password')){ // 3-1
return next();
}
else {
user.password = bcrypt.hashSync(user.password); //3-2
return next();
}
});
"save" event는 Model.create
, model.save
함수 실행시 발생하는 event이다
ismodified
함수는 해당 값이 db에 기록된 값과 비교해서 변경된 경우true
, 아닌 경우false
를 반환한다. user 생성시 항상 true이고 user 수정시는 password 변경시에만 true를 반환한다. user.password의 변경이 없을 시 hash를 재생성하지 않는다.
- user를 생성하거나 user 수정시 user.password의 변경이 있는 경우에는
bcrypt.hashSync
함수로 hash값을 바꾼다.
Uploaded by Notion2Tistory v1.1.0