노래하듯 이야기하고, 춤추듯 정복하라.

[Node.js API 개발] 로그인 상태 유지 & 자동 로그인 본문

프로그래밍/node.js

[Node.js API 개발] 로그인 상태 유지 & 자동 로그인

hyeoke 2019. 5. 27. 18:54

# 로그인 상태 유지 & 자동 로그인 구현

 

## 필요한 모듈

// npm install jsonwebtoken
const jwt = require('jsonwebtoken')

// npm install uuid
const uuidv4 = require('uuid/v4')

 

## Front(세션 정보)에서 받아와야 할 정보

* uuid => 사용자가 로그인 시 사용자 DB 업데이트와 함께 프런트에 전달한다.

const { user_id, uuid } = req.body

// uuid => 사용자가 로그인 시 사용자 DB 업데이트와 함께 프런트에 전달한다.

 

## router 구현

1. 로그인 - routes/auth.js

const uuidv4 = require('uuid/v4');
const jwt = require('jsonwebtoken');

router.post('/signIn', async (req, res, next) => {
    try {
    	const { email, password } = req.body;
        
        if (사용자가 유효할 시) {
        	const user = await User.findOne({ where: { id: user_id } });
            
        	// 사용자DB Update - uuid
            const uuidNew = await uuidv4();
            await User.update({ uuid: uuidNew }, { where: { id: user_id } });
            
            // 토큰 발행
            const token = await jwt.sign({
            	user_id,
                email: user.email,
            }, process.env.JWT_SECRET, {
            	expiresIn: 15m, // 15분
                issuer: 'TL',
            });
            
            let payLoad = {
            	user_id,
                uuid: uuidNew,
                token
            }
            
            res.status(200).json({
            	resultCode: 200,
                message: "로그인 성공",
                payLoad,
            });
        } else {
        	// 사용자 없음
        }
    } catch (err) {
    	// 서버 에러
    }
});

 

2. 토큰 재발행

- 5분마다 토큰이 만료되기 때문에

=> Front에서 419(토큰 만료) response를 받았을 때 자동으로 토큰 재발행 요청을 한다.

router.post('/token', async (req, res, next) => {
    try {   
        const { user_id, uuid } = req.body;

        // 데이터 유효성 체크
        if (!user_id) { response(res, 400, "로그인 필요"); return; }
        if (!uuid) { response(res, 400, "사용자의 세션정보 없음"); return; }

        // 유저 확인
        if (await exUser(user_id)) {
            const user = await User.findOne({ where: { id: user_id } });

            // uuid 정보가 일치하면, 토큰 업데이트
            if (user.uuid == uuid) {
                const uuidNew = await uuidv4();

                // 사용자 uuid 값 업데이트
                await User.update({ uuid: uuidNew }, { where: { id: user_id } })

                // 새 토큰 발행
                const token = await jwt.sign({
                    user_id: user.id, 
                    email: user.email,
                }, process.env.JWT_SECRET,{
                    expiresIn: '15m',
                    issuer: 'tlcompany',
                });

                let payLoad = {
                    user_id,
                    uuid: uuidNew,
                    token,
                }

                response(res, 200, "토큰 재발행 및 uuid 업데이트", payLoad);
            } else {
                response(res, 401, "권한 없음");
            }
            
        } else {
            response(res, 404, "사용자 없음");
        }
    } catch (err) {
        console.log(err);
        response(res, 500, "서버 에러");
    }
    
});
Comments