node.js

middleware로 router 검사하기

Heoky 2022. 1. 18. 16:27

로그인을 하거나 게시글 작성 등.. 사용자가 무언가를 하려고 할 때, 로그인이 된 상태에서만 접근할 수 있는 router가 있고,
로그인을 하지 않은 상태에서 접근할 수 있는 router가 있다.

따라서 midlleware를 하나 만들어 router를 검사해주는 것이 좋다. 각각의 router마다 이 기능을 넣기에는 코드가 중복이
되므로 routes/middleware.js를 따로 만들어 분리하고 불러다 사용하는 것이 좋다.

// routes/middleware.js

exports.isLoggedIn = (req, res, next) => {
  if (req.isAuthenticated()) {
    next(); // 비어있으면 다음 미들웨어로 간다
  } else {
    res.status(401).send('로그인이 필요합니다.');
  }
};

exports.isNotLoggedIn = (req, res, next) => {
  if (!req.isAuthenticated()) {
    next(); // 비어있으면 다음 미들웨어로 간다
  } else {
    res.status(401).send('로그인하지 않은 사용자만 접근이 가능합니다.');
  }
};

req.user를 통해 검사도 가능하지만, passport에서 isAuthenticated라는 것을 제공한다. 이 것이 true이면 로그인이 된 상태이다.
로그인이 된 상태라면 next()를 통해 다음 미들웨어로 넘어가고, 로그인이 된 상태가 아닐 시 "로그인이 필요하다"는 메세지를 전달한다.
로그인이 되지 않은 상태를 알리는 것은 반대로 isAuthenticated가 false이면 다음 미들웨어로 넘어간다. 반대로 로그인이 된 상태라면
"로그인하지 않은 사용자만 접근이 가능"하다 알린다.


이제 미들웨를 만들었으니 미들웨어를 장착해보자. 아래의 코드를 보고 예시를 들어 설명하겠다.

// POST /user/login, 로그인
router.post('/login', isNotLoggedIn, (req, res, next) => {
	...
}

login 요청에 대한 router는 로그인 할때 사용하는데 로그인은 로그인을 하지 않은 사용자가 접근할 수 있기 떄문에 isNotLoggedIn을
장착해준다.

// POST /user/logout
router.post('/logout', isLoggedIn, (req, res) => {
  req.logout();
  req.session.destroy();
  res.send('logout ok');
});

반대로 로그아웃 같은 경우 로그인을 한 사용자가 접근할 수 있는 기능이기 떄문에 isLoggedIn을 장착해준다.


이렇게 무언가 router가 동작할 때 미들웨어를 통해 router를 검사하고 넘어갈 수 있다.