파일을 첨부할 때에는 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({},{},{});