Node.js - bcrypt

균비·2021년 2월 6일
0

node.js

목록 보기
1/1

TL;DR

이전까지 암호화할 때 crypto모듈을 사용해서 salt 생성 & salt와 암호화 pw를 별도로 저장하는 방식을 사용했는데, 최근 외주에서 백엔드를 맡은 팀원이 작성한 코드를 보던 중 salt 저장 없이 비교 가능한 모듈이 있어 신기하여 토이 프로젝트에 적용함

Info

적용 프로젝트: TaxChild

Reference:

  1. A Mean Blog - 게시판 만들기 - Login기능 추가
  2. A Mean Blog - 게시판 만들기 - 계정 pw 암호화

적용



// 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);
profile
뒹굴뒹굴 고3 개발자!

0개의 댓글