NestJS + Google OAuth + Session ์ค๊ฐ ์ ๋ฆฌ ๐คฎ
์ด ๊ธ์ ๋ถ์ ์ ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ค๋์ ์ ๋ง ์์ ์ด ์์ต๋๋ค. ์ ๋๋ก ๋ฏฟ์ง ๋ง์ญ์์ค.
์,,, ๊ณ ๋ฏผ์ด ์ ๋ง ๋ง์๋ ์ฃผ์ ๊ณ ์ฌ์ ํ ์๋ฒฝํ๊ฒ ํด๊ฒฐ๋์ง๋ ์์์ต๋๋ค๋ง, ์๋ฒฝ์ด๋ผ๋ ๊ฑด ์์ฃ . ๊ณ์ ๋ฐ์ ํด ๋๊ฐ๋ ๊ฒ์ด์ง์. ์ธ์ ๋ฐฉ์์ ๊ตฌํํ๋ ๊ณผ์ ์์ ์ ๊ฐ ๊ฒช๊ณ ์๋ ๋ฌธ์ ๋ค์ ๊ณต์ ํ๊ณ ์ ํฉ๋๋ค.
์ฐ์ ์ ๊ตฌ์ฒด์ ์ธ ๋ ผ์์ ์์ ์ ๋ฆฌ๋ณธ์ ๊ณต์ ํ๊ณ ์ ํฉ๋๋ค. ์๋ ์ ์๋ ๋ชฉ์ฐจ๋ ์ด๋ฏธ์ง์ ์์์ ๋์ผํฉ๋๋ค.

ํด๋ผ์ด์ธํธ๋ฅผ ๋ ์์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ข์ต๋๋ค. ์๋ฒ๋ ์๋์ด๊ณ , ํ์ DB๋ ์๊ธฐ ๋ ธํธ์ด๋ฉฐ, ์ธ์ DB๋ ์ปจ๋ ํ์ดํผ์ฃ . ๊ทธ๊ฒ ๋ญ๋ฐ.
๋ด ๋จธ๋ฆฌ๋ stateless ํฉ๋๋ค. ์ธ์ด ๊ฒ์ ๊ณ์ ๊น๋จน์ฃ . ๊ทธ๋์ ์๋์์ ์๊ธฐ ๋ ธํธ๋ฅผ ๊บผ๋ด์ ๋ณด๊ณ ์ถ์ต๋๋ค. ํ์ง๋ง ์ํ ์ค์ ๋๋ค. ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ ํฌ์คํธ์ ์ปจ๋ ํ์ดํผ์๋ ์ํ์ ๋์ฌ ๊ฒ์ผ๋ก ์์ํ ๊ฐ๋ ์ด ์ ํ์๋ ํ์ด์ง ๋ฒํธ๊ฐ ์ ํ ์์ต๋๋ค.
๋คํํ ๊ฐ๋ ๊ด์ด ์ข ๋๋ํฉ๋๋ค. ํฌ์คํธ์์ ๋ณด๋ 39ํ์ด์ง์ ์์ ๋ฌธ์ ์ ๋ํ ๊ฐ๋ ์ด ์๋ค๊ณ ํ๋ค์. ๊ทธ ํ์ด์ง๋ฅผ ํตํด ์๊ธฐ ๋ ธํธ๋ฅผ ์ฝ์ด ๊ธฐ์ต์ ๋ณต์ํ๊ณ ๋ฌธ์ ๋ฅผ ํ์ด๋ ๋๋ค.
๋ฐ์น์ ์ผ์ผ๋ ๋์ ๋์ด์ง๋ง ์ง๊ธ ๋๋ ์๊ธฐ๋ฅผ ํ๊ณ ์๋ ๊ฒ์ ์๋์ฃ . ์ ๋น์ ๊ฐ ์๋ฒฝํ ์ ์ ํ์ง๋ ์์ต๋๋ค๋ง, ์ด ์ ๋ ๋ฐ์ ์ด ์์ผ๋ฉด ์ด์ด์ง ๋ด์ฉ์ ์ดํดํ๊ธฐ ์ฐธ ์ด๋ ต์ต๋๋ค.


๋ฌธ๋ ๋ก๊ทธ์ธ์ด ํ๊ณ ์ถ์ด์ก์ต๋๋ค. ํํ์ด๋ฉด ๊ตฌ๊ธ๋ก ํ๊ณ ์ถ์ด์ก์ต๋๋ค. ํ์๊ฐ์ ์ ๋์ด ์๋ ์ํ์ ๋๋ค.

ํ์๊ฐ์ ๋์ ๋์ผํ ํ๋ก์ธ์ค(๊ตฌ๊ธ ํ๋ก์ธ์ค)๋ฅผ ์งํํฉ๋๋ค. ๊ตฌ๊ธ๋ก ๋ก๊ทธ์ธ์ ํ๊ฒ ๋ค๋ ๋ง์, ๊ตฌ๊ธ ์๋น์ค๋ฅผ ํ ๋ฒ์ ๊ฑฐ์ณ์ผ ํ๋ค๋ ๋ง๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์๊ฐ์ ํ๋ก์ธ์ค์์๋ ์ ์ ์ ๋ณด๊ฐ ์์๊ธฐ์, /phone ๊ฒฝ๋ก๋ก ์ด๋ํ ๋ค verification ์ ์ฐจ๋ฅผ ๊ฑฐ์ณ์ผ ํ์ต๋๋ค. ํ์ฌ๋ ์ด๋ฏธ ํ์๊ฐ์ ์ด ์๋ฃ๋ ์ ์ ์์ ์ ์ ํ๊ธฐ ๋๋ฌธ์, Database์์ ํด๋น ์ ์ ๋ฅผ ์ฐพ๋ ๋ก์ง์ด ํ์ํฉ๋๋ค.

์ ์ฌ๊ธฐ์๋ถํฐ ํ๋ชจ๊ฐ ์งํ๋๋๋ฐ์, ์ ์ ์ต์ข ์ ์ธ ๋ชฉํ๋ ๊ตฌ๊ธ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋์์ต๋๋ค. ์๋ฐํ ๋ฐ์ง๋ฉด '๊ตฌ๊ธ์ ํตํด ๊ฐ์ ํ ์ฐ๋ฆฌ ์ ์ '์ ๋ํ ์ ๋ณด๊ฐ ํ์ํ์ต๋๋ค.
๊ตฌ๊ธ์์ ์ ๊ณตํ๋ ๊ณ ์ ํ accountId๋ฅผ, ์ต์ข ์ ์ ํ ์ด๋ธ์ ์ธ๋ํค๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์์ ๊ฐ๊น์ฐ๋, ๊ฐ๋ก๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋๋ฌธ์ ์ด๋ ค์์ด ์์๊ณ , ์ฌ๊ธฐ์ ๋ง์ ์๊ฐ์ ์ง์ฒดํ ์๋ ์์์ต๋๋ค. ๋คํํ ๋ ํ ์ด๋ธ์ด ๊ณตํต์ ์ผ๋ก email ๊ฐ์ ๊ฐ๊ณ ์์๊ธฐ์ email๋ก ์ ๊ทผํด์ ์ต์ข ์ ์ ์ ๋ณด๋ฅผ ๊บผ๋ด์์ต๋๋ค. ๊ทธ ์ ๋ณด๊ฐ ์ฝ๋ ์์ viaGoogleUser์ ํด๋นํฉ๋๋ค.
์ข์ ๊ธฐํ์ ๋ณ๊ฒฝ์ฌํญ์ด ์ ์ ๊ธฐํ์ด๋ผ๋ ์ ์ ๋ค์๊ธ ์๊ฐํด ๋ณด๋ฉฐ, ์ด์ด์ ๋ด์ฉ์ ๊ณต์ ํ๊ฒ ์ต๋๋ค.

์ธ์ ์ ์์ฑํ๊ธฐ ์ํด์๋, ๊ธฐ์ด์ ์ธ ์ค์ ์์ ์ด ํ์ํฉ๋๋ค. ๊ฐ๋จํ๊ฒ๋ง ์ค๋ช ํ๊ฒ ์ต๋๋ค.
app.use()์๋ ๊ธฐ๋ณธ์ ์ผ๋ก, ์๋ฒ๋ก์ ์์ฒญ๊ณผ ์๋ต์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ ๋ฏธ๋ค์จ์ด๊ฐ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด cookie์ session, ๊ทธ๋ฆฌ๊ณ passport๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๊ณ ๋ช ์ํ ๊ฒ์ผ๋ก ์ ์ฝ๋๋ฅผ ํด์ํ ์ ์์ต๋๋ค.

serializeUser() ํจ์๊ฐ ์ ๋ฌ๋ฐ๋ user๋ viaGoogleUser์ ๋๋ค. ์ธ์ ์ ์ต์ข ์ ์ ์ id๋ฅผ ์ ์ฅํ๊ฒ ๋ค๋ ๋ป์ ๋๋ค.
์ดํ ์ปจํธ๋กค๋ฌ์์ req.login()์ ์คํํ๋ฉด session ID๊ฐ ์์ฑ๋ฉ๋๋ค.

๊ฐ๋จํ๊ฒ๋ง ์๊ฐํด ๋ณด์ฃ . ์ง๊ธ ์ฐ๋ฆฌ์ ๋ชฉ์ ์, ์ํ๋ ๋ฐ์ดํฐ์ id๋ฅผ ์ธ์ ์ ์ ์ฅํ ๋ค, ์ธ์ id๋ฅผ ํด๋ผ์ด์ธํธ๋ก '์ฟ ํค์ ๋ด์' ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ์ผ๋จ ํด๋ผ์ด์ธํธ์ ์ฟ ํค๊ฐ ์๋์ง ํ์ธํด ๋ด ์๋ค.

์ ์์ฃผ ํ์ทจํ๊ณ ์ถ๊ฒ ์ ๋์ฐฉํ์ต๋๋ค. ๊ธฐํ๊ฐ ๋๋ฉด ํดํน์ ๊ณต๋ถํด ๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค.
overview์์ ์ ์ํ 6๋ฒ์ ๋ํ ํ๋ฆ์ ํ์ธํด ๋ณด์ฃ .
์ธ์ id๊ฐ ์ฟ ํค์ ๋ด๊ธด ์ํ๋ก ํด๋ผ์ด์ธํธ์ ์์ผ๋, protected data์ ๋ํด ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋ฒ๋ก ์ฟ ํค๊ฐ ์ ์ก๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฟ ํค์ ๋ํ validation์ ๊ฑฐ์น ๋ค ์ธ์ id๋ฅผ ํ์ธํ๊ณ , ์ธ์ id์ ๋ง๋ ์ธ์ ์ ์ ์ ๋ณด๋ฅผ ๋ณต์ํด์ ๋ค์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด ์ค์ผ ํฉ๋๋ค. ์ฐ์ ํด๋ผ์ด์ธํธ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํ์ต๋๋ค.

์ ๋ก์ง์ ์ฑ๋ฐ์ ์์ฑ๋์ด ์์ต๋๋ค. ์ฑ๋ฐ๊ฐ ๋ชจ๋ ํ์ด์ง์ ๊ฑธ์ณ ์์ผ๋, ์ด๋ค ํ์ด์ง๋ฅผ ๊ฐ๋ ์ง์์ ์ผ๋ก ์ธ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์์ฒญ์ ์ํํ ๊ฒ์ ๋๋ค.
๋ก๊ทธ์ธ์ ์ด๋ฏธ ํ๋๋ฐ ์ง์์ ์ผ๋ก ์ฌ์ฉ์ ์ธ์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ค? ์ด๊ฑฐ์ผ๋ง๋ก protected data์ ๋ํ ์์ฒญ์ด๋ผ๊ณ ํ ์ ์๊ฒ ์ฃ .
7๋ฒ ํํธ์์๋ ์ค๋ช ์ด ์๋๋ผ ์๊ณ ๋์ฃ๋ฅผ ํ๋ ค ํฉ๋๋ค.
์ฌ์ค NestJS์์ ์ธ์ ๋ฐฉ์์ ๊ตฌํํ๋ ค๋ฉด Guard์ Strategy๋ผ๋ ๊ฐ๋ ์ ์ ์ฉํด์ผ ํฉ๋๋ค. ํ์ง๋ง ์ฒ์๋ถํฐ ๋๋ฌด ๋ง์ ๊ฒ์ ๊ณ ๋ คํ๊ฒ ๋๋ฉด, ํ ๋ฐ์ง๋ ๋ชป ์์ง์ด๊ฒ ๋ฉ๋๋ค.
์ฆ, ํ์ฌ๋ก์๋ validate ๋ก์ง์ด ์์ต๋๋ค. ๋ฐ๋ก ์ญ์ง๋ ฌํ๋ก ๊ฐ์์ฃ .

์ธ์ id๋ฅผ ํตํด ์ธ์ ์์ ์ค์ ์ ์ฅ๋ ์ ์ ์ id๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ทธ ๊ฐ์ ํตํด ์ ์ ์ ๋ณด๋ฅผ ๋ณต์ํด์ ์ ๋ฌํฉ๋๋ค.

๋ฐ์ดํฐ๊ฐ ์ ๋์ฐฉํ์์ ํ์ธํ ์ ์๋ค์.
Foreign key๋ก database๋ฅผ mapping ํด์ผ ํ๋๋ฐ ์ผ๋จ email๋ก viaGoogleUser๋ฅผ ํ์ฑ ํ๋ค๋ ์ , Guard์ Strategy๋ฅผ ์ ์ฉํ์ง ์์๋ค๋ ์ , ์ธ์ ID๋ฅผ ์ ์ธํ๊ณ ํ๋ก ํธ์๋์ ๋ด๋ ค์ผ ํ ์ต์ data์ ๋ํ ์ ๋ฆฌ๊ฐ ๋๋์ง ์์๋ค๋ ์ , ์ฟ ํค๊ฐ(์ธ์ ID)๋ฅผ ํตํ UI/UX ์ฒ๋ฆฌ๊ฐ ์งํ๋์ง ์์๋ค๋ ์ ๋ฑ์ ํ๊ณ๊ฐ ๋จ์์์ต๋๋ค.
์ ์ฝ์ง ์์๋ฐ์. ์ํ ์ค๋ ฅ์, ์์ํ C ๋ ๋ฒจ ๋ฌธ์ ๋ฅผ ํผ์ ๋๋๋๋ฉด์ ํ ๋ ๋๋ ๋ฒ์ด์ง์. ์ค๋ ๋ญ๊ฐ ์ ํ๋ฆฌ์ง ์์๋ค๋ฉด, ์ถํํฉ๋๋ค ์ฑ์ฅํ์ จ์ต๋๋ค. ์ ๊น ์ ํ๋ฆฌ๋ ๊ฑธ๋ก ์ฃผ๋ ๋ค์ง ๋ง์ญ์์ค. ์ ํด๋ผ ๊ฒ๋๋ค. (๋ธ๋ก๊ทธ๋ฅผ ์ฐ์ฐํ ๋ณด๊ฒ ๋ ๋๊ตฐ๊ฐ์๊ฒ)