2023.04.11 TIL

์ •์Šน์›ยท2023๋…„ 4์›” 11์ผ
0
post-thumbnail
post-custom-banner

๐Ÿ“’ ๋ชฉ์ฐจ

๐Ÿ“Œ ๋กœ๊ทธ์ธ API ์ธ์ฆ ๊ตฌํ˜„ (ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ)
๐Ÿ“Œ Json Web Token
๐Ÿ“Œ authentication๊ณผ authorization
๐Ÿ“Œ ํšŒ์› ์กฐํšŒ API ์ธ๊ฐ€ ๊ตฌํ˜„
๐Ÿ“Œ Passport module
๐ŸŒˆ ์˜ค๋Š˜ ํ•˜๋ฃจ

๐Ÿ“Œ ๋กœ๊ทธ์ธ API ์ธ์ฆ ๊ตฌํ˜„ (ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ)

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ ์ตœ๊ทผ์˜ ์›น์„œ๋น„์Šค์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋กœ๊ทธ์ธ ์ธ์ฆ ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•ด๋‹น ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค.

โœ… ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ

๊ธฐ์กด์˜ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์€ย ์„œ๋ฒ„ ์ธก์—์„œ ์œ ์ €๋“ค์˜ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผ ํ–ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์ด ์ƒ๊ฒจ๋‚ฌ๋‹ค.

  • ์„œ๋ฒ„๊ฐ€ ์œ ์ €์˜ ์ธ์ฆ ๊ธฐ๋ก์„ย ์„ธ์…˜์— ์ €์žฅํ•˜๋Š”๋ฐ, ๋กœ๊ทธ์ธ ์œ ์ €๊ฐ€ ๋งŽ์•„์ง€๋ฉดย ์„œ๋ฒ„๊ฐ€ ๊ณผ๋ถ€ํ•˜ ๋˜๋Š” ๋ฌธ์ œ์ œ.

  • ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ„์‚ฐ๋œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๊ณ ย ์„œ๋ฒ„๋ฅผ ํ™•์žฅํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ.

  • ์„ธ์…˜์„ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ฟ ํ‚ค๋Š”ย ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ๋กœ์šด ๋ฌธ์ œ.

์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

โœ… ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์˜ ์žฅ์ 

1. ๋ฌด์ƒํƒœ(Stateless) & ํ™•์žฅ์„ฑ(Scalability)

stateful server๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ •๋ณด๋ฅผ ์„œ๋น„์Šค ์ œ๊ณต์— ์ด์šฉ๋œ๋‹ค. ๋ฐ˜๋ฉด์—, stateless server์˜ ๊ฒฝ์šฐ, ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ๋งŒ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์„œ๋ฒ„๋ฅผ ํ™•์žฅํ•˜๋Š”๋ฐ ์ ํ•ฉํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ํ™•์žฅ์„ฑ(Extensibility)

๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ถ„์•ผ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด google ๊ณ„์ •์„ ์ด์šฉํ•˜์—ฌ notion, slack์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

โœ… ์‹œ์Šคํ…œ ์ž‘๋™ ์›๋ฆฌ


1. ์œ ์ €๊ฐ€ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ.

  1. ์„œ๋ฒ„ ์ธก์—์„œ ํ•ด๋‹น ๊ณ„์ • ์ •๋ณด๋ฅผ ๊ฒ€์ฆ.

  2. ๊ณ„์ • ์ •๋ณด๊ฐ€ ์ •ํ™•ํ•˜๋‹ค๋ฉด, ์„œ๋ฒ„ ์ธก์—์„œ ์œ ์ €์—๊ฒŒ signed ํ† ํฐ(accesstoken)์„ ๋ฐœ๊ธ‰.

  3. ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ „๋‹ฌ๋ฐ›์€ ํ† ํฐ์„ ์ €์žฅํ•ด๋‘๊ณ , ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ† ํฐ์„ ํ•จ๊ป˜ ์„œ๋ฒ„์— ์ „๋‹ฌ.

  4. ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์š”์ฒญ์— ์‘๋‹ต.

๐Ÿ’กย ์ด๋Ÿฌํ•œ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฐ”๋กœย Json Web Tokenย ์ด๋‹ค.


๐Ÿ“Œ Json Web Token

JWT๋Š” ์›น ํ‘œ์ค€์œผ๋กœ์„œ C, Java, Python, JS ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ย ์ฃผ๋ฅ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ง€์›๋˜๋ฉฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ดย ์ž๊ฐ€ ์ˆ˜์šฉ์ (Self-contained)์ด๋ฉฐ ๊ทธ๋ ‡๊ธฐ์— ๋‘ ๊ฐœ์ฒด ์‚ฌ์ด์—์„œย ์‰ฝ๊ฒŒ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋Š”ย ์žฅ์ ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

JWT๋Š”ย .์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š”ย Header, Payload, Signature์˜ 3๊ฐ€์ง€ ๋ฌธ์ž์—ด๋กœ ๋˜์–ด์žˆ๋‹ค.

โœ… Header (ํ—ค๋”)

Header๋Š”ย ํ† ํฐ์˜ ํƒ€์ž…๊ณผย ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

โœ… Payload (๋‚ด์šฉ)

Payload์—๋Š” ํ† ํฐ์— ๋‹ด์„ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉฐ, ๋‹ด๋Š” ์ •๋ณด์˜ ํ•œ ์กฐ๊ฐ์€ย name/value์˜ ํ•œ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ Claim์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
Claim์€ย Registered, Public, Private์˜ ์„ธ ๋ถ„๋ฅ˜๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์œผ๋ฉฐย Registered Claim์€ ํ† ํฐ ๋ฐœ๊ธ‰์ž, ํ† ํฐ ์ œ๋ชฉ, ํ† ํฐ ๋งŒ๋ฃŒ์‹œ๊ฐ„, ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„ ๋“ฑ ํ† ํฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด ์ด๋ฏธ ์ด๋ฆ„์ด ์ •ํ•ด์ง„ Claim์ด๋‹ค.

โœ… Signature (์„œ๋ช…)

JWT์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์€ ์„œ๋ช…์œผ๋กœ,ย Header์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’๊ณผ Payload์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’์„ ํ•ฉ์นœ ํ›„ ์ฃผ์–ด์ง„ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‹ฑํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.


๐Ÿ“Œ authentication๊ณผ authorization

โœ… authentication (์ธ์ฆ)

๋กœ๊ทธ์ธ์„ ํ•˜๋Š” ๊ฒƒ(๋กœ๊ทธ์ธ์„ํ•ด์„œ ํ† ํฐ์„ ๋ฐ›์•„์˜ค๋Š” ๊ณผ์ •)

โœ… authorization (์ธ๊ฐ€)

๋กœ๊ทธ์ธํ•œ ํ›„, ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค๋“ค์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•ด๋‹น ์œ ์ €์ž„์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ(๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ† ํฐ์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •)

๐Ÿ“Œ ํšŒ์› ์กฐํšŒ API ์ธ๊ฐ€ ๊ตฌํ˜„

์œ ์ € ํ”„๋กœํ•„ ์ •๋ณด ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ๋žŒ๋งŒ ๋ณธ์ธ์˜ ํ”„๋กœํ•„์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ธฐ์— accesstoken์„ ํ†ตํ•ด ์ธ๊ฐ€๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

์ „์ œ์ ์ธ Flow Chart๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

โœ… authorization (์ธ๊ฐ€)

์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Client๋Š” ๋ฐœ๊ธ‰๋ฐ›์€ JWT๋ฅผ Requet Header(HTTP Header)์— ์‹ค์–ด ๊ฐ™์ด ๋ณด๋‚ธ๋‹ค. Backend๋Š” JWT๋ฅผ ๋ฐ›๊ณ  Guard๋ฅผ ํ†ตํ•ด JWT Strategy๋ฅผ ์‹คํ–‰ํ•˜๊ณ , Secret Key๋ฅผ ํ†ตํ•ด JWT๋ฅผ Decoding ํ•œ๋‹ค.
JWT๋ฅผ ๋ณตํ˜ธํ™” ํ•œ ํ›„์—ย ์›ํ•˜๋Š” API์˜ Business Logic์ด ์ˆ˜ํ–‰๋œ ํ›„, Response ๋œ๋‹ค.

โœ… Bearer

ํ† ํฐ์„ ํ†ตํ•ด ์ธ์ฆํ•  ๋•Œ Bearer ์šฉ์–ด๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋Š” ์•ฝ์†์œผ๋กœ ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.


๐Ÿ“Œ Passport module

Passport ๋Š” ์ธ๊ธฐ ์žˆ๋Š” node.js ์ธ์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ ์ž๊ฒฉ ์ฆ๋ช…(JWT, ์‚ฌ์šฉ์ž ์ด๋ฆ„/์•”ํ˜ธ)์„ ํ™•์ธํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๊ณ , ์ธ์ฆ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ Route Handler์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Request ๊ฐ์ฒด์— ์ฒจ๋ถ€ํ•ด ์ค€๋‹ค.

โœ… Passport module ์„ค์น˜ ๋ช…๋ น์–ด

$ yarn add @nestjs/passport
$ yarn add passport


๐ŸŒˆ ์˜ค๋Š˜ ํ•˜๋ฃจ

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

post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€