본문 바로가기

Node.js

[Node.js] 정보 암호화 및 관리2 - Bcrypt

본 포스팅은 John Ahn님의 유튜브 강의를 참고했습니다.

 

https://youtu.be/XonyJxSDoGE?si=h5cZ3SChsfjVEVxs

 

저번에 Postman으로 MongoDB에 데이터를 넘겼었는데

 

확인해보니 데이터가 없었습니다.

 

왜 그런가 살펴봤더니 URL에 문제가 있었습니다.

 

"mongodb+srv://아이디:비번@todolist.5fpaal7.mongodb.net/데이터베이스이름?retryWrites=true&w=majority"

 

MongoDB의 주소 형식인데

 

제가 데이터베이스 이름을 입력하지 않았었습니다.

 

MongoDB Atlas

 

지금은 이렇게 Postman으로 데이터를 넘기면 잘 넘어옵니다.

 

 

 

 

저번 시간에는 MongoDB의 주소 비밀번호를 암호화 해봤는데요.

 

오늘은 Bcrypt라는 것을 이용해서 로그인 할 때 넘어오는 사용자의 비밀번호를

 

암호화 해보는 시간을 가지겠습니다.

 

먼저 npm i bcrypt --save를 터미널에 입력해서 설치해줍니다.

 

설치가 완료되면 Model 폴더 안에 있는 스키마 파일로 이동합니다.

 

Bcrypt를 사용하려면 기본 세팅을 해야하는데

 

bcrypt - npm (npmjs.com)

 

bcrypt

A bcrypt library for NodeJS.. Latest version: 5.1.1, last published: 6 months ago. Start using bcrypt in your project by running `npm i bcrypt`. There are 4343 other projects in the npm registry using bcrypt.

www.npmjs.com

 

Bcrypt 홈페이지에 방법이 나와 있습니다.

 

Bcrypt에서는 Salt라는 것을 이용해서 암호화를 진행합니다.

 

const bcrypt = require('bcrypt');

 

다운받은 bcrypt를 변수로 선언해 주고

const saltRounds = 10;

 

saltround라는 것을 만들어 줍니다.

 

이것은 암호화 하려하는 글자 수를 의미합니다.

 

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

 

다음은 이런 코드를 넣어줘야 하는데

 

gensalt를 통해서 salt를 생성합니다.

 

이때 파라미터로 saltRounds와 callback함수가 들어갑니다.

 

if (err) return next(err)

 

코드 한줄을 추가하여 에러 여부를 확인할 수도 있습니다.

 

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

 

암호화하는 hash함수인데 파라미터인 myPlaintextPassword는

 

암호화하려는 데이터를 의미합니다.

즉 저희는 비밀번호를 암호화해야 하기 때문에 password 데이터가 들어가면 됩니다.

 

password 데이터를 가져오는 방법은

 

var user = this;

 

자바 언어와 비슷한데 this라는 변수를 선언하면

 

이 파일 내의 변수에 접근할 수 있습니다.

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

 

즉, user.password는 이 스키마 내에 password에 접근하게 됩니다.

 

여기서 hash 파라미터는 암호화된 비밀번호 입니다.

 

주의할 점이 비밀번호 암호화는 비밀번호를 변경할 때만 이루어져야 하는데

 

아이디를 변경하거나 다른 작업을 할 때에도 비밀번호가 암호화 되면 곤란할 것 같습니다.

 

if(user.isModified('password')){ }

 

이 함수를 쓰면 그런 문제를 해결할 수 있습니다.

 

isModified함수는 password라는 파라미터가 변경될 때 내부 함수를 실행시켜 줍니다.

 

그래서 이 함수로 감싸주면

 


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

 

최종 코드가 완성됩니다.

 

이제 비밀번호가 암호화 되는지 확인해 볼까요?

 

{
    "name": "hi22",
    "email" : "itis me",
    "password" : "123456"
}

 

Postman으로 이런 데이터를 넘겨보겠습니다.

 

MondoDB/test

 

password 부분이 암호화 되어서 들어온 것이 보이시나요?

 

오늘은 비밀번호 암호화 하는 bcrypt라는 모듈에 대해 알아보았는데요.

 

로그인 기능에 한 걸음씩 접근하고 있는게 뿌듯하게 느껴지네요.

 

감사합니다!

 

'Node.js' 카테고리의 다른 글

[Node.js] 로그아웃 기능  (0) 2024.02.17
[Node.js] Auth 기능 만들기  (0) 2024.02.16
[Node.js] 로그인 기능  (0) 2024.02.16
[Node.js, Git] 정보 암호화 및 관리  (0) 2024.02.14
[Node.js] Nodemon 모듈  (0) 2024.02.14