๐ ๋ก๊ทธ์ธ API ์ธ์ฆ ๊ตฌํ (ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ )
๐ Json Web Token
๐ authentication๊ณผ authorization
๐ ํ์ ์กฐํ API ์ธ๊ฐ ๊ตฌํ
๐ Passport module
๐ ์ค๋ ํ๋ฃจ
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ต๊ทผ์ ์น์๋น์ค์์ ๋ง์ด ์ฌ์ฉ๋๋ ๋ก๊ทธ์ธ ์ธ์ฆ ๋ฐฉ๋ฒ์ด๋ค. ํด๋น ์ธ์ฆ ๋ฐฉ๋ฒ์ ์๊ธฐ ์ํด์๋ ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ๋ํด ์์์ผ ํ๋ค.
๊ธฐ์กด์ ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
์ย ์๋ฒ ์ธก์์ ์ ์ ๋ค์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ ์์ด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋๋ฐ, ์๋์ ๊ฐ์ ๋ฌธ์ ๋ค์ด ์๊ฒจ๋ฌ๋ค.
์๋ฒ๊ฐ ์ ์ ์ ์ธ์ฆ ๊ธฐ๋ก์ย ์ธ์ ์ ์ ์ฅํ๋๋ฐ, ๋ก๊ทธ์ธ ์ ์ ๊ฐ ๋ง์์ง๋ฉดย ์๋ฒ๊ฐ ๊ณผ๋ถํ ๋๋ ๋ฌธ์ ์ .
์ธ์ ์ ์ฌ์ฉํ๋ฉด ๋ถ์ฐ๋ ์์คํ ์ ์ค๊ณํ๊ณ ย ์๋ฒ๋ฅผ ํ์ฅํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ .
์ธ์ ์ ๊ด๋ฆฌํ ๋ ์ฌ์ฉ๋๋ ์ฟ ํค๋ย ์ฌ๋ฌ ๋๋ฉ์ธ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋ก์ด ๋ฌธ์ .
์์ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ์ฌ์ฉํ๊ฒ ๋์๋ค.
stateful server๋ ํด๋ผ์ด์ธํธ์๊ฒ ์์ฒญ์ ๋ฐ์ ๋๋ง๋ค ์ํ๋ฅผ ์ ์งํ๊ณ ์ ๋ณด๋ฅผ ์๋น์ค ์ ๊ณต์ ์ด์ฉ๋๋ค. ๋ฐ๋ฉด์, stateless server์ ๊ฒฝ์ฐ, ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๊ณ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ๋ง์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ๋ค. ๋ฐ๋ผ์ ํ ํฐ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์๋ฒ๋ฅผ ํ์ฅํ๋๋ฐ ์ ํฉํ ํ๊ฒฝ์ ์ ๊ณตํ ์ ์๋ค.
๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์ฌ์ฉ๋๋ ๋ถ์ผ๋ฅผ ํ์ฅํ ์ ์๋ค. ์๋ฅผ ๋ค์ด google ๊ณ์ ์ ์ด์ฉํ์ฌ notion, slack์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
1. ์ ์ ๊ฐ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ.
์๋ฒ ์ธก์์ ํด๋น ๊ณ์ ์ ๋ณด๋ฅผ ๊ฒ์ฆ.
๊ณ์ ์ ๋ณด๊ฐ ์ ํํ๋ค๋ฉด, ์๋ฒ ์ธก์์ ์ ์ ์๊ฒ signed ํ ํฐ(accesstoken)์ ๋ฐ๊ธ.
ํด๋ผ์ด์ธํธ ์ธก์์ ์ ๋ฌ๋ฐ์ ํ ํฐ์ ์ ์ฅํด๋๊ณ , ์๋ฒ์ ์์ฒญ์ ํ ๋๋ง๋ค ํด๋น ํ ํฐ์ ํจ๊ป ์๋ฒ์ ์ ๋ฌ.
์๋ฒ๋ ํ ํฐ์ ๊ฒ์ฆํ๊ณ , ์์ฒญ์ ์๋ต.
๐กย ์ด๋ฌํ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ๊ตฌํ์ฒด๊ฐ ๋ฐ๋กย Json Web Tokenย ์ด๋ค.
JWT๋ ์น ํ์ค์ผ๋ก์ C, Java, Python, JS ๋ฑ ๋๋ถ๋ถ์ย ์ฃผ๋ฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ง์๋๋ฉฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ดย ์๊ฐ ์์ฉ์ (Self-contained)์ด๋ฉฐ ๊ทธ๋ ๊ธฐ์ ๋ ๊ฐ์ฒด ์ฌ์ด์์ย ์ฝ๊ฒ ์ ๋ฌ๋ ์ ์๋ย ์ฅ์ ๋ค์ ๊ฐ์ง๊ณ ์๋ค.
JWT๋ย .์ผ๋ก ๊ตฌ๋ถ๋๋ย Header, Payload, Signature์ 3๊ฐ์ง ๋ฌธ์์ด๋ก ๋์ด์๋ค.
Header๋ย ํ ํฐ์ ํ์ ๊ณผย ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๋ ๊ฐ์ง ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
Payload์๋ ํ ํฐ์ ๋ด์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ฉฐ, ๋ด๋ ์ ๋ณด์ ํ ์กฐ๊ฐ์ย name/value์ ํ ์์ผ๋ก ์ด๋ฃจ์ด์ง Claim์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Claim์ย Registered, Public, Private์ ์ธ ๋ถ๋ฅ๋ก ๋๋์ด์ ธ ์์ผ๋ฉฐย Registered Claim์ ํ ํฐ ๋ฐ๊ธ์, ํ ํฐ ์ ๋ชฉ, ํ ํฐ ๋ง๋ฃ์๊ฐ, ํ ํฐ ๋ฐ๊ธ ์๊ฐ ๋ฑ ํ ํฐ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ์ํด ์ด๋ฏธ ์ด๋ฆ์ด ์ ํด์ง Claim์ด๋ค.
JWT์ ๋ง์ง๋ง ๋ถ๋ถ์ ์๋ช ์ผ๋ก,ย Header์ ์ธ์ฝ๋ฉ ๊ฐ๊ณผ Payload์ ์ธ์ฝ๋ฉ ๊ฐ์ ํฉ์น ํ ์ฃผ์ด์ง ๋น๋ฐํค๋ก ํด์ฑํ์ฌ ์์ฑํ๋ค.
๋ก๊ทธ์ธ์ ํ๋ ๊ฒ(๋ก๊ทธ์ธ์ํด์ ํ ํฐ์ ๋ฐ์์ค๋ ๊ณผ์ )
๋ก๊ทธ์ธํ ํ, ๋ก๊ทธ์ธ์ด ํ์ํ ์๋น์ค๋ค์ ์ฌ์ฉํ ๋ ํด๋น ์ ์ ์์ ํ์ธํ๋ ๊ฒ(๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ ํฐ์ ํ์ธํ๋ ๊ณผ์ )
์ ์ ํ๋กํ ์ ๋ณด ์กฐํํ๊ธฐ ์ํด์๋ ๋ก๊ทธ์ธ ํ ์ฌ๋๋ง ๋ณธ์ธ์ ํ๋กํ์ ์กฐํํ ์ ์๊ธฐ์ accesstoken์ ํตํด ์ธ๊ฐ๋ฅผ ๋ฐ์์ผ ํ๋ค.
์ ์ ์ ์ธ Flow Chart๋ ์๋์ ๊ฐ๋ค.
์ฌ์ฉ์์ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ Client๋ ๋ฐ๊ธ๋ฐ์ JWT๋ฅผ Requet Header(HTTP Header)์ ์ค์ด ๊ฐ์ด ๋ณด๋ธ๋ค. Backend๋ JWT๋ฅผ ๋ฐ๊ณ Guard๋ฅผ ํตํด JWT Strategy๋ฅผ ์คํํ๊ณ , Secret Key๋ฅผ ํตํด JWT๋ฅผ Decoding ํ๋ค.
JWT๋ฅผ ๋ณตํธํ ํ ํ์ย ์ํ๋ API์ Business Logic์ด ์ํ๋ ํ, Response ๋๋ค.
ํ ํฐ์ ํตํด ์ธ์ฆํ ๋ Bearer ์ฉ์ด๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ๋ ์ฝ์์ผ๋ก ํฐ ์๋ฏธ๊ฐ ์๋ ๋ฌธ์์ด์ด๋ค.
Passport ๋ ์ธ๊ธฐ ์๋ node.js ์ธ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์ ์๊ฒฉ ์ฆ๋ช (JWT, ์ฌ์ฉ์ ์ด๋ฆ/์ํธ)์ ํ์ธํ์ฌ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๊ณ , ์ธ์ฆ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ธ์ฆ๋ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ Route Handler์์ ์ฌ์ฉํ ์ ์๋๋ก Request ๊ฐ์ฒด์ ์ฒจ๋ถํด ์ค๋ค.
$ yarn add @nestjs/passport
$ yarn add passport
์ค๋์ ํ ํฐ์ ํ์ฉํ๋ ๋ก๊ทธ์ธ์ ๋ํ์ฌ ํ์ตํ์๋ค. ๋ก๊ทธ์ธ์ ์๋น์ค๋ฅผ ๋ง๋๋๋ฐ ์์ด์ ๋งค์ฐ ์ค์ํ ๊ธฐ๋ฅ์ด๋ค. ๊ฐ์ธ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์๋ ๊ธฐ๋ฅ์ด๋ฉฐ, ๋ก๊ทธ์ธ์ด ์ ์์ ์ผ๋ก ๋์ด์ผ์ง๋ง, ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ ์ ๊ฐ ์ด์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ค๋ ๋ฐฐ์ด ๋ก๊ทธ์ธ API๋ฟ๋ง ์๋๋ผ ๊ตฌ๊ธ ๋๋ ๋ค๋ฅธ ๊ธฐํ ๋ก๊ทธ์ธ ์ธ์ฆ ๋ฐฉ๋ฒ์ ํตํด ๋ก๊ทธ์ธ ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ๊ธฐ๋๊ฐ ๋๋ค.