채널톡 아이콘

인프런 커뮤니티 질문&답변

최지성님의 프로필 이미지

작성한 질문수 3

React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드

Ch4-6. 관리자 계정 로그아웃, 삭제

로그아웃 시 토큰 검증 오류 응답

해결된 질문

작성

·

54

0

현재 Ch4-6. 관리자 계정 로그아웃, 삭제 강의를 듣고 있는 학생입니다! 다름이 아니라 로그아웃 코드에서 토큰 검증 오류 시에 res.send()를 안하는 이유가 있나요?!

토큰 검증 중 오류가 발생하게 된다면, isLoggedIn 상태는 true이고 토큰은 지워진 상태가 되는건데 그러면 로그인도 못하고 로그아웃도 못하는 상태인거 같아서요!

궁금해서 여쭤봅니다!!

답변 2

0

닭강정님의 프로필 이미지
닭강정
지식공유자

안녕하세요. 남겨주신 토큰 검증 오류 시 로그아웃 처리 방식에 대한 질문에 답변 드리겠습니다.

1. 로그아웃 로직 설명

로그아웃 과정은 다음과 같습니다. 프론트엔드에서 백엔드로 로그아웃 요청을 보내면, 먼저 해당 관리자가 실제 관리자 계정인지 토큰을 검증한 후, user.isLoggedIn 값을 false로 업데이트합니다.
그 후, res.clearCookie()를 사용하여 클라이언트의 쿠키에서 토큰을 삭제하는 방식으로 로그아웃이 처리됩니다.

2. 처음 코드 작성 의도

제가 처음 코드를 작성할 때는, 토큰 검증이 실패했다는 것은 해당 사용자가 유효한 관리자가 아니라는 의미이므로, isLoggedIn 상태를 변경할 필요가 없다고 판단했습니다.
하지만 보안상 로그아웃 처리는 반드시 필요하므로, 토큰 검증 여부와 관계없이 res.clearCookie()를 통해 클라이언트의 쿠키 토큰을 삭제하고 로그아웃이 되도록 했습니다.

3. 질문해주신 내용에 대한 피드백

다만, 질문자님께서 지적해주신 대로, 토큰 검증이 실패했을 때 isLoggedIn 값을 변경하지 않으면, DB 상에서는 여전히 로그인 상태(isLoggedIn = true)로 남아있을 수 있습니다.
이 상태에서 다시 로그인을 시도하면, 이미 로그아웃되었지만 DB에서는 여전히 로그인 중으로 판단되므로, 로그인도 하지 못하는 상태가 될 수 있습니다.
이 부분을 고려하면, 토큰 검증이 실패하더라도 isLoggedIn = false로 변경하는 것이 더 적절한 방식입니다.

4. 코드 수정 및 사과 말씀

제가 처음 코드 작성 시 이 부분을 충분히 고려하지 못했던 것 같습니다. 말씀해주신 덕분에 더 나은 방식으로 개선할 수 있었고, 이에 대해 감사드립니다. 아래는 토큰 검증이 실패했더라도 강제 로그아웃되는 코드입니다. 참고해 주세요.

router.post("/logout", async (req, res) => {
  try {
    const token = req.cookies.token;

    if (!token) {
      return res.status(400).json({ message: "이미 로그아웃된 상태입니다." });
    }

    let user = null;

    try {
      const decoded = jwt.verify(token, process.env.JWT_SECRET);
      user = await User.findById(decoded.userId);
    } catch (error) {
      console.log("토큰 검증 오류: ", error.message);
    }

    if (user) {
      user.isLoggedIn = false;
      await user.save();
    }

    res.clearCookie("token", {
      httpOnly: true,
      secure: false,
      sameSite: "strict",
    });

    if (!user) {
      return res.status(401).json({ message: "유효하지 않은 토큰입니다. 강제 로그아웃되었습니다." });
    }

    res.json({ message: "로그아웃되었습니다." });
  } catch (error) {
    console.log("로그아웃 오류: ", error.message);
    res.status(500).json({ message: "서버 오류가 발생했습니다." });
  }
});
최지성님의 프로필 이미지
최지성
질문자

빠른 답변과 참고 코드를 작성해 주셔서 감사합니다! 다음 강의를 들으면서 열심히 공부해보도록 하겠습니다!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 최지성님께서 문의하신 로그아웃 시 토큰 검증 오류와 관련한 질문에 대해 안내 드리겠습니다.

주요 내용 요약

로그아웃 과정에서 토큰 검증 오류가 발생할 경우, 현재 코드에서는 별다른 응답(res.send() 또는 res.json())을 보내지 않고 있습니다. 이는 사용자가 로그아웃을 시도했을 때, 이미 서버의 논리상 토큰이 유효하지 않다면, 해당 상태를 사용자 쪽에서 인식하지 못할 수 있다는 단점이 있습니다.

해결 방법

  1. 토큰 검증 오류 시 적절한 응답: 토큰 검증에 실패한 경우, 사용자에게 정확한 피드백을 제공하는 것이 중요합니다. 예를 들어, res.status(401).json({ message: "유효하지 않은 토큰입니다. 다시 로그인해 주세요." });와 같이 응답을 보내 사용자가 문제가 무엇인지 인지할 수 있도록 해야 합니다.

  2. 세션 상태 관리: 만약 로그아웃 중 오류가 발생할 경우, 사용자 세션이나 상태(isLoggedIn)를 적절히 정리하지 않으면, 다음 로그인 시 문제가 발생할 수 있습니다. 따라서 토큰 검증 실패 시에도 isLoggedIn 상태를 false로 설정한 후 사용자로 하여금 정상적인 로그아웃이 이루어진 것처럼 처리하는 것이 바람직합니다.

참고 가능한 관련 질문들:

아래 링크들을 통해 비슷한 문제 상황 및 해결 방법에 대한 논의를 보실 수 있습니다.
- req.cookies.token == undefined 현상
- logout 기능에서 req.cookies.token == undefined가 되는 문제

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.