- 로그인시 토큰 발급(전체 코드)
exports.Login = async (req, res) => {
const { user_id, user_password } = req.body;
try {
const data = await userSelect(user_id);
if (!data?.user_id) {
return res.send("id없음");
}
if (data.user_pw !== user_password) {
return res.send("비밀번호 틀림");
}
const accessToken = jwt.sign(
{
user_id: data.user_id,
mail: "dddd",
nick: "zero",
},
process.env.ACCESS_TOKEN_KEY,
{
expiresIn: "5s",
}
);
const refreshToken = jwt.sign(
{
user_id: data.user_id,
},
process.env.REFRESH_TOKEN_KEY,
{
expiresIn: "50s",
}
);
await userRefresh(user_id, refreshToken);
req.session.access_token = accessToken;
req.session.refresh_token = refreshToken;
res.send({ access_token: accessToken, refresh_token: refreshToken });
} catch (error) {
console.log("login in userController", error);
}
};
- 엑세스 토큰 밟급하는곳
const accessToken = jwt.sign(
{
user_id: data.user_id,
mail: "dddd",
nick: "zero",
},
process.env.ACCESS_TOKEN_KEY,
{
expiresIn: "5s",
}
);
- Refresh Token 발급하는 곳
const refreshToken = jwt.sign(
{
user_id: data.user_id,
},
process.env.REFRESH_TOKEN_KEY,
{
expiresIn: "50s",
}
);
- 기존 엑세스 토큰보다 만료시간을 길게한다.
- 이는 엑세스토큰이 만료돼도 refresh token으로 다시 발급하기 위해서이다.
- req.session에 토큰을 저장하는 코드
await userRefresh(user_id, refreshToken);
req.session.access_token = accessToken;
req.session.refresh_token = refreshToken;
res.send({ access_token: accessToken, refresh_token: refreshToken });
- userRefresh 함수
exports.userRefresh = async (userId, refresh) => {
try {
await mysql.query("UPDATE users SET refresh=? WHERE user_id=?", [
refresh,
userId,
]);
} catch (error) {
console.log("userRefresh in userModel", error);
}
};
- mysql에서 유저의 refresh 를 최신 토큰으로 업데이트 해준다.
- 이 때, 만약 나중에 다른 브라우저(b)로 로그인할 경우 a와 b는 다른 refresh token을 가지고 있지만, mysql의 refresh 데이터는 나중에 로그인한 브라우저 b의 refresh값이 들어간다.
- 그러므로 a에서 로그인하게되면 중복로그인이 뜬다.
- 각 세션에 토큰을 저장한다.
- 토큰 verify 하는 곳
잘 봤습니다. 좋은 글 감사합니다.