โœ๏ธ 21-2 IPP/Node.js study

Node.js - 20 Passport.js, ์‚ฌ์šฉ์ž ์ธ์ฆ, ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ

hanwitjus 2021. 11. 10. 16:05

Passport.js ๋ฅผ ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ

 

Passport.js๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„/ํŒจ์Šค์›Œ๋“œ๋กœ ํ•˜๋Š” ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ๋ถ€ํ„ฐ, ํŽ˜์ด์Šค๋ถ๊ณผ ๊ฐ™์€ ์ œ ์‚ผ์ž ๋กœ๊ทธ์ธ ์„œ๋น„์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ๋กœ๊ทธ์ธ ๋ฉ”์†Œ๋“œ๋“ค์„ Strategy๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ํ•ด๋‹น ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋กœ๊ทธ์ธ ๋ฐฉ์‹์€ ์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€์ด๋‹ค.

 

๋จผ์ € 

npm -i passport passport-local-mongoose -S

๋กœ passport ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  main.js ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•œ๋‹ค.

 

const passport = require("passport"); //passport ๋ชจ๋“ˆ ์š”์ฒญ

app.use(passport.initialize()); // passport ์ดˆ๊ธฐํ™”
app.use(passport.session()); // passport๊ฐ€ Express.js๋‚ด ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •

 

๊ทธ๋ฆฌ๊ณ  main.js์—์„œ passport ์ง๋ ฌํ™” ์„ค์ •์„ ํ•œ๋‹ค.

passport๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ฑฐ๋‚˜ ์—ญ์ง๋ ฌํ™”ํ•ด ์„ธ์…˜์— ์ „๋‹ฌํ•œ๋‹ค. 

์„ธ์…˜์€ ์••์ถ•๋œ ํ˜•ํƒœ์˜ ์ง๋ ฌํ™”๋œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์„œ๋ฒ„๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ์—ญ์ง๋ ฌํ™”๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ• ๋ฒ„์ „์œผ๋กœ๋ถ€ํ„ฐ ๋ณต๊ตฌํ•˜๋ฉฐ, ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ์ง๋ ฌํ™”: ์••์ถ•๋œ ๊ฐ€๋… ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๋Š” ํ”„๋กœ์„ธ์Šค์ด๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” JSON, XML๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํฌ๋งท์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ๋‹จ์ผ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜๋ผ HTTP ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค. 

Passport.js๋Š” ์ด ์ง๋ ฌํ™” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ €์— ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์„ธ์…˜ ์ฟ ํ‚ค ์ค‘ ์ผ๋ถ€๋กœ ์ €์žฅ์‹œํ‚จ๋‹ค. ์ด ์ฟ ํ‚ค๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๋ฒˆ์— ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ, ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ๋กœ๊ทธ์ธ ํ–ˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ์•Œ๋ ค์ค€๋‹ค. 

 

passport.use(User.createStrategy()); //์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ์„ค์ •
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser()); //์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™” ์ž‘์—… ํ•˜๋„๋ก ์„ค์ •

 

์ด๋ ‡๊ฒŒ main.js์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋‹ค ์ถ”๊ฐ€์‹œํ‚ค๊ณ , ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋กœ ์‚ฌ์šฉ์ž ๋ชจ๋ธ์„ passport-local-mongoose์™€ ์—ฐ๋™์‹œํ‚จ๋‹ค.

 

user.js ๋ชจ๋ธ ํŒŒ์ผ์— ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

const passportLocalMongoose = require("passport-local-mongoose");

userSchema.plugin(passportLocalMongoose, {
  usernameField: "id"
});

Mongoose ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด userSchema๊ฐ€ passportLocalMongoose๋ฅผ ํŒจ์Šค์›Œ๋“œ์˜ ํ•ด์‹ฑ๊ณผ ์ €์žฅ์— ์‚ฌ์šฉํ•œ๋‹ค.

passportLocalMongoose๊ฐ€ id๋ฅผ ๋กœ๊ทธ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒํ•œ๋‹ค.

 

์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด Passport.js๋Š” ์ž๋™์ ์œผ๋กœ ํŒจ์Šค์›Œ๋“œ ์ €์žฅ์— ๊ด€์—ฌํ•˜๋ฉฐ, userSchema์—์„œ password ์†์„ฑ์„ ์—†์• ๋ฒ„๋ ค๋„ ๋œ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์Šคํ‚ค๋งˆ๋ฅผ ์ˆ˜์ •ํ•ด์„œ hash์™€ salt ํ•„๋“œ๋ฅผ  password ํ•„๋“œ ๋Œ€์‹  ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.

 

++ํ•ด์‹œ์™€ ์†”ํŠธ

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ

ํ˜„๋Œ€ ํ•ด์‹ฑ ๊ธฐ์ˆ ์€ ์‚ฌ์šฉ์ž ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋ฐ›์•„ ์ด๋ฅผ ์›๋ž˜๋กœ ๋ณต์›ํ•  ์ˆ˜ ์—†๋Š” ํ•ด์‹œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ด ํ•ด์‹œ๋Š” ๋ฌด์ž‘์œ„์˜ ์ˆซ์ž์™€ ๋ฌธ์ž๋กœ ๋ผ ์žˆ์–ด ํ‰๋ฌธ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋” ์•ˆ์ „ํ•˜๊ฒŒ DB์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด์ปค๊ฐ€ ๊ทธ๊ฐ€ ์˜ˆ์ƒํ•œ ํŒจ์Šค์›Œ๋“œ๋ฅผ ํ•ด์‹ฑํ•ด ๋น„๊ตํ•˜๋‹ค๋ณด๋ฉด ์–ธ์  ๊ฐ€๋Š” ์˜ค๋ฆฌ์ง€๋„ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•Œ์•„๋‚ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

์†”ํŠธ๋Š” ์ด๋Ÿฐ ์ทจ์•ฝ์ ๊ณผ ์‹ธ์šฐ๊ธฐ ์œ„ํ•ด ๋„์ž…๋๋‹ค.

 

์†”ํŠธ๋Š” ์งง์€ ๋žœ๋ค ๋ฌธ์ž์—ด์ด๋ฉฐ, ํ‰๋ฌธ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ํ•ด์‹ฑ๋˜๊ธฐ ์ „์— ํŒจ์Šค์›Œ๋“œ ๋’ค์— ๋ง๋ถ™์—ฌ์ง„๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด์ปค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ •ํ™•ํžˆ ์ถ”์ธกํ–ˆ๋‹ค๊ณ  ํ•ด๋„ ์˜ค๋ฆฌ์ง€๋„ ํŒจ์Šค์›Œ๋“œ์— ์ถ”๊ฐ€๋œ ์†”ํŠธ ๊ฐ’๋„ ๊ฐ™์ด ์ถ”์ธกํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ดํ‚น์ด ๋” ์–ด๋ ค์›Œ์ง„๋‹ค.

 

Passport.js๋Š” ํ•ด์‹ฑ๋œ ํŒจ์Šค์›Œ๋“œ์™€ ์†”ํŠธ ๊ฐ’์„ DB์— ์ €์žฅํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํ•ด์‹ฑ์„ ํ•ญ์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

 

 

ํŒจ์ŠคํฌํŠธ ๋“ฑ๋ก ์‚ฌ์šฉ์„ ์œ„ํ•œ Create ์•ก์…˜ ์ˆ˜์ •

 

์‚ฌ์šฉ์ž ๊ณ„์ • ์ƒ์„ฑ ์ „์— ์ˆ˜ํ–‰ํ–ˆ๋˜ bcrypt ํ•ด์‹ฑ ํ•จ์ˆ˜ ๋Œ€์‹ ์— Passport.js๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

registerController๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•œ๋‹ค. 

 

 

์›๋ž˜ ์žˆ๋˜ create ์•ก์…˜์„ ์ €๋ ‡๊ฒŒ ์ˆ˜์ •ํ–ˆ๋‹ค.

register ๋ฉ”์†Œ๋“œ๋Š” Passport.js์— ๋”ธ๋ฆฐ ๊ฒƒ์ด๋‹ค.

 

์‹ค์ œ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋ก์‹œ์ผœ ๋ณด๋ฉด,

 

์ด๋ ‡๊ฒŒ salt์™€ hash๋ผ๋Š” ๋‘๊ฐœ์˜ ์†์„ฑ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๋กœ๊ทธ์ธ ์‹œ ์‚ฌ์šฉ์ž ์ธ์ฆ

 

userController.js ์˜ authenticate ์•ก์…˜์„ ์ƒˆ๋กญ๊ฒŒ ๋ฐ”๊พผ๋‹ค.

๋จผ์ € ์ƒ๋‹จ์— 

const passport = require("passport")๋กœ passport ๋ชจ๋“ˆ์„ ์š”์ฒญํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ authenticate ์•ก์…˜์„ ์ˆ˜์ •ํ•œ๋‹ค.

passport redirect ๋ฐ ํ”Œ๋ž˜์‹œ ๋ฉ”์‹œ์ง€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ passport.authenticate๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๋กœ๊ทธ์ธ ๋œ ์ƒํƒœ์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ์ธ์ด ๋˜๋ฉด ๋”์ด์ƒ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์— Login / Register๊ฐ€ ๋œจ์ง€ ์•Š๊ณ 

ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ž‘ ๋กœ๊ทธ์•„์›ƒ ๋ฌธ๊ตฌ๋ฅผ ๋„์›Œ์ฃผ๋„๋ก ํ–ˆ๋‹ค.

 

๋จผ์ € ํ˜„์žฌ ๋กœ๊ทธ์ธ์ด ๋˜์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ main.js์—์„œ flashMessages๋ฅผ ์ •์˜ํ•œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•œ๋‹ค. 

 

isAuthenticated() ๋ฉ”์†Œ๋“œ๋Š” Passport.js์—์„œ ์ œ๊ณต๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ฟ ํ‚ค์— ์ €์žฅ๋ผ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ loggedIn ๊ฐ’์€ true๋‚˜ false๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด currentUser ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ๋‹ค.

์ด์ œ ๋ชจ๋“  ํŽ˜์ด์ง€ ์ƒ์—์„œ flashMessages์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.

 

๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” viewํŒŒ์ผ์ธ layout.ejs ๋Š” ์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ–ˆ๋‹ค.

layout.ejs

 

 

๊ทธ๋Ÿผ ์ด์ œ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ์—์„œ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๊ฐ€

์ด๋ ‡๊ฒŒ ๋ณด์ธ๋‹ค.

 

 

 

๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” ๋˜ Passport.js์—์„œ ์ œ๊ณตํ•˜๋Š” logout ์•ก์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ๋ฉ”์†Œ๋“œ๋Š” ํ™œ์„ฑ์ค‘์ธ ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ์‚ญ์ œํ•œ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ํ™ˆํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด ๋ผ์•ผํ•˜๋Š”๋ฐ, error.ejs๋กœ ๋„˜์–ด๊ฐ„๋‹ค. (๋กœ๊ทธ์•„์›ƒ์€ ๋œ๋‹ค) ์ด ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

(+ 2021.11.10 16:15 ์ˆ˜์ •)

redirectView ์•ก์…˜์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„์„œ ์ƒ๊ธด ๋ฌธ์ œ์˜€๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ ํ•˜๋‹ˆ๊นŒ ๋œ๋‹ค.

(์ฑ…์— ๋‚˜์™€์žˆ์—ˆ๋Š”๋ฐ ์“ธ๋ฐ์—†๋Š” ๊ฑฐ ๊ฐ™์•„์„œ ์•ˆ๋งŒ๋“ค์—ˆ์—ˆ๋Š”๋ฐ ์ด๊ฒŒ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ํ•  ํŽ˜์ด์ง€๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์•ก์…˜์ด์—ˆ๋‹ค..ใ…‹)

 

 

 

LIST