강의

멘토링

커뮤니티

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

robot님의 프로필 이미지
robot

작성한 질문수

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

Ch6-6. (프론트엔드) 관리자 페이지에서 문의글 상태변경, 삭제 (2부)

관리자 자동 로그아웃 문의드립니다.

해결된 질문

작성

·

23

0

관리자 계정이 시간이 지나면 자동으로 로그아웃이 안되어서 매번
isLoggedIn false로 바꿔주고 있는데


강의에서 24시간 설정했는데

24시간 이후 자동로그인이 안되는 것 같아서 문의드립니다.

감사합니다.

 

답변 1

0

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

안녕하세요. 늦게 답변을 달아드려서 죄송합니다.

 

Q. 로그인 시 isLoggedIn이 true로 바뀌고, 토큰 만료(24시간) 후 다시 관리자 페이지에 접속하면 자동으로 isLoggedIn이 false로 바뀌게 하고 싶습니다. 하지만 현재 그렇게 되지 않습니다. 어떻게 해결할 수 있을까요?

A. 챕터 6-6까지 진행된 코드에서는 JWT 토큰 만료는 클라이언트 측 인증만 무효화할 뿐,
MongoDB에 저장된 isLoggedIn 필드는 자동으로 변경되지 않습니다.

  1. 로그인 시 isLoggedIn = true 로 설정됨

  2. JWT는 expiresIn: "24h" 설정으로 인해 24시간 후 자동 만료됨

  3. 그러나 백엔드나 DB에는 “토큰 만료됨”이라는 이벤트가 발생하지 않기 때문에
    isLoggedIn 필드를 false로 되돌릴 코드가 실행되지 않음

결국 DB는 여전히 사용자가 로그인 중(true)인 상태로 남게 됩니다.

 

해결 방법으로는 모든 관리자 페이지 접근 전에 토큰을 검증하는 미들웨어를 추가하고,
토큰이 만료된 경우 해당 사용자의 isLoggedIn을 자동으로 false로 업데이트합니다.

백엔드 폴더에 middleware/verifyToken.js 를 생성하고 코드를 작성합니다.

// middleware/verifyToken.js
const jwt = require("jsonwebtoken");
const User = require("../models/User");

const verifyToken = async (req, res, next) => {
  const token = req.cookies.token;
  if (!token) {
    return res.status(401).json({ message: "토큰이 없습니다." });
  }

  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded;
    next();
  } catch (error) {
    if (error.name === "TokenExpiredError") {
      // 만료된 토큰에서 사용자 정보 추출
      const decoded = jwt.decode(token);
      if (decoded?.userId) {
        await User.findByIdAndUpdate(decoded.userId, { isLoggedIn: false });
      }
    }

    return res.status(401).json({ message: "토큰이 만료되었습니다. 다시 로그인해주세요." });
  }
};

module.exports = verifyToken;

만들어진 미들웨어를 실제로 활용하는 방법의 예시입니다.

const verifyToken = require("../middleware/verifyToken");

router.get("/admin/dashboard", verifyToken, async (req, res) => {
  res.json({ message: "관리자 페이지 접속 성공" });
});
  1. 사용자가 로그인하면 서버는 JWT 토큰을 발급하고 isLoggedIn을 true로 설정합니다.

  2. 사용자는 이 토큰을 가지고 관리자 페이지 등에 접근할 때마다 요청 헤더 또는 쿠키에 포함시켜 서버로 전송합니다.

  3. 미들웨어가 매 요청마다 토큰을 검증합니다.

    • 토큰이 유효하면 요청을 정상적으로 통과시킵니다.

    • 토큰이 만료되었다면 (TokenExpiredError),

      • 해당 토큰에서 userId를 추출하고

      • DB에서 해당 사용자의 isLoggedInfalse로 자동 업데이트합니다.

  4. 이후 서버는 401 Unauthorized 응답을 보내어 “세션이 만료됨”을 알립니다.

  5. 클라이언트는 이 응답을 받아 로그인 페이지로 리다이렉트하거나 다시 로그인하도록 처리합니다.

추가 질문이 있다면 언제든지 문의 부탁드립니다. 감사합니다!

robot님의 프로필 이미지
robot

작성한 질문수

질문하기