회원정보 CRUD

d_wwan·2023년 7월 9일
0

node.js

목록 보기
1/1

Data Update

회원정보를 create, reading할 수 있다면 이제 update를 해야하는데..어떤 방식으로 해야할까?

지금 나의 코드는 비밀번호를 bcrypt를 통해 암호화해 db collection에 저장한 후 bcrypt.compare을 통해 비교해 검증하는 방식이다.

여기까지는 좋은데, 수정을 할 때 mogoose의 어떤 메소드를 사용해야 할까?

우선 bcrypt는 단방향 hash기 때문에 collection의 암호화된 정보들을 그대로 가져와 해석한 후 db자체를 update하는건 어려워 보인다.

방법을 하나씩 생각해보자.

1. 단순하게 기존 비밀번호를 collection에서 삭제 후 새 비밀번호를 save

쉽고, 기능 구현에 문제는 없겠지만 민감한 개인정보를 검증 과정없이 쉽게 삭제해도 되는걸까 싶다.

2. findOneAndUpdate메소드 사용

대부분의 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를 통해 발생하는 오류는 나중에 수정해주자.

profile
세상 모든 사람들을 이해할 수 있는 날이 오기를

0개의 댓글