[Node.js] password 암호화

페리·2021년 8월 30일

Nodejs에서 password를 그냥 텍스트로 저장하게 되면 보안에 취약하다고 한다. (그 이유는 나중에 차차 정리하기로)
그래서 bcrypt 라는 모듈을 적용해보기로 했다.

모듈 설치

npm install bcrypt

모듈 import

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

0개의 댓글