이전까지 암호화할 때 crypto모듈을 사용해서 salt 생성 & salt와 암호화 pw를 별도로 저장하는 방식을 사용했는데, 최근 외주에서 백엔드를 맡은 팀원이 작성한 코드를 보던 중 salt 저장 없이 비교 가능한 모듈이 있어 신기하여 토이 프로젝트에 적용함
적용 프로젝트: TaxChild
Reference:
// user.js
const mongoose = require('mongoose');
const { getTime } = require("../util/getTime");
const Schema = mongoose.Schema;
const userSchema = new Schema({
type: { type: Number, required: true, default: 0 }, // 0: student, 1: parent, 2: teacher
name: { type: String, required: true},
pn: { type: String, required: true, unique: true },
pin: { type: String, required: true },
classes: { type: [String], required: true, default: [] },
school: { type: String, required: true },
published_date: { type: Date, default: getTime }
});
// .save 직전 .pre가 실행됨 -> bcrypt를 사용해서 pin 데이터를 암호화
userSchema.pre("save", function (next) {
var user = this;
if (user.isModified("pin")) { //패스워드가 변경될때만 해싱작업이 처리됨. --> 굳이 업데이트마다 번거로운 암호화 작업을 새로 작성할 필요 없음!!
bcrypt.genSalt(10, (err, salt) => {
if (err) return next(err);
bcrypt.hash(user.pin, salt, (err, hash) => {
if (err) return next(err);
user.password = hash;
next();
});
});
} else {
next();
}
});
// methods setting -> 나중에 find 등의 작업 이후 result.authenticate 등의 방법으로 사용 가능
userSchema.methods.authenticate = function (pin) {
var user = this;
return bcrypt.compareSync(pin, user.pin);
};
module.exports = mongoose.model('user', userSchema);