공부하는 히욤이

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 #13 Auth 기능 만들기 본문

Programming/React+Node

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 #13 Auth 기능 만들기

히욤이 2021. 8. 15. 13:08

auth route 만들기

  • 로그인 여부나, 해당 권한이 있는지 등을 체크하기 위해서

 

클라이언트에서는 토큰을 쿠키에 넣어주고 서버에서는 User DB에 토큰을 저장함

server에서의 토큰과 client의 토큰이 일치하는지 계속 확인함

user._id + 'secretToken' = token을 만듦

=> 

'secretToken' => user._id 시크릿토큰을 디코드하면 user_id가 나옴

 

 

 

[index.js]

app.get('/api/users/auth', auth, (req, res) => {
    // 미들웨어를 통과해 여기까지 왔다는 얘기는 Authentication이 true라는 말
    res.status(200).json({
        _id : req.user._id,
        isAdmin : req.user.role === 0? false : true,
        isAuth : true,
        email : req.user.email,
        name : req.user.name,
        lastname : req.user.lastname,
        role : req.user.role,
        image : req.user.image
    })
})

 

[auth.js]

const { User } = require("../models/User");

let auth = (req, res, next) => {
    // 인증 처리를 하는 곳

    // 클라이언트 쿠키에서 토큰을 가져온다.
    let token = req.cookies.x_auth;

    // 토큰을 복호화 한 후, 유저를 찾는다.
    User.findByToken(token, (err, user) => {
        if (err) {
            throw err;
        }

        // user가 없으면
        if (!user) {
            return res.json({
                isAuth : false,
                error : true
            })
        }

        // user가 있으면
        req.token = token;
        req.user = user;
        next();
    });
}

module.exports = { auth };

auth.js는 인증처리를 해주는 곳

클라이언트 쿠키에서 토큰을 가져오고 토큰을 복호화 한 후, 유저를 찾는다.

 

'x_auth'에 저장했기 때문에 req.cookies.z_auth로 토큰을 가져온다.

findByToken은 User.js에서 만든 자체적인 함수이다.

next()를 안해주면 다음으로 넘어가지 않고 계속 여기에 머물러 있는다.

 

 

[User.js]

userSchema.methods.findByToken = function(token, callback){
    var user = this;
    
    // token을 decode 한다.
    jwt.verify(token, "secretToken", function(err, decoded) {
        // decoded 된 것은 유저아이디
        // 유저아이디를 이용해서 유저를 찾은 다음에
        // 클라이언트에서 가져온 token과 DB에 보관된 토큰이 일치하는지 확인
        user.findOne({
            "_id" : decoded,
            "token" : token
        }, function(err, user) {
            if (err) {
                return callback(err);
            } else {
                return callback(null, user);
            }
        })
    });
}

verify는 jwt에서 제공하는 함수인데 decode 하는 함수이다.