Node.js

[Node.js] Auth 기능 만들기

Puft 2024. 2. 16. 22:56

https://youtu.be/OGVsnbEbSLM?si=Wvx3Btu8ptwH0WYH

 

본 포스팅은 John Ahn님의 유튜브 강의를 참고하였습니다.

 

 

 

웹 서비스에서는 로그인 여부에 따라

 

접속할 수 있는 페이지가 있고,

 

회원만 사용할 수 있는 페이지가 있습니다.

 

Auth 기능은 라우팅을 통해서

 

이것을 구분해주는 역할을 합니다.

 

 

Auth의 기본적인 개념은

 

 

Client에서는 쿠키에 담겨져 있는 토큰을,

 

Server에서는 DB에 담겨져 있는 토큰을 서로 비교하는 것입니다.

 

 

먼저 쿠키에 있는 토큰을 가져와서 복호화하고 토큰을 비교해야합니다.

 

이를 위해서는 먼저 get요청을 해야합니다.

 

app.get('/api/users/auth',auth, (req,res)=>{
   res.status(200).json({
    _id: req.user._id,
    isAdmin : req.user.role === 0 ? false : true,
    //role == 0 이면 일반유저 아니면 관리자
    isAuth : true,
    email : req.user.email,
    name : req.user.name,
    lastname: req.user.lastname,
    role: req.user.role,
    image: req.user.image

   })
})

 

server.js의 코드입니다.

 

auth로 라우팅이 되어있고,

 

파라미터로 auth가 중간에 들어와있는데

 

이것은 미들웨어입니다.

 

리퀘스트를 받고 콜백함수를 실행하기 전에 중간에서 auth함수를 실행하는 역할을 수행합니다.

 

 

 

다음은 auth함수를 구현해야 합니다.

 

 

폴더를 하나 만들어주고 auth.js 파일을 만들어줍니다.

 

const{User} = require('../models/User');
const auth = async (req, res, next) => {
    try {
        const token = req.cookies.x_auth;

        const user = await User.findByToken(token);

        if (!user) {
            return res.json({ isAuth: false, error: true });
        }

        req.token = token;
        req.user = user;
        next();
    } catch (error) {
        console.error(error);
        res.status(500).send("Internal Server Error");
    }
};

module.exports = {auth};

 

auth.js의 코드입니다.

 

여기서는 auth함수를 구현합니다.

const token = req.cookies.x_auth;

 

먼저 쿠키에 있는 토큰을 가져옵니다

 

.다음은 User.js에서 findByToken 함수를 구현합니다.

userSchema.statics.findByToken = function (token) {
    const User = this;

    return new Promise((resolve, reject) => {
        jwt.verify(token, 'secretToken', (err, decoded) => {
            if (err) {
                reject(err);
            } else {
                User.findOne({ "_id": decoded, "token": token })
                    .then(user => resolve(user))
                    .catch(error => reject(error));
            }
        });
    });
};

 

여기서는 JWT에서 지원하는 verify함수를 이용해서 토큰을 복호화합니다.

 

복호화된 토큰은 findOne함수를 이용해서 DB에 보관된 토큰과 일치하는지 확인합니다.

 

req.token = token;
req.user = user;

 

다음은 토큰과 user를 변수에 넣어줌으로써

 

sever.js에서 모델에 있는 데이터들을 직접 접근할 수 있습니다.

 

next();

 

그리고 파라미터로 next()가 들어가는데 이는 auth 미들웨어 함수가 실행이 끝나면

 

콜백함수로 넘어갈 수 있게 사용한다고 합니다.

 

app.get('/api/users/auth',auth, (req,res)=>{
   res.status(200).json({
    _id: req.user._id,
    isAdmin : req.user.role === 0 ? false : true,
    //role == 0 이면 일반유저 아니면 관리자
    isAuth : true,
    email : req.user.email,
    name : req.user.name,
    lastname: req.user.lastname,
    role: req.user.role,
    image: req.user.image

   })
})

 

위에서 본 get함수입니다.

 

토큰 감정에 성공하면

 

위에 있는 데이터들을 json 형태로 반환할 것입니다.

 

 

 

오늘은 Auth 기능에 대해서 공부해 보았습니다.

 

지금까지 공부했던 내용중에 가장 어려운 부분이었지 않았나 싶습니다.

 

하지만 개념과 쓰임새만 이해하면 코드를 참고해서

 

충분히 활용가능할 것 같습니다

 

감사합니다!