유저 비밀번호 암호화

기능 분석

<aside> ✏️

bcryptjs

해싱: 비밀번호를 복호화할 수 없는 단방향 해시값으로 변환하여 저장

솔트(salt): 무작위로 생성된 솔트 값을 비밀번호와 함께 해싱하여 동일한 비밀번호라도 항상 다른 해시값을 생성

단방향 암호화: 해싱된 값은 원래의 비밀번호로 복호화할 수 없음

순수 자바스크립트: 순수 자바스크립트로 작성되어 클라이언트(브라우저) 환경에서도 실행될 수 있습니다.

</aside>

기능 구성

backend/controller/user.controlle.js

  1. 회원가입 - DB에 등록된 기존 유저 정보와 중복 체크
  2. 로그인 - DB에 등록된 유저 정보와 일치 체크
  3. 비밀번호 암호화

유저 인증 기능 구현 코드

import User from "../model/user.model.js";
import bcryptjs from "bcryptjs";

export const signup = async (req, res) => {
  try {
    // 구조 분해 할당
    const { fullname, email, password } = req.body;
    const user = await User.findOne({ email });
    if (user) {
      return res.status(400).json({ message: "User already exists" });
    }
    // password hashing
    const hashPassword = await bcryptjs.hash(password, 10);
    const createdUser = new User({
      fullname: fullname,
      email: email,
      password: hashPassword,
    });
    await createdUser.save();
    // 요청 성공, 서버가 새 리소스(User)를 생성
    res.status(201).json({
      message: "User Created successfully",
      user: {
        _id: createdUser._id,
        fullname: createdUser.fullname,
        email: createdUser.email,
      },
    });
  } catch (error) {
    console.log("Error: " + error.message);
    res.status(500).json({ message: "Internal server error" });
  }
};

export const login = async (req, res) => {
  try {
    // req.body에서 email, password 받기
    const { email, password } = req.body;
    // 이메일(DB)로 유저 검색
    const user = await User.findOne({ email });
    // 사용자 입력 패스워드와 DB의 해시된 패스워드 비교
    const isMatch = await bcryptjs.compare(password, user.password);
    if (!user || !isMatch) {
      // Bad Request
      return res.status(400).json({ message: "Invalide username or password" });
    } else {
      res.status(200).json({
        message: "Login successful",
        user: {
          _id: user._id,
          fullname: user.fullname,
          email: user.email,
        },
      });
    }
  } catch (error) {
    console.log("Error: " + error.message);
  }
};