๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

 

6.0 passport js

์‚ฌ์šฉ์ž ์ธ์ฆ ๊ตฌํ˜„์‹œ์ผœ์ฃผ๋Š” ๋ฏธ๋“ค์›จ์–ด ์ธ์ฆ์ด๋ž€ ๋ธŒ๋ผ์šฐ์ € ์ƒ์— ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด, ๊ทธ ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž ID๋“ฑ์„ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๊ณ , Passport๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ธ์ฆ์ด ์™„๋ฃŒ๋œ user object๋ฅผ controller์— ๋„˜๊ฒจ์ค€๋‹ค. <์ฟ ํ‚ค ๊ทธ๋ฆผ> ์ฟ ํ‚ค์—๋Š” ๋ชจ๋“  request์— ๋Œ€ํ•ด ๋ฐฑ์•ค๋“œ๋กœ ์ „์†ก๋  ์ •๋ณด๋“ค์ด ๋‹ด๊ฒจ ์žˆ๋‹ค. passport์—ญํ•  ์ฟ ํ‚ค ์ƒ์„ฑ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ ์œ ์ €์—๊ฒŒ ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ์ „๋‹ฌ pssport integration passport.autheriface('strategy')์ž‘๋™ ํ›„ req.user๊ฐ€ ์ƒ๊ธฐ๋ฉฐ, ๊ทธ๊ฒƒ์€ ํ˜„์žฌ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋œ๋‹ค. passport local mongoose npm install passport-local-mongoose ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค user model์„ ์œ„ํ•œ ๊ฑฐ๋‹ค ์‚ฌ์šฉ์ž ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋“ค์„ ๋‹ค ๋งŒ๋“ค์–ด์ค€๋‹ค ํŒจ์Šค์›Œ๋“œ ๋ณ€๊ฒฝ, ํŒจ์Šค์›Œ๋“œ ํ™•์ธ, ํŒจ์Šค์›Œ๋“œ ์ƒ์„ฑ, ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒํ•˜๋ฉด ๋œ๋‹ค.

 

6.1 Local Authenrication with passport passport local mongoose๋Š” ์„ค์ •๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•จ passportlocal mongoose์—๊ฒŒusername์ด ๋  field๋ช…์„ ๋ช…์‹œํ•ด์คŒ passport.js์ƒ์„ฑ npm i passport passport-local passport-local์ด๋ž€ username๊ณผ password๋ฅผ ์Šค๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐฉ์‹์„ ์˜๋ฏธ passport.use() passport์—๊ฒŒ strategy๋ฅผ ์“ฐ๋ผ๊ณก ๋งํ•œ๋‹ค strategy: ๋กœ๊ทธ์ธ ํ•˜๋Š” ๋ฐฉ์‹ with facebook, with id pw passportlocalmongoose๊ฐ€ ์“ฐ๋Š” ๊ฑธ ์ „๋‹ฌ User.createStrategy() : createStrategy๋Š” ์ด๋ฏธ ๊ตฌ์„ฑ์ด ๋œ passport-local์˜ LocalStrategy๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

6.2 ์ฟ ํ‚ค: ์‚ฌ์šฉ์ž ID:1 ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„ Serialization : ์–ด๋–ค field๊ฐ€ ์ฟ ํ‚ค์— ํฌํ•จ๋  ๊ฒƒ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ•  (์ฟ ํ‚ค๋Š” ์•„์ฃผ ์ž‘์•„์•ผํ•˜๊ณ , ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋‹ด์ง€์•Š์•„์•ผํ•จ) ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ใ…ฃใ…†์Œ serializeUser: ์ฟ ํ‚ค์— user.id๋งŒ ๋‹ด์•„๋ผ deserial izeUser: ์–ด๋–ค ์‚ฌ์šฉ์ž์ธ์ง€ ์–ด๋–ป๊ฒŒ ์ฐพ์ง€์— ๊ด€ํ•œ ๊ฒƒ ์ฟ ํ‚ค์˜ ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ์ž๋กœ ์ „ํ™˜ํ•˜๋Š”์ง€ ์˜๋ฏธ id๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•œ๋‹ค [passport serialize ๊ทธ๋ฆผ] passport๊ฐ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•จ passport-loacal-mongoose๋•๋ถ„์— ์ˆ์ปทํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌ postJoin ๋ถ€๋ถ„์ˆ˜์ • User.create๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊นŒ์ง€ ์ €์žฅ์ด๋ฏ€๋กœ User({})๋กœ ์”€ mongo์—์„œ db.users.find({}) db.users.remove({})

 

6.3 passport.authenricate('local') ๋กœ์ปฌ์€ ์šฐ๋ฆฌ๊ฐ€ ์„ค์น˜ํ•ด์ค€ strategy์˜ ์ด๋ฆ„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ฝ”๋“œ ๋ฏธ๋“ค์›จ์–ดjs์—์„œ res.locals.user = req,user passport๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ๋กœ๊ทธ์ธ์‹œ์ผœ์ค„ ๋•Œ passport๋Š” ์ฟ ํ‚ค๋‚˜ serialize, deserialize๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๋‹ค ์ง€์›ํ•ด์คŒ์€ ๋ฌผ๋ก ์ด๊ณ user๊ฐ€ ๋‹ด๊ธด object๋ฅผ ์š”์ฒญ์—๋„ ์˜ฌ๋ ค์ค€๋‹ค app.js์—์„œ๋„ import passport app.use(passport.initalize) ๋งˆ์ง€๋ง‰ ์œ„์น˜์— ์จ์ค€ ์ด์œ ๋Š” ์œ„์—์„œ ์‹คํ–‰๋œ ์ฟ ํ‚คํŒŒ์„œ๋กœ๋ถ€ํ„ฐ ์ฟ ํ‚ค๊ฐ€ ์ญ‰ ๋‚ด๋ ค์™€ passport๊ฐ€ ์Šค์Šค๋กœ ์ฟ ํ‚ค๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๊ณ  ์ฟ ํ‚ค ์ •๋ณด์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์•„์คŒ ๊ทธ๋ฆฌ๊ณ  ์ฐพ์€ ์‚ฌ์šฉ์ž๋ฅผ ์š”์ฒญ์˜ object req.user๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค header.pug์— user.isautheticated์—์„œ ์‚ฌ์šฉ์ž์ธ์ฆ์ด ๋˜์—ˆ๋‚˜ ํ™•์ธํ•˜๋Š” ๋ถ€๋ถ„์ด ์ž‘๋™ || user ์œ ์ €๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋‹ค๋ฉด ๋น„์–ด์žˆ๋Š” object๋ฅผ ์คŒ app.js์—์„œ import ./passport๊นŒ์ง€, passport์„ค์ •ํŒŒ์ผ์ธ

 

6.4 npm install express-session app.use(session) ๋‹ˆ๊ผด๋ผ์Šค๊ฐ€ ์„ธ์…˜ ์˜ต์…˜์„ค์ •ํ•  ๋•Œ ์ธํ„ฐ๋„ท ์„ค๋ช…์„œ ์ฝ์–ด๋ณด๊ณ , secret์ด๋ผ๋Š” ํ•ต์‹ฌ๋ณ€์ˆ˜๋งŒ ๊ธฐ์–ตํ•˜๊ณ ์žˆ์—ˆ์Œ secret์ด๋ž€ ๋ฌด์ž‘์œ„ ๋ฌธ์ž์—ด๋กœ์„œ ์ฟ ํ‚ค์— ๋“ค์–ด์žˆ๋Š” session ID๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฑฐ์•ผ secret๊ฐ’์„ .env๊ฐ’์œผ๋กœ ์ €์žฅ random keygen ์‚ฌ์ดํŠธ์—์„œ ๋Œ€์ถฉ๊ณจ๋ผ์˜ด ์˜ค๋ฅ˜ ์ฝ๊ณ  resave, saveUninitialized๊ฐ€ ํ•„์š”ํ•œ ์˜ต์…˜์ธ๊ฒƒ์„ ์•Œ๊ณ  ์„ค๋ช…์„œ์— ๋‚˜์™€์žˆ๋Š” ๊ธฐ๋ณธ ๊ฐ’ ๊ถŒ์žฅ์‚ฌํ•ญ๋“ค์„ ์ผ๋‹จ์€ ๋”ฐ๋ผ์ ์—‡์Œ ์›น ์„œ๋ฒ„๋กœ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๋•Œ ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ๋Š” passport ์ธ์ฆ๊ณผ์ •์„ ํ˜ธ์ถœํ•˜๊ณ  passport๋Š” deserialize๋ฅผ ํ†ตํ•ด ๋‚ด๊ฐ€ ์–ด๋А ์‚ฌ์šฉ์ž์ธ์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. req.use๋Š” ์–ด๋””๋“  ์žˆ์Œ. ์ฟ ํ‚ค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ ์ด ์ฟ ํ‚ค๋Š” express๋กœ ๋ณด๋‚ด์ง€๊ณ  ์žˆ๋‹ค. express๋Š” session์„ ์ด์šฉํ•จ์œผ๋กœ์จ ์ฟ ํ‚ค๋ฅผ ์†์— ์ฅ˜์ˆ˜์žˆ์Œ ๊ทธ๋ฆฌ๊ณ  passport๋ฅผ ํ†ตํ•ด์„œ ์šฐ๋ฆฌ๋Š” session์„ ใ…ฃ์šฉํ•˜๋Š”๋ฐ ์ฆ‰ ์„ธ์…˜์ด ๊ฐ€์ง„ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•œ๋‹ค๋Š” ๊ฑธ์˜๋ฏธํ•œ๋‹ค. ๊ทธ ํŒจ์ŠคํฌํŠธ๋กœ deserialieze๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ ์™œ๋ƒ๋ฉด ์„ธ์…˜์€ ์ฟ ํ‚ค๋ฅผ ํ•ด๋…ํ•˜๊ธฐ ๋•Œ๋ฌธ passport๋กœ ๋„˜๊ฒจ์ง€๋ฉด deserializeUserํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๋ฉด ํŒจ์ŠคํฌํŠธ๋Š” ๋ฐฉ๊ธˆ์ฐพ์€ ์‚ฌ์šฉ์ž๋ฅผ ๋ฏธ๋“ค์›จ์–ด๋‚˜ routes์˜ request object์— ํ• ๋‹นํ•˜๊ฒŒ ๋Œ ๊ทธ๋ž˜์„œ ์–ด๋А ๋ผ์šฐํŠธ์—์„œ๋“  ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰ํ• ๋•Œ๋งˆ๋‹ค ์„ธ์…˜์ •๋ณด๋ฅผ ์žƒ๊ฒŒ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์„ธ์…˜์ •๋ณด, ์ฟ ํ‚ค์ •๋ณด๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์„ธ์…˜์„ ์œ ์ง€ํ•ด์•ผํ•œ๋‹ค...๋‹ค์Œ์œผ๋กœ app.use(passport.session)

 

6.5
mongoDB๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ธ์…˜์„ ์ €์žฅํ• ๊ฑฐ์ž„
์„ค์ •๋‹ค์•„๋Š”๊ฒŒ ์•„๋‹˜ ๋‹ˆ๊ผฌ๋„ ๊ณผ์ œ๋ฅผ ์™„์ˆ˜ํ•˜๊ธฐ๋งŒํ•˜๊ธธ ๋ฐ”๋ž€๋Œ€

connect-mongo๋‹ค์šด ์ €์žฅ์†Œ ์ƒ์„ฑ

connect mongo๋ฅผ ์จ์„œ session์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ MongoStore๋ผ๋Š” ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋ผ๊ณ  ์•Œ๋ ค์ฃผ๊ณ  ์žˆ์–ด

npm i connect mongo

import MongoStore from "connect-mongo"

 

Passport JS

is an authentication middleware

 

Passport JS ์šฉ์–ด

  • Strategy: Options of authentication mechanism
  • local: Name of strategy for username/password to authenticate in Passport
  • Provider: External website that will authenticate the user
  • Serialization: Function where we can decide what information the cookie will have
  • Deserialization: Function where we turn the cookie into an user object

 

Where does passport store the sessions

Cookies

 

How often are cookies sent to the server

Every Request

 

After deserialization, how does passport gives us the user object?

It puts it in 'req.user'

 

What happens if we don't use a CookieStore?

The cookies will not be persistent

 

๋ฐ˜์‘ํ˜•