회원정보를 create, reading할 수 있다면 이제 update를 해야하는데..어떤 방식으로 해야할까?
지금 나의 코드는 비밀번호를 bcrypt를 통해 암호화해 db collection에 저장한 후 bcrypt.compare을 통해 비교해 검증하는 방식이다.
여기까지는 좋은데, 수정을 할 때 mogoose의 어떤 메소드를 사용해야 할까?
우선 bcrypt는 단방향 hash기 때문에 collection의 암호화된 정보들을 그대로 가져와 해석한 후 db자체를 update하는건 어려워 보인다.
방법을 하나씩 생각해보자.
쉽고, 기능 구현에 문제는 없겠지만 민감한 개인정보를 검증 과정없이 쉽게 삭제해도 되는걸까 싶다.
대부분의 update과정에서 이 메소드를 사용하는 것 처럼 보인다. 그러면 어떻게 수행할 수 있을까?
1. 기존의 비밀번호와 새로운 비밀번호, 2개의 값을 input
2. 기존 비밀번호를 collection비밀번호와 비교 후 일치하면 새로운 비밀번호를 collection
안에 update해준다.
그런데 이 과정에서 update메소드가 삭제 후 save되는 건지 아니면 교체되는 건지 잘 모르겠으니 mongoose문서를 찾아보자.
const doc = await Character.findOneAndUpdate(filter, update,
{new: true
});
fileter()을 통해 비교 후, update()로 수정, 그리고 new: true를 통해 새로운 값을 return한다.
그러면 이를 바탕으로 현재 비밀번호와 비교 후 일치한다면 비밀번호를 업데이트하는 내용을 구성해보자.
router.post("/mypage", (req, res) => {
const userId = req.user.id;
const currentPw = req.body.currentPw;
const newPw = req.body.newPw;
const newPwr = req.body.newPwr;
우선 mypage.ejs내의 form action을 /mypage로 정해주고 method는 post로 지정해준 뒤, 위와 같이 선언해준다. 내 db내의 objectId와 내가 입력한 값들을 선언해주었다.
bcrypt
.compare(currentPw, req.user.pw)
.then((result) => {
if (!result) {
console.log("현재 비밀번호가 일치하지 않습니다.");
res.redirect("/mypage");
return;
}
if (newPw !== newPwr) {
console.log("비밀번호 확인 실패");
res.redirect("/mypage");
return;
}
현재 저장되어 있는 user.pw와 입력한 currentPw를 비교, 맞다면 새로운 비밀번호와 반복된 새 비밀번호를 비교한 후 다음으로 진행
bcrypt.hash(newPw, 10, (err, hashedPw) => {
if (err) {
console.error("비밀번호 암호화 실패:", err);
res.redirect("/mypage");
return;
}
새 비밀번호 역시 해싱해준다.
schema
.findOneAndUpdate({ id: userId }, { pw: hashedPw })
.then(() => {
console.log("비밀번호 변경 완료");
res.redirect("/login");
})
.catch((error) => {
console.error("비밀번호 변경 실패:", error);
res.redirect("/mypage");
});
});
})
.catch((error) => {
console.error("비밀번호 확인 중 오류 발생:", error);
res.redirect("/mypage");
});
});
이제 collection내에서 타겟하는 objectId를 찾아 해싱된 새 비밀번호로 수정해준다. redirect를 통해 발생하는 오류는 나중에 수정해주자.