로그인 마지막 시리즈이다
Access Token으로만 인증을 하다보면 보안이 취약하기 때문에 Refresh Token도 같이 발행해준다는 이야기를 지난 2편에서 했다. 이번에는 어떤 방식으로 흘러가는지 정리하고 코드로 구현해보려한다.

users/userService.js
redis 모듈을 이용해 서버에 저장한다.if(user && currentPwd == user.password) {
const token = sign(user);
const refreshToken = refresh();
const redisClient = redis.createClient(process.env.REDIS_PORT);
await redisClient.connect();
redisClient.set(toString(user.id), refreshToken);
res.cookie('token', {token: token, refreshToken: refreshToken}, {httpOnly : true})
res.status(StatusCodes.OK).json(result)
}
const { StatusCodes } = require('http-status-codes');
const {sign, verify, refreshVerify} = require('./jwt-utils');
const jwt = require('jsonwebtoken');
const excRefresh = async (req,res) => {
const accessToken = req.headers.authorization;
const refreshToken = req.headers.refresh;
if(accessToken && refreshToken){
accessResult = verify(accessToken);
const user = accessResult
refreshResult = await refreshVerify(refreshToken, user.id);
//access 만료시
if(!accessResult.ok) {
if(!refreshResult.ok){ // refresh 만료시
res.status(StatusCodes.UNAUTHORIZED).json({
message : "로그인 다시"
})
} else { // refresh 유효
//access token 새로 발급
const newToken = sign(user);
res.cookie('token', {token: newToken, refreshToken: refreshToken}, {httpOnly : true});
res.status(StatusCodes.OK).json({message : "새로운 토큰 발급 완료"});
}
} else {
//access not expired
res.status(StatusCodes.BAD_REQUEST).json({message : "access Token이 만료되지 않았습니다."})
}
} else {
res.status(StatusCodes.BAD_REQUEST).json({
message : "No Access Token and Refresh Token"
})
}
}
module.exports = excRefresh;
app.get('/refresh', refresh);
새로운 요청하는 방식으로 작성하고 postman에서 요청해 잘 작동하는지 확인했는데 실제로는 어떻게 작동되는지 알아보아야 한다.
set-cookie에 분리되어있지 않아 확인하기가 어려웠다. cookie-parser을 이용해보려 했는데 아직 에러가 나서 재시도 해보아야겠다.참조 : https://velog.io/@kshired/Express에서-JWT로-인증시스템-구현하기-Access-Token과-Refresh-Token