npm i bcrypt
해싱이란 저장할 데이터를 임의의 문자열로 변형하는 것을 말한다. 만약 내 DB가 해킹당했다고 가정하면 해싱 없이 저장한 유저 정보가 그대로 노출되게 되어 보안상 큰 문제를 야기할수 있다. 어쩌면 전화받으러 나간 사이에 실수로 열어두고간 DB 유저 정보를 누가 볼지도 모르는 일이다.
그럼 방지하기 위해 해싱에 대해 극 미니멀리즘으로 알아보자.
import bcrypt from "bcrypt";
import mongoose from "mongoose";
//define shape of model
const userSchema = new mongoose.Schema({
email: { type: String, required: true, unique: true },
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
name: { type: String, required: true },
location: String,
});
userSchema.pre("save", async function () {
this.password = await bcrypt.hash(this.password, 5);
});
const User = mongoose.model("User", userSchema);
export default User;
this.password = await bcrypt.hash(this.password, 5)
password를 5번 hashing한다. 'this'
는 윗줄에 정의된 model data를 의미한다.
이렇게 저장된 password는 db에서 아래 사진과 같이 확인된다.
그럼 hashing된 유저 password를 어떻게 검증하는가?
export const postLogin = async (req, res) => {
const { username, password } = req.body;
const pageTitle = "Login";
const user = await User.findOne({ username });
if (!user) {
return res.status(400).render("login", {
pageTitle,
errorMessage: "An account with this username does not exists.",
});
}
// check if password correct
const ok = await bcrypt.compare(password, user.password);
if (!ok) {
return res.status(400).render("login", {
pageTitle,
errorMessage: "Wrong password",
});
}
req.session.loggedIn = true;
req.session.user = user;
return res.redirect("/");
};
bcrypt.compare
를 사용하면 해싱된 패스워드 입력값과 저장된 값을 비교할 수 있다.