๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/Node.js MongoDB

[Node.js / MongoDB] ํšŒ์›์ธ์ฆ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

by Connecting-the-dots 2022. 3. 14.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

๐Ÿ’œ ๋กœ๊ทธ์ธ ์„ฑ๊ณต

๐Ÿ’œ ๋กœ๊ทธ์ธ ์‹คํŒจ

  • ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ๊ทธ ์‚ฌ๋žŒ์˜ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ DB ์— ์žˆ๋Š” ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
  • ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ ์ผ์น˜ํ•œ๋‹ค๋ฉด, ์„ธ์…˜์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๊ณ  ์„ฑ๊ณตํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.
  • ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ ํ•ด๋‹นํ•˜๋Š” ์•„์ด๋””๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์‹คํŒจํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.
    (/fail ๊ฒฝ๋กœ์— ๋ณ„๋„์˜ EJS ํŒŒ์ผ์ด๋‚˜ HTML ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋‘์ง€๋Š” ์•Š์•˜๋‹ค.)

๐Ÿ’œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ & ์•„์ด๋”” ๋น„๋ฒˆ ๊ฒ€์‚ฌํ•˜๊ธฐ

๐Ÿค ์ค€๋น„ํ•˜๊ธฐ

  • ํ„ฐ๋ฏธ๋„์— npm install passport passport-local express-session ์„ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธ ๋ฐ ์„ธ์…˜ ์ƒ์„ฑ์„ ๋„์™€์ค„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 3๊ฐœ(๋กœ๊ทธ์ธ, ๋กœ๊ทธ์ธ ๊ฒ€์ฆ, ์„ธ์…˜ ์ƒ์„ฑ)๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
  • ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ•์— ๋”ฐ๋ผ JavaScript ํŒŒ์ผ ์ƒ๋‹จ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
const passport = require('passport');
const localStrategy = require('passport-local').Strategy; // ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ Strategy ๋ผ๊ณ  ์ง€์นญํ•œ๋‹ค.
const session = require('express-session');

app.use(session({secret : '๋น„๋ฐ€์ฝ”๋“œ', resave : true, saveUninitialized : false}));
app.use(passport.initialize());
app.use(passport.session());
  • app.use() ํ•จ์ˆ˜๋Š” ๋ฏธ๋“ค์›จ์–ด(์š”์ฒญ๊ณผ ์‘๋‹ต์‚ฌ์ด์— ํŠน์ •ํ•œ ๊ฒƒ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์ฝ”๋“œ)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์œ„์˜ ์ฝ”๋“œ ๋‚ด์šฉ ์ค‘ passport.initialize() ๋‚˜ passport.session() ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ์š”์ฒญ๊ณผ ์‘๋‹ต ์ค‘๊ฐ„์— ์‹คํ–‰๋  ์˜ˆ์ •์ธ ๋ฏธ๋“ค์›จ์–ด์— ํ•ด๋‹นํ•œ๋‹ค.

๐Ÿค ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ณ  ๋ผ์šฐํŒ…ํ•˜๊ธฐ

  • ๊ธ€์“ฐ๊ธฐ ํŽ˜์ด์ง€์™€ ์œ ์‚ฌํ•œ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์šฉ EJS ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , /login ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์™”์„ ๋•Œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋ณด์ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ ์™ธ input ์˜ ์†์„ฑ์ธ name ๊ณผ action ์˜ ๊ฒฝ๋กœ ๋“ฑ์„ ์กฐ๊ธˆ ์ˆ˜์ •ํ•˜์˜€๋‹ค.
<h4 class="container mt-5"><strong>๋กœ๊ทธ์ธ</strong></h4>
<div class="container mt-4">
  <form action="/login" method="POST">
    <div class="form-group my-4">
      <label class="mb-2">์•„์ด๋””</label>
      <input type="text" class="form-control" name="id">
    </div>
    <div class="form-group my-4">
      <label class="mb-2">๋น„๋ฐ€๋ฒˆํ˜ธ</label>
      <input type="password" class="form-control" name="pw">
    </div>
    <button type="submit" class="btn btn-danger fw-bold">Submit</button>
  </form>
</div>
  • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ด์ œ /login ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ์ด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ด๋„๋ก JavaScript ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
app.get('/login', function(req, res){
    res.render('login.ejs');
})

 

๐Ÿ“Œ ํ…Œ์ŠคํŠธ์šฉ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ƒ์„ฑํ•˜๊ธฐ

  • ์ด์ œ ๋กœ๊ทธ์ธํ•  ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„์€ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด DB ์— login collection ์„ ์ƒ์„ฑํ•ด์„œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.


๐Ÿค ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ์ธ ์‹œ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์‚ฌํ•˜๊ธฐ

  • ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•œ ํ›„ Submit ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ POST ์š”์ฒญ์„ ํ•˜๋ฉด, ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ DB ์˜ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ JavaScript ํŒŒ์ผ์— ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
app.post('/login', passport.authenticate('local', {
    failureRedirect : '/fail' // login ์„ ์‹คํŒจํ•˜๋ฉด /fail ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•œ๋‹ค.
}), function(req, res){
    res.redirect('/'); // login ์„ ์„ฑ๊ณตํ•˜๋ฉด / ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•œ๋‹ค.
})
  • ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ /login ๊ฒฝ๋กœ๋กœ POST ์š”์ฒญ์„ ํ•˜๋ฉด, ์ค‘๊ฐ„์— ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ DB ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์ด ๊ณผ์ •์—์„œ ์‹คํŒจํ•˜๋ฉด /fail ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๊ณ  ์„ฑ๊ณตํ•˜๋ฉด / ๊ฒฝ๋กœ(ํ™ˆ)์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
    • post() ํ•จ์ˆ˜์˜ ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ passport ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ(์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ DB ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ)๋ฅผ ๋„ฃ์–ด์ฃผ์–ด, ์‘๋‹ตํ•˜๊ธฐ ์ „์— local ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆํ•˜๋„๋ก ํ–ˆ๋‹ค.
    • failuerRedirect : '/fail' ๋ถ€๋ถ„์€ ๋กœ๊ทธ์ธ ์ธ์ฆ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ /fail ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค.

๐Ÿ’œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ DB ์˜ ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•˜๊ณ  ์„ธ์…˜ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ

๐Ÿค ์•„์ด๋”” ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ DB ์˜ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๋น„๊ตํ•˜๊ธฐ

  • ๋Œ€๋žต ์ˆ˜๋„์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ inputId, inputPw ๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.
    • DB ์—์„œ { id : inputId } ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
    • ๋งŒ์•ฝ ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด inputPw ์™€ ๋ฐ์ดํ„ฐ์˜ pw ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์ผ๋ จ์˜ ๊ณผ์ •์ด ์„ฑ๊ณตํ•œ๋‹ค๋ฉด return done(null, result) ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ์ˆ˜๋„์ฝ”๋“œ๋ฅผ JavaScript ํŒŒ์ผ์— ์ฝ”๋“œ๋กœ ๋‹ด์•„๋‚ด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
passport.use(new localStrategy({
    usernameField : 'id', // name ์ด id ์ธ input ์ด usernameField ์ด๋‹ค.
    passwordField : 'pw', // name ์ด pw ์ธ input ์ด passwordField ์ด๋‹ค.
    session : true, // session ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
    passReqToCallback : false, // ์•„์ด๋””,๋น„๋ฐ€๋ฒˆํ˜ธ ์™ธ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•  ๊ฒฝ์šฐ true ๋กœ ์ž‘์„ฑ, ์ฝœ๋ฐฑํ•จ์ˆ˜์— req ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
}, function(inputId, inputPw, done){

    //console.log(inputId, inputPw); // ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ

    // db.collection ์ค‘ login ์—์„œ id ๊ฐ€ inputId ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์œผ๋ฉด
    db.collection('login').findOne({id : inputId}, function(err, result){
        if (err) return done(err);

        // result ์— ์•„๋ฌด๋Ÿฐ ๊ฐ’์ด ๋‹ด๊ฒจ์žˆ์ง€ ์•Š๋‹ค๋ฉด(DB ์— ์•„์ด๋””๊ฐ€ ์—†์œผ๋ฉด)
        if (!result) return done(null, false, {message : '์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•„์ด๋””์ž…๋‹ˆ๋‹ค.'});

        // result ์— ๊ฐ’์ด ๋‹ด๊ฒจ ์žˆ๋‹ค๋ฉด(DB ์— ์•„์ด๋””๊ฐ€ ์žˆ๋‹ค๋ฉด)
        // inputPw ์™€ result ์— ๋‹ด๊ฒจ์žˆ๋Š” pw ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
        if (inputPw == result.pw) {
            return done(null, result);
        } else {
            return done(null, false, {message : '๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.'})
        }
    })
}));
  • ๋‹ค๋งŒ, ์œ„์˜ ์ฝ”๋“œ๋Š” ์ „๋ฐ˜์ ์ธ ์ดํ•ด๋ฅผ ์œ„ํ•ด DB ์— ์ €์žฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋“  ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋“  ์•”ํ˜ธํ™”๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋น„๊ตํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๋ณด์•ˆ๋ถ€๋ถ„์„ ์กฐ๊ธˆ ๋” ๊ณต๋ถ€ํ•œ ๋‹ค์Œ ๋ณด์™„์ด ํ•„์š”ํ•˜๋‹ค.

๐Ÿค ์„ธ์…˜์„ ๋งŒ๋“  ํ›„, ์„ธ์…˜ ์•„์ด๋””๋ฅผ ๋ฐœ๊ธ‰ํ•˜์—ฌ ์ฟ ํ‚ค๋กœ ๋ณด๋‚ด์ฃผ๊ธฐ

  • ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ DB ์˜ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•œ๋‹ค๋ฉด ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœ๊ธ‰ํ•œ ํ›„ ์ฟ ํ‚ค๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
// id ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ธ์…˜ ์ €์žฅ ๋ฐ ์ฟ ํ‚ค ๋ฐœํ–‰ (๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ)
passport.serializeUser(function(user, done){
    done(null, user.id);
});
  • serializeUser() ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž์˜ id ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์„ธ์…˜ ๋ฐ์ดํ„ฐ์˜ ์•„์ด๋””๋ฅผ ์ฟ ํ‚ค๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ธ๋‹ค.

 

๐Ÿ“Œ ์ƒ์„ฑ๋œ ์ฟ ํ‚ค ํ™•์ธํ•˜๊ธฐ

  • ์ •์ƒ์ ์ธ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ, ์ฟ ํ‚ค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์„ GIF ๋กœ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.

 

  • localhost:8080 ์œผ๋กœ ์ ‘์† ํ›„ ๊ฐœ๋ฐœ์ž๋„๊ตฌ(F12 ํ˜น์€ ๋งˆ์šฐ์Šค์šฐํด๋ฆญ-๊ฒ€์‚ฌ)๋กœ ๋“ค์–ด๊ฐ€์„œ Application ํƒญ์„ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์ขŒ์ธก Cookies ๋ถ€๋ถ„์˜ http://localhost:8080 ์„ ํด๋ฆญํ•˜๋ฉด ์ €์žฅ๋œ ์ฟ ํ‚ค๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์œ„์™€ ๊ฐ™์ด ๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ session ์ด๋ผ๊ณ  ์ ํžŒ ์ฟ ํ‚ค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

๐Ÿ’œ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘์† ๊ฐ€๋Šฅํ•œ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

๐Ÿค ๋งˆ์ดํŽ˜์ด์ง€ ๋งŒ๋“ค๊ณ  ๋ผ์šฐํŒ…ํ•˜๊ธฐ

  <h4 class="container mt-5"><strong>๋งˆ์ดํŽ˜์ด์ง€</strong></h4>
  <div class="container mt-4">
  </div>
  • ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘์† ๊ฐ€๋Šฅํ•œ ๋งˆ์ดํŽ˜์ด์ง€๋ฅผ EJS ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
app.get('/mypage', function(req, res){
    res.render('mypage.ejs');
})
  • ์ด์ œ JavaScript ํŒŒ์ผ์—์„œ /mypage ๊ฒฝ๋กœ์— ์ ‘์†ํ•˜๋Š” ๊ฒฝ์šฐ ๋งˆ์ดํŽ˜์ด์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋ณด์ด๋„๋ก ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿค ๋กœ๊ทธ์ธํ•œ ์‚ฌ๋žŒ๋งŒ ๋งˆ์ดํŽ˜์ด์ง€ ๋ณด์—ฌ์ฃผ๊ธฐ

  • ์œ„์˜ ๊ณผ์ •๊นŒ์ง€๋งŒ ์ง„ํ–‰ํ•˜๋ฉด ๋ˆ„๊ตฌ๋“ ์ง€ ๋งˆ์ดํŽ˜์ด์ง€์— ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ์ด ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๋ฏธ๋“ค์›จ์–ด๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ /mypage ์— ์ ‘์†์„ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ ์‘๋‹ตํ•˜๊ธฐ ์ „์— ๋กœ๊ทธ์ธ์„ ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
app.get('/mypage', doLogin, function(req, res){
    // console.log(req.user)
    res.render('mypage.ejs', {user : req.user});
})

function doLogin(req, res, next){
    // ๋กœ๊ทธ์ธ์„ ํ•œ ์ƒํƒœ๋ผ๋ฉด
    if (req.user){
        next(); // ํ†ต๊ณผํ•œ๋‹ค.
    } else {
        res.send("๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.");
    }
}
  • ๊ทธ๋ž˜์„œ ์ด์ „์— ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์กฐ๊ธˆ ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.
  • doLogin ์ด๋ผ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋งŒ๋“ค์–ด์„œ, ๋กœ๊ทธ์ธ์„ ํ•œ ์ƒํƒœ๋ผ๋ฉด ํ†ต๊ณผํ•˜์—ฌ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๊ณ  ๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด '๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.' ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿค req.user ๋ถ„์„ํ•˜๊ธฐ

  • req.user ๋Š” ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ DB ์ƒ ์ •๋ณด(์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์‚ฌ์šฉ์ž๋ช… ๋“ฑ)๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ ๊ทธ๋ƒฅ์€ ์ถœ๋ ฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ธ์…˜ ์•„์ด๋””๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ฐพ๋Š” deserializeUser() ํ•จ์ˆ˜์˜ ๋ถ€๋ถ„ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ํ•„์š”ํ•˜๋‹ค. 
// ํŠน์ • ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ์„ DB ์—์„œ ๊ฒ€์ƒ‰ (๋งˆ์ดํŽ˜์ด์ง€ ์ ‘์† ์‹œ)
passport.deserializeUser(function(userId, done){
    // DB ์—์„œ user.id ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๊ฒ€์ƒ‰ํ•œ ํ›„ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ฐพ์•„์„œ ์ „์†กํ•œ๋‹ค.
    db.collection('login').findOne({id : userId}, function(err, result){
        done(null, result);
    })
});
  • deserializeUser() ํ•จ์ˆ˜๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด DB ์—์„œ { id : userId } ์ธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐพ์•„์„œ ๊ฒฐ๊ณผ๋ฅผ result ๋กœ ๋ฐ›๊ฒŒ ๋œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ์ด result ์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋“ค์€ req.user ๋กœ ์ „๋‹ฌ์ด ๋˜๋ฏ€๋กœ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ DB ์ƒ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๐Ÿค ๋งˆ์ด ํŽ˜์ด์ง€์— ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ๋ธŒ๋ผ์šฐ์ €์— ๋ณด์—ฌ์ฃผ๊ธฐ

app.get('/mypage', doLogin, function(req, res){
    // console.log(req.user)
    res.render('mypage.ejs', {user : req.user});
})
  • ์ด์ „์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ DB ์ƒ์˜ ์ •๋ณด๋ฅผ req.user ์— ๋‹ด์•„๋‘์—ˆ์œผ๋‹ˆ, /mypage  ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•˜์—ฌ ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ user ๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด์•„ ์ „์†กํ•ด์ค€๋‹ค.
  <h4 class="container mt-5"><strong><%= user.id %> ๋‹˜์˜ ํŽ˜์ด์ง€</strong></h4>
  <div class="container mt-4">
  </div>
  • ์ด์ œ๋Š” ํ•ด๋‹นํ•˜๋Š” EJS ํŒŒ์ผ์—์„œ user ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ EJS ๋ฌธ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
728x90
๋ฐ˜์‘ํ˜•