Node & React basic #6

Jay·2023년 5월 11일
0

Node & React basic

목록 보기
6/21
post-thumbnail

우리가 postman에서 보내는 password는 암호화가 1도 안 되어 있어서 보안상 문제가 있다. 이번에는 Bcrypt로 비밀번호를 암호화해보자.

터미널에서 npm i bcrypt --save를 입력해서 bcrypt를 깔아준다.

암호화를 해보자.

그리고 암호화는 Register Route에서 .save하기 전에 일어나야 하기 때문에
우리가 만든 스키마를 열어서

이걸 입력해준다. .pre는 몽구스 메서드인데 인자로 save를 넘겨주었으니 save전에 블록 안의 함수를 실행시켜줌.
함수 작성을 하기 전에 Bcrypt사이트 참고해서 상단에

const bcrypt = require('bcrypt');
const saltRounds = 10;

salt를 생성해서 암호화하는 것이다(정처기의 기억 22..).
그리고 .pre안에는 이와 같이 작성한다.

userSchema.pre('save', function(next){
  let user = this;
// 비밀번호를 암호화시킨다.
  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()
    })
  })
})

먼저 user변수를 선언해준 이유는 user의 password에 접근하기 위해서이다.
bcrypt.genSalt로 솔트 키를 만드는데 인자로 saltRounds(위에서 선언한)와 function을 넣어준다. err가 발생하면 err를 next(err)를 통해서 몽구스 메서드 .save로 넘겨주는 것임.
bcrypt.hash로 salt키 이용해 hash암호 생성(하는 것 같음)
여기서도 err발생시 .save로 넘겨준다.
에러가 발생하지 않고 hash가 잘 생성되었으면 user.password를 대체해준 다음
next()로 .save메서드로 넘겨준다.

비밀번호가 바뀔 때만!

그런데 여기서 매번 이 함수가 실행되면 비밀번호 hash가 계속 바뀌는 불필요한 일이 발생하기 때문에 조건을 하나 걸어준다.

userSchema.pre("save", function (next) {
  let 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();
      });
    });
  } else {
  	next(); // 비밀번호가 바뀌지 않았을 경우 바로 next로 넘겨줌
  }
});

요렇게 isModified를 이용함!
난 isModified라는 메서드를 만들어줘야하나 했는데 내장함수인가 보다.

전체 상태는 이렇다.

그리고 여기서 지난번 err떴던 이유를 알았음.
이미 한 번 register를 실행했는데, email에 unique를 걸어뒀는데 똑같은 email로 두 번 send해서 그런 거였다.
이메일 바꾸니까 제대로 success: true 떴음!

mongoDB에서 프로젝트 선택하고 collections 보면 암호화된 것을 확인할 수 있다!

흥미롭다..

profile
ㄱ이 아닌 개발자가 되고 싶은 사람

0개의 댓글