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
'๐ Back > ๐งฉ Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Multer: ํ์ผ ์ ์ฅ ๋ฏธ๋ค์จ์ด (0) | 2021.02.14 |
---|---|
์นํฉ(Webpack) ์ฐ๋ ์ด์ / ์ฌ์ฉ ๋ฐฉ๋ฒ (0) | 2021.02.13 |
mixin: ๊ฐ์ ํ์์ ๋ชจ๋ํํ์ฌ ๋๋๋งํ๊ธฐ (0) | 2021.01.25 |
View Engine <PUG> <res. locals> (0) | 2021.01.25 |
[Express ๋ฏธ๋ค์จ์ด ์ฝ๋] app.use(), app.get(), Router() (0) | 2021.01.25 |