middleware로 router 검사하기
로그인을 하거나 게시글 작성 등.. 사용자가 무언가를 하려고 할 때, 로그인이 된 상태에서만 접근할 수 있는 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를 검사하고 넘어갈 수 있다.