Skip to content

Latest commit

ย 

History

History
126 lines (85 loc) ยท 4.25 KB

2019-08-09-nodejs-passport.md

File metadata and controls

126 lines (85 loc) ยท 4.25 KB

2019๋…„ 8์›” 9์ผ

Passport ๋ชจ๋“ˆ์„ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ


passport.initialize(), passport.session() ํ†ตํ•ด passport๋ฅผ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋“ฑ๋ก์‹œํ‚จ๋‹ค

express-session

  • req.session ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • session์„ ์„ค์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

passport.initialize()

  • req ๊ฐ์ฒด์— passport ์„ค์ •์„ ์‹ฌ๋Š”๋‹ค.

passport.session()

  • req.session ๊ฐ์ฒด์— passport ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

  • ์ฃผ์˜) express-session์— ์˜ํ•ด req.session๊ฐ€ ๊ฐ์ฒด ์ƒ์„ฑ๋˜์–ด์•ผ passport ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋”ฐ๋ผ์„œ passport ๋ฏธ๋“ค์›จ์–ด๋Š” ๋ฐ˜๋“œ์‹œ express-session ๋’ค์— ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

serializeUser()

  • sessionId๋ฅผ ๋งŒ๋“œ๋Š” ์—ญํ• 

  • ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์‹คํ–‰๋œ๋‹ค.

  • req.session ๊ฐ์ฒด์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ์ง€ ์„ ํƒํ•œ๋‹ค. โ€” ์„ธ์…˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํŽ˜์ด์ง€ ์ด๋™์‹œ์—๋„ ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์œ ์ง€ ๋œ๋‹ค.

  • user ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰์ด ์ปค์ง€๊ณ  ์ผ๊ด€์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž id๋งŒ ์ €์žฅํ•œ๋‹ค.

    • ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ตœ์†Œํ•œ์œผ๋กœ ์จ์•ผํ•˜๋ฏ€๋กœ ์ตœ์†Œ ์ •๋ณด๋งŒ ์ €์žฅํ•œ๋‹ค. (user๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ user.id ๋งŒ ์ €์žฅ) -- ์ด๊ฒŒ sessionId ๊ฐ€ ๋œ๋‹ค.

deserializeUser()

  • sessionId๋ฅผ ์ด์šฉํ•ด์„œ user ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• 

  • ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ๋งค ์š”์ฒญ(request)๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.

  • ๋งค ํ˜ธ์ถœ๋งˆ๋‹ค db๋ฅผ ์ฝ์–ด sessionId์— ํ•ด๋‹นํ•˜๋Š”user ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ๏ฟฝ์˜จ๋‹ค.

  • req.user์— user ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋”ฐ๋ผ์„œ req.user๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

Passport ๋กœ๊ทธ์ธ์—์„œ๋Š” ์•„๋ž˜ ๋‘ ๊ฐ€์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

serializeUser: ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ์ฒด๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•œ๋‹ค.

deserializeUser: ์„ธ์…˜์— ์ €์žฅํ•œ ์•„์ด๋””๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

์ „์ฒด ํ๋ฆ„

๋กœ๊ทธ์ธ ์ด์ „

  1. ๋กœ๊ทธ์ธ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค.
  2. passport.authenticate ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
  3. ๋กœ๊ทธ์ธ ์ „๋žต ์ˆ˜ํ–‰
  4. ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ์ฒด์™€ ํ•จ๊ป˜ req.login ํ˜ธ์ถœ
  5. req.login ๋ฉ”์„œ๋“œ๊ฐ€ passport.serializeUser ํ˜ธ์ถœ
  6. req.session์— ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ โ€” ๋ณดํ†ต id๋งŒ ์ €์žฅ
  7. ๋กœ๊ทธ์ธ ์™„๋ฃŒ

๋กœ๊ทธ์ธ ์ดํ›„

  1. ๋ชจ๋“  ์š”์ฒญ์— passport.session() ๋ฏธ๋“ค์›จ์–ด๊ฐ€ passport.deserializeUser ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
  2. req.session์— ์ €์žฅ๋œ ์•„์ด๋””๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์กฐํšŒ
  3. ์กฐํšŒ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ req.user์— ์ €์žฅ
  4. ๋ผ์šฐํ„ฐ์—์„œ req.user ๊ฐ์ฒด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋กœ๊ทธ์ธ ํ•œ ์œ ์ € ์ธ์ฆ

isAuthenticated()

  • isAuthenticated ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ๊ทธ์ธ ํŒ๋‹จ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ๋œ ์œ ์ €์˜ ๊ฒฝ์šฐ true๋ฅผ ๋กœ๊ทธ์ธ ๋˜์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋Š” false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ๋กœ๊ทธ์ธํ•œ ์œ ์ €๋Š” next()๋ฅผ ํ˜ธ์ถœ ํ•ด ๋‹ค์Œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์œ ์ €๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ์ผœ ๋กœ๊ทธ์ธ์„ ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค.
exports.isLoggedIn = (req, res, next) => {
    if (req.isAuthenticated()) {
        return next();
    } else {
        req.flash('error_msg', '๋กœ๊ทธ์ธ ํ›„ ์ด์šฉํ•ด์ฃผ์„ธ์š”.');
        res.redirect('/auth/signin');
    }
};
  • ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ํ•œ ์œ ์ €๋งŒ ๊ฒŒ์‹œ๊ธ€์„ ํŽธ์ง‘ํ•˜๋„๋ก ํ•˜๋Š” ๋กœ์ง์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
router.get('/edit/:id', isLoggedIn, asyncMiddleware(async (req, res) => {
    const article = await Article.findOne({
        _id: req.params.id
    });
    if (article) {
        res.render('articles/edit', {
            article: article
        });
    }
}));

๋กœ๊ทธ์•„์›ƒ

  • ๋กœ๊ทธ์•„์›ƒ์€ ์•„๋ž˜์™€ ๊ฐ™์ด req.logout() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋กœ๊ทธ์•„์›ƒ์€ ๋กœ๊ทธ์ธ ๋œ ์œ ์ €๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ isLoggedIn๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
// ๋กœ๊ทธ ์•„์›ƒ
router.get('/logout', isLoggedIn, (req, res) => {
    req.logout();
    req.flash('success_msg', 'You are logged out');
    res.redirect('/auth/signin');
});

References