Nodejs에서 password를 그냥 텍스트로 저장하게 되면 보안에 취약하다고 한다. (그 이유는 나중에 차차 정리하기로)
그래서 bcrypt 라는 모듈을 적용해보기로 했다.
npm install bcrypt
const bcrypt = require('bcrypt')
암호화
const password = '1234'
const encryptedPassowrd = bcrypt.hashSync(password, 10) // sync
const password = '1234'
bcrypt.hash(password, 10, (err, encryptedPassowrd) => {
// async callback
})
router.route("/add").post((req, res) => {
bcrypt.hash(req.body.password, 10, (err, encryptedPassowrd) => {
// async callback
const one = {
type: req.body.type,
email: req.body.email,
password: encryptedPassowrd,
};
const newUser = new User(one);
newUser
.save()
.then(() => res.json("User added!"))
.catch((err) => res.status(400).json("Error: " + err));
});
});
복호화
const password = '1234'
const encodedPassword = '$2a$10$tUUfk1E0jGr90ntHxl/wE.lzrVvAQfxJ7nRo3RYXi2XqJtlv2h.UW'
const same = bcrypt.compareSync(password, encodedPassword) // sync
const password = '1234'
const encodedPassword = '$2a$10$tUUfk1E0jGr90ntHxl/wE.lzrVvAQfxJ7nRo3RYXi2XqJtlv2h.UW'
bcrypt.compare(password, encodedPassword, (err, same) => {
// async callback
})
복호화 활용
router.route("/").post((req, res) => {
User.findOne({ email: req.body.email }, (err, user) => {
if (!user) {
return res.json({
loginToken: false,
message: "아이디가 일치하지 않습니다.",
});
} else {
bcrypt.compare(req.body.password, user.password, (err, same) => {
// async callback
if (same) {
return res.json({
loginToken: true,
message: "로그인되었습니다!",
});
} else {
return res.json({
loginToken: false,
message: "비밀번호가 일치하지 않습니다.",
});
}
});
}
});
});
나는 react 프레임워크와 nodejs를 함께 사용했는데, 암호화, 복호화 모두 callback 함수가 있는 부분을 활용했다.
참고 사이트 : https://gofnrk.tistory.com/112