Node.js/[챕터1]
#10 Bcrypt로 비밀번호 암호화 하기
Dev갱이
2021. 6. 7. 22:41
728x90
[1]Bcrypt 라이브러리 다운
npm install bcrypt --save
[2] 비밀번호 암호화 부분
//index.js
app.post('/register', (req, res) => {
const user = new User(req.body)
//userSchema.pre('save', function() { User 모델에 있는 이게 실행됨 여기부분!!
user.save((err, userInfo) =>{
if(err) return res.json({ success: false, err})
return res.status(200).json({
success:true
})
})
})
[3] 모델에서 로직추가
models/User.js
const bcrypt = require('bcrypt');
const saltRounds = 10; //10자리의 salt
userSchema.pre('save', ( next )=> {
let user = this;
if(user.isModified('password')){ //비밀번호 수정일 때만!!
//비밀번호를 암호화 시킨다.
bcrypt.genSalt(saltRounds, (err, salt) => {
if(err) return next(err);
bcrypt.hash(user.password, salt, (err, hash) => {
if(err) return next(err);
user.password = hash;
next();
})
})
}
})
10자리를 가지는 saltRounds로 비밀번호를 암호화 시킨다 라는 뜻
ps) 오류발생
userSchema.pre('save', function( next ) {
var 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();
})
})
}
})
화살표 함수가 아닌 일반 함수로 해야 된다 ㅠㅠ 왜그럴까?
[해결]
userSchema.pre('save', function( next ) {
let user = this;
if(user.isModified('password')){ //비밀번호 수정일 때만!!
//비밀번호를 암호화 시킨다.
bcrypt.genSalt(saltRounds, (err, salt) => {
if(err) return next(err);
bcrypt.hash(user.password, salt, (err, hash) => {
if(err) return next(err);
user.password = hash;
next();
})
})
} else { //비밀번호 변경이 아닐경우!!
next();
}
})
1. this
- 일반 함수와 화살표 함수의 가장 큰 차이점은 this 입니다.
- 화살표 함수와 일반 함수는 this가 다른 곳을 가리킵니다.
- 화살표 함수의 this는 바로 상위 스코프의 this와 같습니다.
- 일반 함수는 this가 동적으로 바인딩 됩니다. 일반 함수의 this는 내부 함수, 콜백 함수: 전역 객체, 객체의 메소드, 생성자 함수 입니다.
userSchema.pre('save', 함수와 화살표 함수에서
let user = this;
여기서 this가 가르키는게 다르기 떄문에 안됨!!! req 값이 없음!!!
728x90