Bcrypt 로 비밀번호 암호화하기

gugyeoj1n·2022년 4월 30일
0

Node.js

목록 보기
1/3

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 로 덮어씌운다.

0개의 댓글