ėīė ęģĩëķėė ėīėīė
export const postLogin = (req, res) => {
// ėëĩ
// userė ëí ė ëģīëĨž ėļė
ė ėķę°íëĪ
req.session.loggedIn = true;
req.session.user = user;
return res.redirect("/");
};
ėīė req.sessionė ėķę°í loggedInęģž user ę°ė ëŠĻë ėŧĻíļëĄĪëŽėė ėŽėĐ ę°ëĨíëĪ.
ëĪėėžëĄ userėęē ëĄę·ļėļė ėąęģĩíėė ėëĶŽęļ° ėíī ėļė
ė ęļ°ë°íī íëĄ íļėëė ëīėĐėī íėëëëĄ í
íëĶŋė ėė íīėž íëĪ.
req.session.loggedInėī falseėž ë base.pug íėžėė Joinęģž Login ë§íŽëĨž ëģīėŽėĢžęģ , trueėž ë Logoutęģž profile ë§íŽëĨž ëģīėŽėĢžëëĄ íīėž íëĪ.
ėīëĨž ėíīė í
íëĶŋėė req.session.loggedIn ę°ė ėŽėĐí ė ėėīėž íëĪ.
pugė expressë res.renderëĨž ėīėĐíė§ ėęģ ë express middlewareëĨž ë§ëĪėī res.localsëĨž ėīėĐíī í
íëĶŋė ëģėëĨž ė ėė ėžëĄ ëģīëž ė ėëĪ.
ėī ė ė ėīėĐíī locals objectė ëĄę·ļėļí userëĨž ėķę°í í ėīëĨž í
íëĶŋė ę°ė ļė íëĄ íļėëė íėí ė ėëĪ.
ëĻžė , src íīëė middlewares.js íėžė ë§ë í localsMiddlewareëĨž ë§ëĪėī export íëĪ.
server.js íīëėė localsMiddlewareę° session middleware ëĪė ėĪëëĄ ėėąíëĪ.
ę·ļëėžë§ localsMiddlewareėė ëĄę·ļėļí userė ëí ė ëģīę° ėë sessionė ė ę·ží ė ėęļ° ëëŽļėīëĪ.
// middlewares.js
export const localsMiddleware = (req, res, next) => {
res.locals.siteName = "Wetube";
res.locals.loggedIn = Boolean(req.session.loggedIn);
res.locals.loggedInUser = req.ssesion.user;
next();
};
// server.js
import session from "express-session";
import { localsMiddleware } from "./middlewares";
app.use(session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
}));
app.use(localsMiddleware);
res.localsė loggedIn ę°ė ęļ°ë°ėžëĄ base.pug íėžė navëĨž ėė íëĪ.
userę° ëĄę·ļėļ ėíę° ėëëžëĐī loggedInUser(ėĶ, req.session.user)ë undefined ę°ė ę°ė§ ęēėīëĪ.
ë°ëžė íëĄí ëĐëīë userę° ëĄę·ļėļ ėíėž ęē―ė°ėë§ ëģīėīëëĄ íëĪ.
nav
ul
if loggedIn
li
a(href="/logout") Log out
li
a(href="/my-profile") #{loggedInUser.name}ė Profile
else
li
a(href="/join") Join
a(href="/login") Login
ėīė ëĄę·ļėļ/ëĄę·ļ ėė ėíė ë°ëž ëĐëīę° ëŽëžė§ë ęēė íėļí ė ėëĪ.
ðĄ postLogin ėŧĻíļëĄĪëŽ
ð ėėīë ë§ëė§ íėļ
ð ëđë°ëēíļ ë§ëė§ íėļ
ð req.sessionė ėīėĐíī ėļė ė user ė ëģī ėķę°
ð res.localsëĨž ėīėĐíī íëĄ íļėëė ëĄę·ļėļ ėŽëķė ë°ëž ëŽëĶŽ íė (ëŊļëĪėĻėī)
session idë ėŋ íĪė ė ėĨëė§ë§, session ë°ėīí°ë ėëēė ė ėĨëëĪ.
ėëēė ėë session storageë ęļ°ëģļė ėžëĄ memory storeėīëĪ.
ë°ëžė, ėëēëĨž ėŽėėíëĐī session ë°ėīí°ë ėŽëžė§ëĪ.
ėëēę° ėŽėėíīë sessionėī ėŽëžė§ė§ ėëëĄ íë ĪëĐī sessionė mongoDBė ė°ęē°íīėž íëĪ.
express - connect-mongo ė°ļęģ
$ npm install connect-mongo
connect-mongoëĨž ėĪėđí í server.js íėžėė mongoStoreëĨž import íęģ MongoDBė sessionsëĨž ë§ë ëĪ.
import mongoStore from "connect-mongo"; // ėķę° â
app.use(session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:27017/wetube" }), // ėķę° â
}));
MongoDB shellėė collectionsëĨž ęēėíëĐī sessionsę° ë§ëĪėīė§ ęēė íėļí ė ėëĪ.
> show collections
sessions
users
videos
ėė§ė sessionsė ėëŽīë° sessionë ėĄīėŽíė§ ėëëĪ.
sessionė ë§ëĪęļ° ėíī ėđ ėŽėīíļëĨž ėëĄęģ ėđĻ íëĪ.
ëĄę·ļėļė íëĐī Log outęģž íëĄí ëĐëīę° ëŽëĪ.
MongoDB shellėė sessionėī ë§ëĪėīė§ ęēė íėļí ė ėëĪ.
> db.sessions.find()
{ "_id" : "pc__EnaXP5gY37scJHXEEy8SktMy17oL", "expires" : ISODate("2021-12-15T06:49:53.129Z"), "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"loggedIn\":true,\"user\":{\"_id\":\"61a6b4041bee12373c5042ff\",\"email\":\"syong@naver.com\",\"username\":\"syong\",\"password\":\"$2b$05$zShlHon.zCXKrsSbJGzOfeuIm9vDFHasBIDiq6PsKPFSE0WV4n9WG\",\"name\":\"leesyong\",\"location\":\"goyang\",\"__v\":0}}" }
ėīė ë ėëēëĨž ëŦė í ėŽėėíīë ėŽė í ëĄę·ļėļ ėíėļ ęąļ íėļí ė ėëĪ. (âĩ ėđ ėŽėīíļ ëĐëīė mongodb sessions ę·ļëëĄ)
sessionėī ėëēę° ėëëž ë°ėīí°ëē ėīėĪė ė ėĨëėī ėęļ° ëëŽļėīëĪ.
íėŽ session ė―ë
app.use(session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:27017/wetube" }),
}));
ėëēë ë°ĐëŽļíë 'ëŠĻë user'ėęē session idëĨž ėĢžęģ , íīëđ userė ëí ė ëģīëĨž íŽíĻíë ę·ļ sessionė ë°ėīí°ëē ėīėĪė ė ėĨëëĪ.
ę·ļë°ë° ëīėīë ëĄę·ļėļ íė§ ėęģ ęĩŽęē―ë§ íë userëĪėī ë°ĐëŽļí ęē―ė°ėë ę·ļëĪė ëí ė ëģīëĨž íŽíĻíë sessionėī ë°ėīí°ëē ėīėĪė ė ėĨëëĪ.
ėĩëŠ
ė useręđė§ ė ėĨíë ęēė ëëŽī ëđíĻėĻė ėīëŊëĄ ėīëĨž ėė íīėž íëĪ.
req.session.loggedIn = true;
req.session.user = user;
sessionėī ėëĄ ë§ëĪėīė§ í ėė ë ė ėī ėėžëĐī, unininitialized ėíëžęģ íëĪ.
sessionė ėė íë ęēė ėĪė§ ėŧĻíļëĄĪëŽėė ę°ëĨíë°, postLogin ėŧĻíļëĄĪëŽėė sessionė ėė íë ė―ëë ėė ę°ëĪ.
app.use(session({
secret: "Hello!",
resave: false, // ėė â
saveUninitialized: false, // ėė â
store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:27017/wetube" }),
}));
'ëę°ė sessionė í ëēë§ ė ėĨ'íęļ° ėíīėë, resave ėėąė ę°ė trueėė falseëĄ ėė íīėž íëĪ. (trueëžëĐī 'user'ę° ëĄę·ļėļí ëë§ëĪ sessionė ë°ėīí°ëē ėīėĪė ė ėĨíëĪ.)
'userę° ëĄę·ļėļíė ëë§' sessionė ë°ėīí°ëē ėīėĪė ė ėĨíęļ° ėíīėë, server.js íėžė session ëķëķėė saveuninitialized ėėąė ę°ė trueėė falseëĄ ėė íīėž íëĪ.
ėīë ėīęļ°íëė§ ėė sessionė storeė ė ėĨíė§ ėėė ėëŊļíëĪ.
sessionėī ėė ëėė ëë§(ėĶ, userę° ëĄę·ļėļ íė ëë§) ėëēë ëļëžė°ė ė ėļė
idëĨž ëęēĻėĢžęģ , íīëđ userė ëí ė ëģīę° ëīęļī sessionė ë°ėīí°ëē ėīėĪė ė ėĨíëëĄ íë ęēėīëĪ.
ėīė ëĄę·ļėļíė§ ėė userė ëí ė ëģīë ë°ėīí°ëē ėīėĪė ė ėĨëė§ ėëëĪ.
ėŋ íĪëĨž ë§ë ėëē(ėŋ íĪëĨž ė ėĄíīėž íë ėëē)ëĨž ë§íëĪ.
ë§ëĢ ë ė§ëĨž ė§ė íīėĢžė§ ėėžëĐī session cookieę° ëëĪ.
session cookieë userę° ëļëžė°ė ëĨž ëŦėžëĐī ėŽëžė§ëĪ.
Max-Ageë cookieę° ë§ëĢëë ë ė§ëĨž ë§íëĪ.
1/1000ėī ëĻėëĄ ėėąí ė ėëĪ.
ėëĨž ëĪėī ėëė ę°ėī ėėąíëĐī ëĄę·ļėļí íė 10ėīę° ė§ëëĐī ėŋ íĪë ėŽëžė§ęģ ėëėžëĄ ëĄę·ļėėëëĪ.
app.use(session({
cookie: {
maxAge: 10000,
},
}));
ėīë ėėėž ëŋ, ėĪė ëĄ íėŽ íëĄė íļėėë ë§ëĢ ėė ė ë°ëĄ ė íīėĢžė§ ėėëĪ.
ëģīėė ėíī secretęģž ë°ėīí°ëē ėīėĪ urlė ëģīėīė§ ėëëĄ ëģīíļëėīėž íëĪ.
app.use(session({
secret: "Hello!",
resave: false,
saveUninitialized: false,
store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:27017/wetube" }),
}));
secretėīë ėëēę° ëļëžė°ė ė ėŋ íĪëĨž ėĪŽëĪë ęēė ėĶëŠ
íęļ° ėíī sign í ë ėŽėĐíë stringė ë§íëĪ.
ę·ļë°ë° ëęĩ°ę° secretė ėīėĐíī ėŋ íĪëĨž íėģ ëģļėļėī ę·ļ userėļė í ė ėęļ° ëëŽļė(session hijack: ėļė
ëĐėđ) secretė ęļļęē ëŽīėėëĄ ë§ëĪėī ėļëķė ë
ļėķëė§ ėëëĄ íīėž íëĪ.
ííļ, ë°ėīí°ëē ėīėĪë userė ëí ė ëģīëĨž ę°ė§ęģ ėėžëŊëĄ ë°ėīí°ëē ėīėĪ url ëí ėļëķė ë ļėķëėīėë ėëëĪ.
.env íėž ėėą
ėīëĨž ėíī íęē― ëģė
ëĨž ë§ëĪėī ė―ëė ëĪėīę°ëĐī ėë ëīėĐëĪė ėķę°í ė ėëĪ.
íëĄė íļ íīë(package.json íėžėī ėë ęģģ)ė .env íėžė ėķę°í í .gitignore íėžė .envëĨž ėķę°íëĪ.
.env íėžė ėķę°íë ę°ė ęīėĩė ėžëĄ ëŠĻë ëëŽļėëĄ ė ėīėž íëĪ.
// .env
COOKIE_SECRET=sdfjslkfjfoj23orjasfjslafsf9f
DB_URL=mongodb://127.0.0.1:27017/wetube
dotenv ėĪėđ ë° ėŽėĐ
dotenvë .env íėžė ė―ėī ę°ę°ė ëģėëĪė process.env ėėžëĄ ëĢėīėĪëĪ.
ėĪėđ í ę°ëĨí í ëđĻëĶŽ(íėžė ėėŠ―ėė) ėŽėĐíëëĄ íëĪ.
$ npm i dotenv
ę°ëĨí í ėą íėžė ę°ėĨ ėėŠ―ėė import íëëĄ íëĪ.
íėŽ íëĄė íļė ęē―ė° server.jsė init.js íėžė ëķëĶŽíęļ° ëëŽļė ėĪė ëĄ ėąė ėĪíėíĪë init.js íėžė ę°ėĨ ėėŠ―ėė import íīėĢžėëĪ.
// init.js
import "dotenv/config";
import "./db";
// ėīí ėëĩ
process.env
ėīė process.envëĨž ėīėĐíī .env ę°ëĪė ė ę·žíī ėŽėĐí ė ėëĪ.
// server.js
app.use(session({
secret: process.env.COOKIE_SECRET, // ėė â
resave: false,
saveUninitialized: fasle,
store: MongoStore.create({ mongoUrl: process.env.DB_URL }); // ėė â
}));
// db.js
mongoose.connect(process.env.DB_URL); // ėė â