$ npm i passport passport-local passport-kakao bcrypt
......
const dotenv = require("dotenv");
**const passport = require("passport");**
......
const { sequelize } = require("./models");
**const passportConfig = require("./passport");
passportConfig();**
......
**app.use(passport.initialize());
app.use(passport.session());**
app.use('/', pageRouter);
......
passport.initialize() 미들웨어는 request 객체에 passport 설정을 추가하고,
passport.session() 미들웨어는 req.session 객체에 passport 정보를 저장한다.
req.session 객체는 express-session 에서 생성하므로 passport 미들웨어는 express-session 미들웨어를 먼저 연결한 후 뒤에 심는다.
passport 폴더를 만들고, index.js 파일을 생성한다.
const passport = require("passport");
const local = require("./localStrategy");
const kakao = require("./kakaoStrategy");
const User = require("./models/user");
module.exports = () => {
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findone({ where: { id } })
.then(user => done(null, user))
.catch(err => done(err));
});
local();
kakao();
};
serializeUser 는 로그인 시에만 실행되면서, req.session 에 어떤 데이터를 저장할 지 정하는 메서드이다.
매개변수로 user 를 받고 나서 done 함수에 두 번째 인수로 user.id 를 넘기고 있다.
done 함수의 첫 번째 인수는 에러 발생 시 사용되고, 두 번째 인수에는 저장하고 싶은 데이터를 넣는다.
로그인 시 사용자 데이터를 세션에 저장하는데, 사용자 정보를 모두 저장하면 세션의 용량이 커지고 데이터 일관성에 문제가 발생하므로 사용자 아이디만 저장한다.
deserializeUser 는 매 요청 시 실행된다.
passport.session 미들웨어가 이 메서드를 호출하고, serializeUser에서 done 함수의 두 번째 인수로 넣었던 데이터 user.id 가 매개변수가 된다.
그리고 사용자 id 를 받아 데이터베이스에서 사용자 정보를 조회한다.
조회한 정보를 req.user 에 저장하므로 req.user 를 통해 로그인한 사용자의 정보를 가져올 수 있다.
정리하면 serializeUser 는 사용자 정보 객체를 세션에 id 로 저장하는 것이고, deserializeUser 는 세션에 저장한 아이디를 이용해 사용자 정보 객체를 불러오는 것이다.