Passport ๋ชจ๋๋ก ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ
SNS ์๋น์ค์ด๋ฏ๋ก ๋ก๊ทธ์ธ์ด ํ์ํ๋ค. ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ์ ์ง์ ๊ตฌํํ ์๋ ์์ง๋ง, ์ธ์ ๊ณผ ์ฟ ํค ์ฒ๋ฆฌ ๋ฑ ๋ณต์กํ ์์ ์ด ๋ง์ผ๋ฏ๋ก ๊ฒ์ฆ๋ ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๋ฐ๋ก Passport๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ด๋ฆ์ฒ๋ผ ์ฐ๋ฆฌ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ฌ๊ถ ์ญํ ์ ํ๋ค.
์์ฆ์๋ ์๋น์ค์ ๋ก๊ทธ์ธ์ ํ ๋ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ ํ์ง ์๊ณ ๊ตฌ๊ธ, ํ์ด์ค๋ถ, ์นด์นด์คํก ๊ฐ์ ๊ธฐ์กด์ SNS ์๋น์ค ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ๊ธฐ๋ ํ๋ค. ์ด ๋ํ Passport๋ฅผ ์ฌ์ฉํด์ ํด๊ฒฐํ ์ ์๋ค.
1. Passport ๊ด๋ จ ํจํค์ง ์ธํ ํ๊ธฐ
1-1. Passport ๊ด๋ จ ํจํค์ง๋ค์ ์ค์นํ๋ค.
npm i passport passport-local passport-kakao bcrypt
1-2. Passport ๋ชจ๋์ ๋ฏธ๋ฆฌ app.js์ ์ฐ๊ฒฐํ๊ธฐ
- require('./passport') : require('./passport/index.js')์ ๊ฐ๋ค. ํด๋ ๋ด์ index.js ํ์ผ์ require ์ ์ด๋ฆ์ ์๋ตํ ์ ์๋ค.
- passport.initialize() : ์์ฒญ(req ๊ฐ์ฒด)์ passport ์ค์ ์ ์ฌ๋๋ค.
- passport.session() : req.session ๊ฐ์ฒด์ passport ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
- req.session ๊ฐ์ฒด๋ express-session์์ ์์ฑํ๋ ๊ฒ์ด๋ฏ๋ก passport ๋ฏธ๋ค์จ์ด๋ express-session ๋ฏธ๋ค์จ์ด๋ณด๋ค ๋ค์ ์ฐ๊ฒฐํด์ผ ํ๋ค.
1-3. Passport ๋ชจ๋ ์์ฑํ๊ธฐ
- localStrategy์ kakaoStrategy : ๋ก์ปฌ ๋ก๊ทธ์ธ๊ณผ ์นด์นด์ค ๋ก๊ทธ์ธ ์ ๋ต์ ๋ํ ํ์ผ์ด๋ค. Passport๋ ๋ก๊ทธ์ธ ์์ ๋์์ ์ ๋ต(strategy)์ด๋ผ๋ ์ฉ์ด๋ก ํํํ๊ณ ์๋ค.
- passport.serializeUser() : req.session ๊ฐ์ฒด์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ง ์ ํํ๋ค. ๋งค๊ฐ๋ณ์๋ก user๋ฅผ ๋ฐ์ done ํจ์์ ๋ ๋ฒ์งธ ์ธ์๋ก user.id๋ฅผ ๋๊ธฐ๊ณ ์๋ค. done ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ์๋ฌ ๋ฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ฏ๋ก ๋ ๋ฒ์งธ ์ธ์๊ฐ ์ค์ํ๋ค.
- ์ธ์ ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ์ ์ฅํ๋ฉด ์ธ์ ์ ์ฉ๋์ด ์ปค์ง๊ณ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ฌ์ฉ์์ ์์ด๋๋ง ์ ์ฅํ๋ผ๊ณ ๋ช ๋ นํ ๊ฒ์ด๋ค.
- passport.deserializeUser() : ๋งค ์์ฒญ ์ ์คํ๋๋ค. passport.session() ๋ฏธ๋ค์จ์ด๊ฐ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ์ข ์ ์ serializeUser์์ ์ธ์ ์ ์ ์ฅํ๋ ์์ด๋๋ฅผ ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์กฐํํ๋ค. ์กฐํํ ์ ๋ณด๋ฅผ req.user์ ์ ์ฅํ๋ฏ๋ก ์์ผ๋ก req.user๋ฅผ ํตํด ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ฆ, serializeUser๋ ์ฌ์ฉ์์ ์ ๋ณด ๊ฐ์ฒด๋ฅผ ์ธ์ ์์ด๋๋ก ์ ์ฅํ๋ ๊ฒ์ด๊ณ , deserializeUser๋ ์ธ์ ์ ์ ์ฅํ ์์ด๋๋ฅผ ํตํด ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด๋ค. ์ธ์ ์ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋์ง ์๊ธฐ ์ํ ๊ณผ์ ์ด๋ค.
์ ์ฒด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ก๊ทธ์ธ ์์ฒญ์ด ๋ค์ด์ด
- passport.authenticate ๋ฉ์๋ ํธ์ถ
- ๋ก๊ทธ์ธ ์ ๋ต ์ํ
- ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ฒด์ ํจ๊ป req.login ํธ์ถ
- req.login ๋ฉ์๋๊ฐ passport.serializeUser ํธ์ถ
- req.session์ ์ฌ์ฉ์ ์์ด๋๋ง ์ ์ฅ
- ๋ก๊ทธ์ธ ์๋ฃ
๋ค์์ ๋ก๊ทธ์ธ ์ดํ์ ๊ณผ์ ์ด๋ค.
- ๋ชจ๋ ์์ฒญ์ passport.session() ๋ฏธ๋ค์จ์ด๊ฐ passport.deserializeUser ๋ฉ์๋ ํธ์ถ
- req.session์ ์ ์ฅ๋ ์์ด๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ์ ์กฐํ
- ์กฐํ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ req.user์ ์ ์ฅ
- ๋ผ์ฐํฐ์์ req.user ๊ฐ์ฒด ์ฌ์ฉ ๊ฐ๋ฅ
2. ๋ก์ปฌ ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ
๋ก์ปฌ ๋ก๊ทธ์ธ์ด๋ ๋ค๋ฅธ SNS ์๋น์ค๋ฅผ ํตํด ๋ก๊ทธ์ธํ์ง ์๊ณ , ์์ฒด์ ์ผ๋ก ํ์๊ฐ์ ํ ๋ก๊ทธ์ธํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฆ, ์์ด๋/๋น๋ฐ๋ฒํธ ๋๋ ์ด๋ฉ์ผ/๋น๋ฐ๋ฒํธ๋ฅผ ํตํด ๋ก๊ทธ์ธํ๋ ๊ฒ์ด๋ค. Passport์์ ์ด๋ฅผ ๊ตฌํํ๋ ค๋ฉด passport-local ๋ชจ๋์ด ํ์ํ๋ค. ์ด๋ฏธ ์ค์นํ์ผ๋ฏ๋ก ๋ก์ปฌ ๋ก๊ทธ์ธ ์ ๋ต๋ง ์ธ์ฐ๋ฉด ๋๋ค. ๋ก๊ทธ์ธ์๋ง ํด๋นํ๋ ์ ๋ต์ด๋ฏ๋ก ํ์๊ฐ์ ์ ๋ฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๋ผ์ฐํฐ๋ฅผ ๋จผ์ ๋ง๋ค์ด๋ณด์. ์ด๋ฌํ ๋ผ์ฐํฐ๋ ์ ๊ทผ ์กฐ๊ฑด์ด ์๋ค. ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ ๋ผ์ฐํฐ์ ์ ๊ทผํ๋ฉด ์ ๋๋ค. (์ด๋ฏธ ๋ก๊ทธ์ธ์ ํ๊ธฐ ๋๋ฌธ์) ๋ง์ฐฌ๊ฐ์ง๋ก ๋ก๊ทธ์ธํ์ง ์ํ ์ฌ์ฉ์๋ ๋ก๊ทธ์์ ๋ผ์ฐํฐ์ ์ ๊ทผํ๋ฉด ์ ๋๋ค. ๋ฐ๋ผ์ ๋ผ์ฐํฐ์ ์ ๊ทผ ๊ถํ์ ์ ์ดํ๋ ๋ฏธ๋ค์จ์ด๊ฐ ํ์ํ๋ค.
Passport๋ req ๊ฐ์ฒด์ isAuthenticated ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค. ๋ก๊ทธ์ธ ์ค์ด๋ฉด re.isAuthenticated()๊ฐ true์ด๊ณ , ์๋๋ฉด false์ด๋ค. ๋ฐ๋ผ์ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ์ด ๋ฉ์๋๋ก ํ์ ํ ์ ์๋ค. ๋ผ์ฐํฐ ์ค์ ๋ก๊ทธ์์ ๋ผ์ฐํฐ๋ ์ด๋ฏธ์ง ์ ๋ก๋ ๋ผ์ฐํฐ ๋ฑ์ ๋ก๊ทธ์ธํ ์ฌ๋๋ง ์ ๊ทผํ ์ ์๊ฒ ํด์ผ ํ๊ณ , ํ์๊ฐ์ ๋ผ์ฐํฐ๋ ๋ก๊ทธ์ธ ๋ผ์ฐํฐ๋ ๋ก๊ทธ์ธํ์ง ์์ ์ฌ๋๋ง ์ ๊ทผํ ์ ์๊ฒ ํด์ผ ํ๋ค. ์ด๋ด ๋ ๋ผ์ฐํฐ์ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ฃ์ด ๊ฑธ๋ฌ๋ผ ์ ์๋ค.
isLoggedIn๊ณผ isNotLoggedIn ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋ค์๋ค. ์ด ๋ฏธ๋ค์จ์ด๊ฐ page ๋ผ์ฐํฐ์ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ๋ณด์.
router.get('/profile', isLoggedIn ··· : ์์ ์ ํ๋กํ์ ๋ก๊ทธ์ธ์ ํด์ผ ๋ณผ ์ ์์ผ๋ฏ๋ก isLoggedIn ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ค. req.isAuthenticated()๊ฐ true์ฌ์ผ next()๊ฐ ํธ์ถ๋์ด res.render๊ฐ ์๋ ๋ฏธ๋ค์จ์ด๋ก ๋์ด๊ฐ ์ ์๋ค. false๋ผ๋ฉด ๋ก๊ทธ์ธ ์ฐฝ์ด ์๋ ๋ฉ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ๋๋ค.
router.get('/join', isNotLoggedIn ··· : ํ์๊ฐ์ ํ์ด์ง๋ ๋ก๊ทธ์ธ์ ํ์ง ์์ ์ฌ๋์๊ฒ๋ง ๋ณด์ฌ์ผ ํ๋ค. ๋ฐ๋ผ์ isNotLoggedIn ๋ฏธ๋ค์จ์ด๋ก req.isAuthenticated()๊ฐ false์ผ ๋๋ญ next()๋ฅผ ํธ์ถํ๋๋ก ํ์๋ค.
๋ก๊ทธ์ธ ์ฌ๋ถ๋ก๋ง ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒ์ด ์๋๋ผ ํ๋ก์ ์ฌ๋ถ, ๊ด๋ฆฌ์ ์ฌ๋ถ ๋ฑ์ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ๋ค์ํ๊ฒ ํ์ฉํ ์ ์๋ค. res.render ๋ฉ์๋์์ user ์์ฑ์ req.user๋ฅผ ๋ฃ์ ๊ฒ์ ์ฃผ๋ชฉํ์. pug์์ user ๊ฐ์ฒด๋ฅผ ํตํด ์ฌ์ฉ์ ์ ๋ณด์ ์ ๊ทผํ ์ ์๊ฒ ๋์๋ค.
์ด์ ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๋ผ์ฐํฐ๋ฅผ ์์ฑํด๋ณด์.
- ๋์ค์ app.js์ ์ฐ๊ฒฐํ ๋ /auth ์ ๋์ฌ๋ฅผ ๋ถ์ผ ๊ฒ์ด๋ฏ๋ก ๋ผ์ฐํฐ์ ์ฃผ์๋ ๊ฐ๊ฐ /auth/join, /auth/login, /auth/logout์ด ๋๋ค.
- router.post('./join', isNotLoggedIn, ··· : ํ์๊ฐ์ ๋ผ์ฐํฐ์ด๋ค. ๊ธฐ์กด์ ๊ฐ์ ์ด๋ฉ์ผ๋ก ๊ฐ์ ํ ์ฌ์ฉ์๊ฐ ์๋์ง ์กฐํํ ๋ค, ์๋ค๋ฉด flash ๋ฉ์์ง๋ฅผ ์ค์ ํ๊ณ ํ์๊ฐ์ ํ์ด์ง๋ก ๋๋๋ ค๋ณด๋ธ๋ค. ์๋ค๋ฉด ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํ๊ณ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ฑํ๋ค. ํ์๊ฐ์ ์ ๋น๋ฐ๋ฒํธ๋ ์ํธํํด์ ์ ์ฅํด์ผ ํ๋ค. ์ด๋ฒ์๋ bcrypt ๋ชจ๋์ ์ฌ์ฉํ๋ค.
- router.post('/login', isLoggedIn, ··· : ๋ก๊ทธ์ธ ๋ผ์ฐํฐ์ด๋ค. passport.authenticate('local') ๋ฏธ๋ค์จ์ด๊ฐ ๋ก์ปฌ ๋ก๊ทธ์ธ ์ ๋ต์ ์ํํ๋ค. ๋ฏธ๋ค์จ์ด์ธ๋ฐ ๋ผ์ฐํฐ ๋ฏธ๋ค์จ์ด ์์ ๋ค์ด ์๋ค. ๋ฏธ๋ค์จ์ด์ ์ฌ์ฉ์ ์ ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ถ์ ๋ ๋ณดํต ์ด๋ ๊ฒ ํ๋ค. ์ด๋ด ๋๋ ๋ด๋ถ ๋ฏธ๋ค์จ์ด์ (req, res, next)๋ฅผ ์ธ์๋ก ์ ๊ณตํด์ ํธ์ถํ๋ฉด ๋๋ค.
- router.get('/logout', isLoggedIn, ··· : ๋ก๊ทธ์์ ๋ผ์ฐํฐ์ด๋ค. req.logout ๋ฉ์๋๋ req.user ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ , req.session.destroy๋ req.session ๊ฐ์ฒด์ ๋ด์ฉ์ ์ ๊ฑฐํ๋ค. ์ธ์ ์ ๋ณด๋ฅผ ์ง์ด ํ ๋ฉ์ธ ํ์ด์ง๋ก ๋๋์ ๊ฐ๋ค.
- new LocalStrategy() ์ฒซ ๋ฒ์งธ ์ธ์ : ์ ๋ต์ ๊ดํ ์ค์ ์ ํ๋ ๊ณณ์ด๋ค. usernameField์ passwordField์ ์ผ์นํ๋ req.body์ ์์ฑ๋ช ์ ์ ์ด์ฃผ๋ฉด ๋๋ค. req.body.email์ ์ด๋ฉ์ผ์ด, req.body.password์ ๋น๋ฐ๋ฒํธ๊ฐ ๋ด๊ฒจ ๋ค์ด์ค๋ฏ๋ก email๊ณผ password๋ฅผ ๊ฐ๊ฐ ๋ฃ์ด์ฃผ์๋ค.
- new LocalStrategy() ๋ ๋ฒ์งธ ์ธ์ : ์ค์ ์ ๋ต์ ์ํํ๋ async ํจ์์ด๋ค. ์์์ ๋ฃ์ด์ค email๊ณผใ password๋ async ํจ์์ ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๊ฐ ๋๋ค. ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ธ done ํจ์๋ passport.authenticate์ ์ฝ๋ฐฑ ํจ์์ด๋ค.
๋จผ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ผ์นํ๋ ์ด๋ฉ์ผ์ด ์๋์ง ์ฐพ์ ํ, ์๋ค๋ฉด bcrypt์ compare ํจ์๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ๋น๊ตํ๋ค. ๋น๋ฐ๋ฒํธ๊น์ง ์ผ์นํ๋ค๋ฉด done ํจ์์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฃ์ด ๋ณด๋ธ๋ค. ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ๋ก๊ทธ์ธ์ ์คํจํ์ ๋๋ฟ์ด๋ค. done ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ฒ์ชฝ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์์ ๋๊ณ , ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์๊ฑฐ๋ ์กด์ฌํ์ง ์๋ ํ์์ผ ๋์ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์๋ฌ๊ฐ ๋ฐ์ํ์์ ๋์ด๋ค.
done์ด ํธ์ถ๋ ํ์๋ ๋ค์ passport.authenticate์ ์ฝ๋ฐฑ ํจ์์์ ๋๋จธ์ง ๋ก์ง์ด ์คํ๋๋ค. ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์๋ค๋ฉด ๋ฉ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ๋๋ฉด์ ๋ก๊ทธ์ธ ํผ ๋์ ํ์ ์ ๋ณด๊ฐ ๋ฐ ๊ฒ์ด๋ค. ์์ง auth ๋ผ์ฐํฐ๋ฅผ ์ฐ๊ฒฐํ์ง ์์์ผ๋ฏ๋ก ์ฝ๋๊ฐ ๋์ํ์ง ์๋๋ค. ์นด์นด์ค ๋ก๊ทธ์ธ๊น์ง ๊ตฌํํ ํ ์ฐ๊ฒฐํด๋ณด์.
3. ์นด์นด์ค ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ
์นด์นด์ค ๋ก๊ทธ์ธ์ด๋ ๋ก๊ทธ์ธ ์ธ์ฆ ๊ณผ์ ์ ์นด์นด์ค์๊ฒ ๋งก๊ธฐ๋ ๊ฒ์ ๋ปํ๋ค. ์ฌ์ฉ์๋ค์ ๋ฒ๊ฑฐ๋กญ๊ฒ ์๋ก์ด ์ฌ์ดํธ์ ํ์๊ฐ์ ํ์ง ์์๋ ๋์ ์ข๊ณ , ์๋น์ค ์ ๊ณต์๋ค์ ๋ก๊ทธ์ธ ๊ณผ์ ์ ์์ฌํ๊ณ ๊ฒ์ฆ๋ SNS์ ๋งก๊ธธ ์ ์์ด์ ์ข๋ค.
์ด๋ฌํ SNS ๋ก๊ทธ์ธ์ ํน์ง์ ํ์๊ฐ์ ์ ์ฐจ๊ฐ ๋ฐ๋ก ์๋ค. ์ฒ์ ๋ก๊ทธ์ธํ ๋๋ ํ์๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๊ณ , ๋ ๋ฒ์งธ ๋ก๊ทธ์ธ๋ถํฐ๋ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค. ๋ฐ๋ผ์ SNS ๋ก๊ทธ์ธ ์ ๋ต์ ๋ก์ปฌ ๋ก๊ทธ์ธ ์ ๋ต๋ณด๋ค ๋ค์ ๋ณต์กํ๋ค.
- ๋ก์ปฌ ๋ก๊ทธ์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์นด์นด์ค ๋ก๊ทธ์ธ์ ๋ํ ์ค์ ์ ํ๋ค. clientID๋ ์นด์นด์ค์์ ๋ฐ๊ธํด์ฃผ๋ ์์ด๋์ด๋ค. ๋ ธ์ถ๋์ง ์์์ผ ํ๋ฏ๋ก process.env.KAKAO_ID๋ก ์ค์ ํ์๋ค. ๋์ค์ ์์ด๋๋ฅผ ๋ฐ๊ธ๋ฐ์ .env ํ์ผ์ ๋ฃ์ ๊ฒ์ด๋ค. callbackURL์ ์นด์นด์ค๋ก๋ถํฐ ์ธ์ฆ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ๋ผ์ฐํฐ ์ฃผ์์ด๋ค.
- ๋จผ์ ๊ธฐ์กด์ ์นด์นด์ค๋ก ๋ก๊ทธ์ธํ ์ฌ์ฉ์๊ฐ ์๋์ง ์กฐํํ๋ค. ์๋ค๋ฉด done ํจ์๋ฅผ ํธ์ถํ๋ค.
- ์๋ค๋ฉด ํ์๊ฐ์ ์ ์งํํ๋ค. ์นด์นด์ค์์๋ ์ธ์ฆ ํ callbackURL์ ์ ํ ์ฃผ์๋ก accessToken, refreshToken๊ณผ profile์ ๋ณด๋ด์ค๋ค. profile์ ์ฌ์ฉ์ ์ ๋ณด๋ค์ด ๋ค์ด ์๋ค. ์นด์นด์ค์์ ๋ณด๋ด์ฃผ๋ ๊ฒ์ด๋ฏ๋ก ๋ฐ์ดํฐ๋ console.log ๋ฉ์๋๋ก ํ์ธํ๋ณด๋ ๊ฒ์ด ์ข๋ค. profile ๊ฐ์ฒด์์ ์ํ๋ ์ ๋ณด๋ฅผ ๊บผ๋ด์ ํ์๊ฐ์ ์ ํ๋ฉด ๋๋ค. ์ฌ์ฉ์๋ฅผ ์์ฑํ ๋ค done ํจ์๋ฅผ ํธ์ถํ๋ค.
์ด์ ์นด์นด๋ก ๋ก๊ทธ์ธ ๋ผ์ฐํฐ๋ฅผ ๋ง๋ค์ด๋ณด์. ๋ก๊ทธ์์ ๋ผ์ฐํฐ ์๋์ ์ถ๊ฐํ๋ฉด ๋๋ค. ํ์๊ฐ์ ์ ๋ฐ๋ก ์งค ํ์๊ฐ ์๊ณ , ์นด์นด์ค ๋ก๊ทธ์ธ ์ ๋ต์ด ๋๋ถ๋ถ์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ฏ๋ก ๋ผ์ฐํฐ๊ฐ ์๋์ ์ผ๋ก ๊ฐ๋จํ๋ค.
GET /auth/kakao๋ก ์ ๊ทผํ๋ฉด ์นด์นด์ค ๋ก๊ทธ์ธ ๊ณผ์ ์ด ์์๋๋ค. layout.pug์ ์นด์นด์คํก ๋ฒํผ์ /auth/kakao ๋งํฌ๊ฐ ๋ถ์ด ์๋ค.
GET /auth/kakao์์ ์นด์นด์ค ๋ก๊ทธ์ธ ์ฐฝ์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ GET /auth/kakao/callback์ผ๋ก ๋ฐ๋๋ค. ์ด ๋ผ์ฐํฐ์์๋ ์บ์ค ๋ก๊ทธ์ธ ์ ๋ต์ ์ํํ๋ค. ๋ก์ปฌ ๋ก๊ทธ์ธ๊ณผ ๋ค๋ฅธ ์ ์ passport.authenticate ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๊ณตํ์ง ์๋๋ค๋ ์ ์ด๋ค. ์ฝ๋ฐฑ ํจ์ ๋์ ์ ๋ก๊ทธ์ธ์ ์คํจํ์ ๋ ์ด๋๋ก ์ด๋ํ ์ง๋ฅผ ๊ฐ์ฒด ์ failurlRedirect ์์ฑ์ ์ ์ด์ฃผ๊ณ , ์ฑ๊ณต ์์๋ ์ด๋๋ก ์ด๋ํ ์ง๋ฅผ ๋ค์ ๋ฏธ๋ค์จ์ด์ ์ ์ด์ค๋ค.
์ถ๊ฐํ auth ๋ผ์ฐํฐ๋ฅผ app.js์ ์ฐ๊ฒฐํ๋ค.
์ด์ kakaoStrategy.js์ clientID ๋ถ๋ถ์ ๋ฐ๊ธ๋ฐ์์ผ ํ๋ค. ์นด์นด์ค ๋ก๊ทธ์ธ์ ์ํด์๋ ์นด์นด์ค ๊ฐ๋ฐ์ ๊ณ์ ๊ณผ ์นด์นด์ค์ฉ ์ฑ์ด ํ์ํ๋ค. https://developers.kakao.com์ ์ ์ํ์ฌ ํ์๊ฐ์ ์ ํ๋ค. ๋ก๊ทธ์ธ ํ ๋ค์๊ณผ ๊ฐ์ด ์นด์นด์ค์ฉ NodeBird ์ฑ์ ๋ง๋ ๋ค.
REST API ํค๋ฅผ ๋ณต์ฌํ์ฌ .env ํ์ผ์ ๋ถ์ฌ๋ฃ์ด์ค๋ค.
ํ๋ซํผ ์ถ๊ฐ๋ฅผ ์ ํํ ๋ค ์น ํ๋ซํผ์ ์ถ๊ฐํ๋ค. ์ฌ์ดํธ ๋๋ฉ์ธ์๋ localhost:8001์ ์ ๋ ฅํ๋ค. ๋ง์ฝ 8001 ์ธ์ ๋ค๋ฅธ ํฌํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ํด๋น ํฌํธ๋ฅผ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
๋ง์ง๋ง์ผ๋ก Redirect Path์ /auth/kakao/callback์ ์ ๋ ฅํ๊ณ ์ ์ฅํ๋ค. ์ด ๋ถ๋ถ์ kakaoStrategy.js์ callbackURL๊ณผ ์ผ์นํด์ผ ํ๋ค.
ํ๋กํ ์ ๋ณด์ ์ด๋ฉ์ผ์ ์์งํ๋๋ก ํ๊ณ ์์ง ๋ชฉ์ ์ ์ ๋ ฅํ๋ค .์ ๋ ฅ ํ์๋ ์ ์ฅ ๋ฒํผ์ ๋๋ฌ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฅํ๋ค.
์คํํด์ ๋ก๊ทธ์ธ ํ์ธํด๋ณด๊ธฐ
...
User.find → User.findOne์ผ๋ก ๋ณ๊ฒฝ ์ ์คํ๋๋ ๊ฒ ํ์ธ