post 를 사용해 회원가입 기능을 만들 때, MongoDB 의 save() 를 이용해 데이터베이스에 정보를 저장한다. 이때 들어가는 정보 중 비밀번호를 암호화하는 방법을 적어 두려고 한다. 까먹을 것 같거든
// index.js
app.post('/register', (req, res) => {
const user = new User(req.body)
user.save((err, userInfo) => {
if (err) return res.json({ success: false, err })
return res.status(200).json({ success: true })
})
})
const app = express()
같은 내용은 다 잘라 버리고 핵심만 쓰겠다
user 변수에 정보를 저장하고, 데이터베이스로 옮기는 user.save(...)
가 실행되기 전 타이밍에 비밀번호 암호화가 필요하다.
// models/user.js
const mongoose = require('mongoose')
const bcrypt = require('bcrypt')
const saltRounds = 10
const userSchema = mongoose.Schema({ ... })
userSchema.pre('save', function(next){
const user = this
if(user.isModified('password')) {
bcrypt.genSalt(saltRounds, function(err, salt){
if (err) return next(err)
bcrypt.hash(user.password, salt, function(err, hash){
if (err) return next(err)
user.password = hash
next()
})
})
}
})
const User = mongoose.model('User', userSchema)
module.exports = { User }
userSchema.pre('save', function(next){ ... })
는 save 가 실행되기 직전에 function 을 실행하는 코드이다.
아무런 조건을 주지 않으면 비밀번호 외의 정보가 변경될 때도 비밀번호 암호화가 새로 이루어지기 때문에, if(user.isModified('password')
를 걸어 준다. genSalt 로 salt 를 만들어 주는데, salt 는 아주 작은 임의의 문자열이다. 그 salt 를 갖고 hashing 작업을 실행한다. 에러 없이 hash 가 잘 생성되었으면 비밀번호를 hash 로 덮어씌운다.