-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat : access 토큰 만료시 refresh 토큰으로 재발급 #26
- access 토큰 만료시 refresh 토큰으로 db의 토큰과 일치하는지 확인후 - 새로운 access 토큰과 refresh 토큰 발급후 db에 refresh 토큰 저장 - auth에서 access 토큰을 발급하면 front에서 다시 헤더에 access토큰 default로 설정
- Loading branch information
1 parent
5e59a01
commit 55955d6
Showing
4 changed files
with
47 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,34 +1,50 @@ | ||
const { User } = require("../models/User"); | ||
const jwt = require("jsonwebtoken"); | ||
|
||
// 인증 처리를 하는곳 | ||
let auth = async (req, res, next) => { | ||
// 클라이언트에서 헤더로 보내준 accesstoken | ||
let accesstoken = req.headers.authorization; | ||
// 클라이언트에 저장되어있는 refreshtoken | ||
let refreshtoken = req.cookies.refreshtoken; | ||
// accesstoken이 있을때 조작된 jwt인지 확인후 미들웨어 종료 | ||
if (accesstoken) { | ||
try { | ||
const userdata = jwt.verify(accesstoken.split(" ")[1], "secretToken"); | ||
req.name = userdata.username; | ||
next(); | ||
} catch (err) {} | ||
} else if (refreshtoken) { | ||
// access 토큰이 만료 됐을때 | ||
try { | ||
// 토큰을 복호화 한후 유저를 찾는다. | ||
const user = await User.findByToken(refreshtoken); | ||
// 유저가 업으면 no | ||
if (!user) return res.json({ isAuth: false, message: "user가 없습니다" }); | ||
// db의 토큰과 client에서 준 refresh토큰을 비교한다. | ||
if (user.token === refreshtoken) { | ||
const [userdata, accesstoken] = await user.generateToken(); | ||
// refresh 토큰의 옵션 | ||
const options = { | ||
httpOnly: true, | ||
sameSite: "None", | ||
secure: true, | ||
// 2주 | ||
maxAge: 14 * 24 * 60 * 60 * 1000, | ||
}; | ||
// access 토큰은 body로 넘겨주고 refresh 토큰은 cookie에 저장한다. | ||
res.cookie("refreshtoken", userdata.token, options).status(200).json({ | ||
isAuth: true, | ||
accesstoken, | ||
name: userdata.name, | ||
}); | ||
} | ||
} catch (err) { | ||
return res.json({ isAuth: false, error: err }); | ||
} | ||
} else { | ||
return res.json({ isAuth: false }); | ||
} | ||
// try { | ||
// // 토큰을 복호화 한후 유저를 찾는다. | ||
// const userdata = await User.findByToken(token); | ||
// // 유저가 업으면 no | ||
// if (!userdata) return res.json({ isAuth: false, error: true }); | ||
// // 같은 유저가 있으면 ok | ||
// // 미들웨어가 끝나고 req에서 사용할 수 있게 데이터를 보내준다. | ||
// req.token = token; | ||
// req.user = userdata; | ||
// next(); | ||
// } catch (err) { | ||
// return res.json({ isAuth: false, error: err }); | ||
// } | ||
}; | ||
|
||
module.exports = { auth }; |