Node.js 서버 개발(5)

권규리·2024년 2월 28일

🧱Node.js

목록 보기
5/15

1. Auth

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

client에서 토큰이 인코드 되어있는 상태로, 이를 서버에서 복호화 하면 userId가 나온다. 서버에서는 userId를 보고 이 페이지를 이용할 수 있는 권한이 있는지를 계속 체크한다.

요약하자면,

  1. cookie에 저장된 token을 server에서 가져와서 복호화
  2. 복호화 하면 userId가 나옴
  3. userId를 이용해서 DB의 userCollection에서 유저를 찾은 후, 쿠키에서 받아온 token이 유저도 가지고 있는지 확인

이때 없으면 Auth False, 쿠키가 일치하면 Auth True가 됨


2. Auth route 생성

⭐ 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);
        })
    })
}

3. logout route 생성

⭐ 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 });
      })
})

4. MONGO DB 확인

로그인 후 MONGO DB 보면 토큰이 있는 것을 볼 수 있다.

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

profile
기록장 📝

0개의 댓글