accessToken의 문제점
accessToken을 새로 생성해도 전에 생성했던 accessToken으로 이용이 가능해진다.
이렇게 되면 하나의 토큰을 탈취하면 탈취한 토큰으로 계속 요청이 가능해진다.
refreshToken
위와 같은 문제점을 보완하기 위해서 사용하게 된다.
jwt를 이용해서 발급 가능 하며, 주로 accessToken의 유효시간은 짧게 하고, refrestToken의 유효시간은 길게 해준다.
그래서 accessToken의 유효시간이 다 지나면 refreshToken을 이용해서 새로운 accessToken을 발급해준다.
| accessToken | refrestToken |
|---|---|
| Access Token은 리소스에 접근하기 위해서 사용되는 토큰 | Refresh Token은 기존에 클라이언트가 가지고 있던 Access Token이 만료되었을 때 새로 발급하기 위해 사용되는 토큰 |
token 발급되는 순서
RefreshToken 발급하는 방법
let refreshTokens = [];
app.post("/login", (req, res) => {
const username = req.body.username;
const user = { username };
// jwt를 이용해서 Token 생성하기 payload + secret
const accessToken = jwt.sign(user, secretKey, { expiresIn: "30s" });
const refreshToken = jwt.sign(user, refreshSecretKey, { expiresIn: "1d" });
// 현재 db연결을 안 해서 배열에 담아둔다.
refreshTokens.push(refreshToken);
res.cookie("refershToken", refreshToken, {
httpOnly: true,
maxAge: 24 * 60 * 60 * 1000,
});
res.json({ accessToken });
});
login이 성공했으면 cookie에 refreshToken이 담기게 된다.

accessToken을 이용해 유효기간이 30초인지 확인을 해준다. 만약 유효기간이 지났는데 데이터를 받아오려고 하면 Forbidden 에러가 나온다.
accessToken의 유효기간이 만료되었으면, refreshToken을 이용해서 accessToken을 생성해준다.
4-1. cookie를 받아오는 방법은 cookie-parser 모듈을 이용해야한다.
const cookieParser = require("cookie-parser");
app.use(cookieParser());4-2. refreshToken을 이용해 accessToken을 다시 가져오도록 하는 경로와 함수를 만들자.
app.get("/refresh", (req, res) => {
const cookies = req.cookies;
if (!cookies?.refershToken) return res.sendStatus(403);
const refreshToken = cookies.refershToken;
if (!refreshToken.includes(refreshToken)) {
return res.sendStatus(403);
}
jwt.verify(refreshToken, refreshSecretKey, (err, user) => {
if (err) return res.sendStatus(403);
const accessToken = jwt.sign({ username: user.username }, secretKey, {
expiresIn: "30s",
});
res.json({ accessToken });
});
