<aside> ✏️
bcryptjs
해싱: 비밀번호를 복호화할 수 없는 단방향 해시값으로 변환하여 저장
솔트(salt): 무작위로 생성된 솔트 값을 비밀번호와 함께 해싱하여 동일한 비밀번호라도 항상 다른 해시값을 생성
단방향 암호화: 해싱된 값은 원래의 비밀번호로 복호화할 수 없음
순수 자바스크립트: 순수 자바스크립트로 작성되어 클라이언트(브라우저) 환경에서도 실행될 수 있습니다.
</aside>
backend/controller/user.controlle.js
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);
}
};