로그인을 하지않은 사용자도 이용할 수 있는 페이지 또는 관리자만 이용할 수 있는 페이지 등을 체크하기 위해 Auth(인증) 기능을 만들어야한다.

client에서 토큰이 인코드 되어있는 상태로, 이를 서버에서 복호화 하면 userId가 나온다. 서버에서는 userId를 보고 이 페이지를 이용할 수 있는 권한이 있는지를 계속 체크한다.
요약하자면,
- cookie에 저장된 token을 server에서 가져와서 복호화
- 복호화 하면 userId가 나옴
- userId를 이용해서 DB의 userCollection에서 유저를 찾은 후, 쿠키에서 받아온 token이 유저도 가지고 있는지 확인
이때 없으면 Auth False, 쿠키가 일치하면 Auth True가 됨
⭐ Auth.js // 인증 처리를 하는 곳
const { User }= require("../models/User")
let auth = (req, res, next)=> {
// client 쿠키에서 토큰을 가져온다.
let token= req.cookies.x_auth;
// 토큰을 복호화 후 유저를 찾는다.
User.findByToken(token, (err,user)=>{
if(err) throw err;
if(!user) return res.json({ isAuth: false, error: true})
req.token= token;
req.user= user;
next();
})
// 유저가 있으면 인증 ok
// 유저가 없으면 인증 no
}
module.exports = { auth };
⭐ User.js
userSchema.statics.findByToken= function(token, cb){
var user= this;
//토큰 복호화
jwt.verify(token,'secretToken', function(err, decoded){
//유저 아이디를 이용하여 유저를 찾은 후
// 클라이언트에서 가져온 token과 DB에 보관된 TOKEN이 일치하는지 확인
user.findOne({"_id": decoded, "token": token})
.then((user)=>{
cb(null, user);
})
.catch((err)=>{
return cb(err);
})
})
}
⭐ index.js
app.get('/api/users/logout', auth, (req, res) => {
// DB에서 id로 user를 찾고, token을 초기화 시켜준다.
User.findOneAndUpdate({ _id: req.user._id }, { token: "" })
.then(() => {
console.log(req.user._id);
res.status(200).send({success: true})
})
.catch((err)=>{
res.json({ success: false, err });
})
})
로그인 후 MONGO DB 보면 토큰이 있는 것을 볼 수 있다.

로그아웃 후 MONGO DB 보면 토큰이 초기화된 것을 볼 수 있다.
