serializeUser
passport strategy에서 성공 시 실행되는 done(null, user)
에서 user객체를 전달받아 세션(req.session.passport.user
)에 저장
passport.serializeUser((user, done) => {
return done(null, user)
})
deserializeUser
실제 서버로 들어오는 요청마다 세션정보를 실제DB의 데이터와 비교, 해당 유저 정보가 있으면 done의 두번째 인자를 req.user
에 저장
passport.deserializeUser((user, done) => {
done(null, user)
})
serializeUser에서 done으로 넘겨주는 user가 deserializeUser의 첫번째 인수로 전달되기 때문에 둘의 타입이 항상 일치해야 한다.
프론트에서 /user/login
로 id와 pw을 POST요청으로 넘긴다면, 처음에는 router가 실행된다.
// /router/user.js
router.post('/login', (req, res, next) => {
passport.authenticate('local', (err, user, info) => {
if (err) {
console.error(err)
return next(err)
}
if (info) {
return res.status(401).send(info.reason)
}
return req.login(user, loginError => { // req.login에서 passport/index.js의 passport serializeUser가 실행된다
if (loginError) return next(loginError)
const filteredUser = Object.assign({}, user)
delete filteredUser.password
return res.json(filteredUser)
})
})
})
passport의 local
strategy(전략)이 실행된다.
// /passport/local.js
module.exports = {
passport.use(new LocalStrategy({
usernameField: 'userId',
passwordField: 'password'
}, async (userId, password, done) => {
try {
return done(null, user)
} catch (e) {
...
}
}))
}
local
strategy(전략)에 의해 비밀번호를 비교 후 이상없는 경우 return done(null, user)
를 실행하면, 다시 /router/user.js
의 /login
라우터가 실행되고 req.login
시점에 passport.serializeUser
가 실행된다.
module.exports = () => {
passport.serializeUser((user, done) => { // 서버쪽에 [{ id:3, cookie: 'asdfasdf' }]
return done(null, 'hello')
})
...
그리고 route 하단의 로직이 마지막으로 실행된다.