상황
사용자가 로그인요청을 하지 않은 상황에서도 프론트엔드에서 주기적으로 보내는 get요청마다 세션을 생성하고있습니다.
- 메인페이지에서 브라우저를 나갔다가 들어오면 세션데이터가 없는 빈 세션을 계속해서 생성합니다.
- 새로고침을 하거나 해도 데이터를 불러오는 get요청을 서버로 보내고있습니다.
- 모든 요청에 세션을 생성하지 않고 사용자가 로그인 요청시에만 세션을 생성하려고 합니다.
새로고침 전 redis 데이터
새로고침 후 redis 데이터
새로고침 여러번 이후 redis 데이터
수정이 필요한 부분
- 클라이언트에서 로그인 요청시에만 사용자의 세션을 redis에 저장하도록 수정 하려고 합니다. 혹은 다른방법이 있다면 여쭤보고싶습니다.
로컬에서 로그인(post) 요청시 세션이 정상적으로 redis에 저장
users.controller.js
- 핸드폰 번호, 비밀번호 입력후 로그인 요청합니다.
- 입력된 핸드폰 번호가 DB에 존재하는지 확인 후 DB에 존재하면 사용자의 정보를 가진 객체를 가져옵니다.
- 가져온 데이터에서 세션에 저장할 정보(userId, phoneNumber, nickname, isLogined)들을 세션에 할당합니다
- 할당한 데이터를 store에 저장합니다.
login = async (req, res, next) => {
try {
const { phoneNumber, password, userLongitude, userLatitude, position, } = req.body;
if (!phoneNumber || !password) {
return res
.status(412)
.json({ errorMessage: "데이터의 형식이 일치하지 않습니다." });
}
const loginUser = await this.userService.loginUser(phoneNumber);
const userId = loginUser.userId;
if (!loginUser || loginUser.password !== password) {
return res
.status(412)
.json({ errorMessage: "닉네임 또는 패스워드를 확인해주세요." });
}
await Users.update(
{
userLongitude: userLongitude,
userLatitude: userLatitude,
position: position,
},
{
where: { userId }
}
);
const accessToken = await this.userService.createAccessToken(loginUser);
const refreshToken = await this.userService.createRefreshToken();
await this.userService.saveToken(loginUser, refreshToken);
res.cookie("accesstoken", `Bearer ${accessToken}`);
res.cookie("refreshtoken", `${refreshToken}`);
//유저데이터를 필요한 데이터만 할당
const sessionData = {
userId: loginUser.userId,
phoneNumber: loginUser.phoneNumber,
nickname: loginUser.nickname,
isLogined: true
};
//세션에 유저의 데이터를 저장
req.session.sessionData = sessionData
//세션저장
await req.session.save()
return res.status(200).json({ accessToken, refreshToken });
} catch (error) {
console.error(error);
return res.status(400).json({ errorMessage: "로그인에 실패하였습니다." });
}
};
app.js 세션옵션 설정
- redis를 세션 스토어로 설정하고 세션을 저장하도록 옵션을 설정하였습니다.
app.use(cors({ origin: "https://front-end-fork-m30hc9mpj-vegatality.vercel.app", credentials: true }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
store: new RedisStore({ client: redisClient }),
secret: process.env.COOKIE_SECRET,
saveUninitialized: true,
resave: false,
name: 'connect.sid',
cookie: {
secure: false, // if true: only transmit cookie over https, in prod, always activate this
httpOnly: true, // if true: prevents client side JS from reading the cookie
maxAge: 1000 * 120 * 30, // session max age in milliseconds
sameSite: 'lax',
},
}));
의심가는 부분
- 세션의 옵션을 설정한 미들웨어의 위치가 이상한건지 잘모르겠습니다 (위치도 바꿨는데 잘 안됐습니다.)
- 로그인한 사용자인지 아닌지를 판단하는 미들웨어를 새로추가 하여 진행해야 하는지도 생각은 해봤는데 시도는 못했습니다.