기록을 남기는 연습을 시작해보고자 이슈 블로깅을 작성해봅니다.
이 프로젝트에서 사용되는 기술은 NodeJS. MongoDB. ES6. Express, HTML5, CSS3, Pug 입니다.
유튜브 클론코딩(nomadcoders)을 예습하는 중 소셜로그인을 한 뒤 루트페이지로 리다이렉트 했을 때 사용자 정보가 반영되지 않는 문제가 발생했습니다. 이 과정에서 소셜로그인 후 세션을 저장하는 데 시간이 걸리고 그 과정에서 비동기처리가 필요하다는 것을 알게 되었습니다.
express-session
의 saveUninitialized: false
설정에 따라 현재 단계의 코드에서는 로그인하지 않으면 쿠키를 초기화하지 않기 때문에 브라우저와 서버 모두 쿠키를 따로 저장하지 않았습니다. (세션에 대한 정보는 존재합니다.)// server.js
// ...
app.use(
session({
secret: process.env.COOKIE_SECRET,
resave: false,
saveUninitialized: false, // 해당 옵션
store: MongoStore.create({ mongoUrl: process.env.DB_URL }),
}),
);
// ...
saveUninitialized
Forces a session that is “uninitialized” to be saved to the store. A session is uninitialized when it is new but not modified. Choosing
false
is useful for implementing login sessions, reducing server storage usage, or complying with laws that require permission before setting a cookie. Choosingfalse
will also help with race conditions where a client makes multiple parallel requests without a session.The default value is
true
, but using the default has been deprecated, as the default will change in the future. Please research into this setting and choose what is appropriate to your use-case.Note if you are using Session in conjunction with PassportJS, Passport will add an empty Passport object to the session for use after a user is authenticated, which will be treated as a modification to the session, causing it to be saved. This has been fixed in PassportJS 0.3.0
이 문제를 해결하기 위해 니꼬쌤의 피드백에 따라 finishGithubLogin
함수에서 아래와 같이 await req.session.save()
를 사용하여 세션 정보를 저장한 후 리다이렉트를 하도록 수정했습니다.
// userController.js
// ...
let user = await User.findOne({ email: emailObj.email });
if (!user) {
user = await User.create({
// ...
});
}
req.session.loggedIn = true;
req.session.user = user;
await req.session.save(); // 해당 부분
return res.redirect('/');
// ...
간단하게 저 코드 한 줄을 추가함으로써 문제를 해결할 수 있었습니다.
문제의 원인은 세션 정보가 저장되기 전에 리다이렉트가 발생했기 때문이었습니다. 이를 해결하기 위해 await req.session.save()
를 사용하여 세션 정보를 저장한 후 리다이렉트를 하도록 코드를 수정했습니다. 결과적으로 사용자 정보가 정상적으로 반영되어 페이지에 표시되었습니다.