본문 바로가기
Front-end/Node.js

#7. Bcrypt 로 비밀번호 암호화 하기

by 예닌잉 2020. 12. 12.
728x90

 

 

Bcrypt (비크립트) ?

회원가입 시 비밀번호 문자열을 그대로 DB에 저장하는 것은 굉장히 위험하고 안전하지 않다. 

그렇기떄문에 Bcrypt ( 비크립트 ) 를 이용하여  password를 암호화 하여 데이터 베이스에 저장해줘야 한다.

* bcrypt는 단방향 암호화이기 때문에 복호화가 불가능하다. ( 복호화란? 암호화된 문자열을 다시 원래 문자열로 해독하는 것을 의미 )

 

 

설치 ⚙️

>  npm install bcrypt --save

 

 

Bcrypt 로 비밀번호 암호화하는 순서 🧏🏻‍♀️

1. Register Route로 가기

2. 유저 정보들 ( Account, Password 등등 ) 을 데이터 베이스에 저장하기 전에가 암호화 할 타이밍이다.

www.npmjs.com/package/bcrypt

 

bcrypt

A bcrypt library for NodeJS.

www.npmjs.com

3. salt 먼저 생성한다. ( Salt 를 이용해서 비밀번호를 암호화 해야한다. )

4. saltRounds ( salt가 몇글자인지를 나타내는 것 )

 

 

 

Basic example

bcrypt.genSalt(saltRounds, function(err, salt) {
    bcrypt.hash(myPlaintextPassword, salt, function(err, hash) {
        // Store hash in your password DB.
    });
});

 

 

Example with MongoDB

// index.js
...


app.post('/register', (req, res) => {

    // 회원 가입 할때 필요한 정보들을 client에서 가져오면
    // 그것들을 데이터 베이스에 넣어준다.

    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
        })
    })

});

...
//User.js
...
const bcrypt = require("bcrypt");
const saltRounds = 10;
...
 password: {
        type: String,
        minlength: 5,
    },
    ...
    });
    const userSchema = mongoose.Schema({
    ...
    userSchema.pre("save", function (next) {
    var user = this; // User모델자체를 가르킴

    // isModified: password가 변경될때
    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();
    }
}); //*

const bcrypt = require("bcrypt")로 bcrypt의 모듈을 불러온다.

 

const userSchema = mongoose.Schema({ ~~ }) 로 user라는 스키마를 정의해주었는데, 

하단의 userSchema.pre("save", function (next) {~~ 를 통해

userSchema에 데이터가 save 되기 전 수행 할 작업을 지정해 줄 수 있다.

save 다음에 위치한 두번째 인자에 들어있는 next 콜백은 save 전에 수행 할 작업을 마치고 save로 넘어가는 콜백함수이다.

 

먼저 .genSalt()를 통해 salt값을 생성하게 되는데, 인자로 saltRounds와 콜백함수를 받는다.

첫번쨰 인자인 saltRounds를 통해 bcrypt 해시를 계산하는데 필요한 시간을 제어 할 수 있으며, saltRounds가 높을수록 더 많은 해싱 라운드가 수행하게 된다.

마지막으로 생성된 salt 값은 콜백 함수의 인자로 bcrypt.hash에 넘어가게 되고,

세번째 인자인 콜백함수의 hash값을 user의 password에 넣어주면 된다.

 

 

 

 

 

postman을 이용하여 해당 api에 post요청을 보내주면

password가 암호화되어 보여지는 것을 확인 할 수 있다 🎉

반응형

'Front-end > Node.js' 카테고리의 다른 글

#9. 로그아웃 기능  (0) 2021.01.11
#8. Auth 기능 만들기  (0) 2020.12.26
#6. 환경 변수 process.env.NODE_ENV 설정하기  (0) 2020.11.25
#5. Nodemon 설치  (0) 2020.11.24
#4. BodyParser & Postman & 회원 가입 기능  (0) 2020.11.18