Hashing....3$02j42kmf#d$$nw

404·2022년 1월 13일
0

Database

목록 보기
6/9

내 DB의 유저 정보를 보호하기

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를 사용하면 해싱된 패스워드 입력값과 저장된 값을 비교할 수 있다.

profile
T.T

0개의 댓글