반응형
bcrypt란?
웹 페이지를 구현할 때 보안은 가장 기본적으로 수행되어야 할 요소입니다. 비밀번호를 텍스트 그대로 데이터 베이스에 저장해 관리하는 것은 해커에게 대놓고 데이터를 주는 것과 다름 없습니다. 이를 방지하고자 비밀번호를 암호화 하는 것이 bcrypt 모듈입니다.
bcrypt는 단방향 해시 함수를 이용한 모듈로써 Salt 라는 개념을 사용합니다. Salt 라는 값과 해시된 비밀번호를 합쳐 데이터베이스에 저장하게 되는데 이렇게 하면, 만약 "1234" 같은 비밀번호를 해시함수에 넣었을때 항상 다른 값의 Salt 값과 비밀번호가 합쳐서 해커들이 비밀번호를 찾는데 있어 더욱 힘들게 만듭니다.
사용 방법
- npm i bcrypt를 수행합니다.
- const bcrypt = require('bcrypt'); 로 불러옵니다.
설명
- 이미지는 async/await를 사용한 bcrypt 구문입니다. 두번째 "12"라는 인자 값이 바로 Salt 입니다. 다음과 수행하면 해쉬된 password값을 받을 수 있습니다.
router.post('/join',isNotLoggedIn, async(req, res)=>{
const password_hash = await bcrypt.hash(req.body.password_join, 12);
var query = `
INSERT INTO ${process.env.DB_DATABASE}.user_information (
user_id,
user_pw,
user_name,
user_email)
VALUES (
'${req.body.id_join}',
'${password_hash}',
'${req.body.name_join}',
'${req.body.email_join}'
);`;
await dbPool(query);
res.render('join');
});
2. 위 이미지에서 hash 된 password를 가져와서 텍스트로 입력받은 비밀번호와 compare를 합니다. 같다면 true, 다르 면 false를 반환합니다.
const localStrategy = require("passport-local").Strategy;
const dbPool = require('../config/config.js') //DB 연결
const bcrypt = require('bcrypt');
module.exports = passport => {
passport.use(
new localStrategy({
usernameField: "email", // 여기서 id,pw의 값은 index.html의 form에서 해당하는 name값이여야 합니다.
passwordField: "password"
},
async(email, password, done) => { // id, pw는 위에서 받은 값 입니다.
try {
const user = await dbPool(`SELECT * FROM ${process.env.DB_DATABASE}.user_information WHERE user_id ='${email}'`);
const password_key = await bcrypt.compare(password, user[0].user_pw);
console.log(password_key);
console.log(user[0]);
if(user){
if (email === user[0].user_id && password_key === true) { // id,pw를 사용하여 db에서 사용자를 조회하는 로직이 들어가야 합니다.
console.log("localStrategy에서 id,pw 조회 성공");
done(null, user[0]);
}else{
console.log("비밀번호가 일치하지 않습니다.");
done(null, false, {message : '비밀번호가 일치하지 않습니다.'});
}
}else{
console.log("가입되지 않은 회원입니다.");
done(null, false, {message:'가입되지 않은 회원입니다.'});
}
} catch (error) {
console.log(error);
done(null, false, {message:'가입되지 않은 회원입니다.'});
}
}
)
);
};
반응형
'...' 카테고리의 다른 글
[JS] 프로토타입 이해하기 with 프로토타입 체인 (2) | 2020.12.17 |
---|---|
[DB] 정형, 반정형, 비정형 데이터 (1) | 2020.12.16 |
[DB] 데이터베이스의 기본 개념 (1) | 2020.12.16 |
[JS] 나만의 철학이 담긴 코드란?? (2) | 2020.12.16 |
[Node.js] Express-generator 사용하여 개발환경 만들기 (0) | 2020.12.14 |