만약 회원가입이나 로그인을 할때 비밀번호가 이처럼 입력한 그대로 들어온다면 보안에 상당히 취약할 것입니다.
그래서 비밀번호를 입력하고 보낼때는 원래대로 보내더라도 데이터베이스에 저장할때는 암호화가 필요한데요.
사이트의 데이터베이스를 관리하는 사람도 비밀번호를 모르게끔 만들어주어야합니다.
Bcrypt를 이용하여 암호화를 해보도록 할 예정입니다.
npm install bcrypt --save
다운로드가 잘 된모습입니다.
우선 암호화를 위해 가장 먼저 해야할 것은 register router에서 db에 저장되기 전에 암호화를 먼저 해주어야합니다.
그러기 위해서는 몽구스의 기능을 하나 이용해야합니다.
User 모델에
const bcrypt = require('bcrypt');
const saltRounds = 10;
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();
});
});
} else {
next();
}
});
이 코드를 작성하여 몽구스에서 저장하기 전에 암호화를 시키는 것입니다.
https://www.npmjs.com/package/bcrypt
비크립트의 사이트입니다.
사이트의 중간에 보면 비크립트를 사용하는 방법이 있습니다.
먼저 salt를 생성하고 생성된 salt를 이용하여 비밀번호를 암호화 하는 것입니다.
saltRounds는 salt가 몇글자인지 나타내 줍니다.
한줄씩 보겠습니다.
const bcrypt = require('bcrypt');
const saltRounds = 10;
해당 부분은 npm으로 설치한 bcrypt 모듈을 가져옵니다.
saltRound는 저는 공식 사이트와 같이 10으로 하겠습니다.
userSchema.pre('save', function (next) {
});
몽구스에서 save되기전에 실행을 할건데요. 콜백함수를 보겠습니다.
userSchema.pre('save', function (next) {
var user = this;
if (user.isModified('password')) {
}
});
해당 페이지에 있는 user를 가지고 올거구요.
password를 변경할때만 password가 암호화 되도록 하기 위해 조건문을 하나 걸어주었습니다.
만약 email을 변경할때도 비밀번호가 계속해서 암호화 된다면 난감해지겠죠??
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();
});
});
먼저 salt를 생성하기 위한 코드입니다. 만약 salt가 생성되지 못하고 에러가 발생한다면 에러를 리턴합니다.
하지만 salt가 생성이 되면 hash를 사용합니다.
user.password는 암호화된 비밀번호가 아니라 입력한 비밀먼호를 의미합니다.
해당 비밀번호를 salt만큼 암호화를 해준뒤 암호화가 된 hash를 user에 있는 password에 초기화합니다.
이렇게 작성된 코드를 통해 한번 다시한번 회원가입을 해보겠습니다.
postman을 이용해서 데이터를 쏴보았습니다.
암호화가 잘 되었네요!!
'따라하며 배우는 시리즈 > NodeJS & ReactJS Basic' 카테고리의 다른 글
[NodeJS] 노드 리액트 기초 - Auth 기능 만들기 (0) | 2022.09.07 |
---|---|
[NodeJS] 노드 리액트 기초 - bcrypt를 이용한 로그인 기능 만들기 (0) | 2022.09.06 |
[NodeJS] 노드 리액트 기초 - 비밀 설정 정보 관리(모듈 이용해서 비밀정보 관리) (1) | 2022.09.02 |
[NodeJS] 노드 리액트 기초 - Nodemon(노드몬) 설치 (0) | 2022.09.01 |
[NodeJS] 노드 리액트 기초 - BodyParser를 이용한 회원가입 기능(with.PostMan) (0) | 2022.08.31 |