토큰 검사하기

이태규·2022년 1월 5일
0

express

목록 보기
16/28

파일을 첨부할 때에는 req에 파일을 넣지 못해서

upload.single("file")

를 가운데 넣어줬었던 것처럼 token도 req에서 검사할 수 없다.
그래서 가운데 checkToken의 과정을 거쳐야 한다.

const checkToken = require('../config/auth').checkToken;

router.put('/mypage', checkToken, 
async function(req, res, next) 

여기에는 function을 붙여야함

checkToken을 config > auth.js 파일에서 만들어줘야 함.

//파일명 : config/auth.js

// 토큰 생성, 추출, 검증에 필요한 라이브러리
const jwt = require('jsonwebtoken');


여기서 self가 붙은 이유는 securitykey를 사용해야 하는데, this로 접근할 수 없음.
var self = module.exports = {
    securitykey : 'sdma$k5s1dmksadnj48asdaiad#',
    options : {
        algorithm  : 'HS256', //hash 알고리즘, sha256
        expiresIn : '9h',    //토큰만료시간 ex) 9시간
        issuer    : 'corp01' //토큰 발행자 없어도 됨 항목이 있어서 해보는거임 
    },

    //토큰이 전달되면 토큰의 유효성을 검증함.
    
    여기는 function을 안 붙여도 되네
    
    checkToken : async (req, res, next) =>{
        try{
            // 토큰은 header로 첨부해서 보냄
            // console.log("auth.js > checkToken > headers", req.headers.token);
            const token = req.headers.token
            
            // 1. 토큰이 있는가?
            if(!token){
                return res.send({status: 888, result: '유효하지 않은 토큰'})
            }
            // console.log(securitykey)
            // this로 안되는 듯 변수 선언해서 self로 가져온다.
            
            const user = jwt.verify(token, self.securitykey);

발행 시 sign <=> verify 검증 시
디코드

발행 된 토큰, 보안키
이때 오류가 제일 많이 뜸. 여기서 catch로 많이 넘어감

			여기 user.uid는 어디서 나왔냐면 
            token을 만들 때 hash로 만들 때
            const hash = crypto.createHmac('sha256', req.body.uid)
                        .update(req.body.upw).digest('hex');
			
            uid를 같이 넣었음
            
            
            
            if(typeof user.uid === 'undefined'){
                return res.send({status: 888, result: '유효하지 않은 토큰'})
            }
            console.log('토큰에서 추출한 아이디', user.uid)
            // 2. 토큰 decode 추출(톸는과 암호키)
            
            req.body.userid = user.uid
            다음 부분에서는 uid가 안넘어가서 이렇게 설정을 해줘야 넘어감


            console.log("1. auth.js=>",req.body);
            // res.send('성공')
            // 위쪽에서 토큰에 대한 유효성을 모두 pass할 경우 다음으로 넘김
            next()
            send가 아니라 next를 쓰면 다음 걸로 넘어감!!!
            // member.js파일의 /mypage로 전달 불가!!
            // next()가 반드시 필요
        }
        catch(err){
            console.error(err);
            return res.send({status: -1, result: err})
        }

    }
    
}
router.post('/selectlogin', async function(req, res, next) {
    try {
        hashPw = crypto.createHmac('sha256', req.body.id)
            .update(req.body.password).digest('hex');
        const query = {_id : req.body.id, password: hashPw};

        const result = await member.findOne(query);
        console.log(result)
        if(result !== null){
           
            const sessionData = {
                USERID   : result._id, 
                USERNAME : result.name};
                
			//세션에 추가할 값, 보안 키, 옵션
			//jwt.sign({},{},{});
            const token = jwt.sign(sessionData, auth.securityKEY, auth.options);

            // DB에 token이라는 키로 수정함
            // token을 더 보안적으로 만들기
            return res.json({status: 200, result : token});
        }
        return res.json({status: 0});
    } catch (error) {
        console.error(error)
        return res.json({status: -1});
    }
});

스프링에서는 세션에 정보를 추가했음.
같은 서버가 아니기 때문에 세션을 확인할 방법없음.
token(츨입할 수 있는 키)을 발행

세션에 추가할 값, 보안 키, 옵션
jwt.sign({},{},{});

profile
한 걸음씩 나아가자

0개의 댓글