[PosePicker v1.0.0] ๐Ÿ’ฌ ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ & ์œ ์ € ์ •๋ณด ๊ด€๋ฆฌ

SeonDalยท2024๋…„ 4์›” 12์ผ
1

๐Ÿช„ PosePicker Tech Blog

๋ชฉ๋ก ๋ณด๊ธฐ
2/3
post-thumbnail

์นด์นด์˜ค๊ณ„์ •์„ ์ด์šฉํ•œ ์†Œ์…œ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค

PosePicker(ํฌ์ฆˆํ”ผ์ปค) ๊ฐœ๋ฐœ ์‹œ๋ฆฌ์ฆˆ

  • ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ
  • ๋กœ๊ทธ์ธ ์ •๋ณด ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ(recoil)
  • ๋กœ๊ทธ์•„์›ƒ๊ณผ ์„œ๋น„์Šค ํƒˆํ‡ด ๊ตฌํ˜„
  • ์„œ๋ฒ„ ํ†ต์‹ ์šฉ ํ—ค๋”์—์„œ ์—‘์„ธ์Šค ํ† ํฐ ๊ด€๋ฆฌ(axios)
  • ์„ธ์…˜ ๋งŒ๋ฃŒ์‹œ ์ž๋™ ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„(interceptor)

1.์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๊ณผ์ •

1. ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ๋ฐ›๋Š” ๋งํฌ๋กœ ์ ‘์†ํ•œ๋‹ค
์ด๋•Œ ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ๋ฐ›๋Š” ๋งํฌ์—๋Š” Redirect URI๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋‹ค

2. ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜๋ฉด ์•„๊นŒ ํฌํ•จ๋˜์–ด ์žˆ๋˜ Redirect URI๋กœ ์ž๋™์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ์ด๋•Œ ์ธ๊ฐ€์ฝ”๋“œ๊ฐ€ ๊ฐ™์ด ์˜จ๋‹ค.
์ธ๊ฐ€์ฝ”๋“œ๋Š” url์˜ ์ฟผ๋ฆฌ ํ˜•ํƒœ{RedirectUri}?code={์ธ๊ฐ€์ฝ”๋“œ}๋กœ ์˜จ๋‹ค

3. ํ•ด๋‹น ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ๋ฐฑ์—”๋“œ์—๊ฒŒ ๋ณด๋‚ด์ฃผ๋ฉด ๋กœ๊ทธ์ธ ์™„๋ฃŒ
๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•œ ์ผ๋ฐ˜์ ์ธ ๋กœ๊ทธ์ธ์—์„œ๋Š” API์— ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ํฌํ•จํ•ด์„œ ์š”์ฒญํ•˜๋ฉด ๋กœ๊ทธ์ธ ์™„๋ฃŒ๋œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ณด๋‚ด์ค€๋‹ค.


ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ

  1. ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ๋ฐ›๋Š” ๋งํฌ๋กœ ์ ‘์†ํ•œ๋‹ค

์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ๋ฐ›๋Š” ๋งํฌ๋Š” ๊ณต์‹๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋‹ค.
ํ˜•์‹๋งŒ ์ž˜ ๋งž์ถฐ์„œ ๋ฐœ๊ธ‰ํ•œ ์„œ๋ฒ„ํ‚ค์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ uri๋ฅผ ํฌํ•จ์‹œ์ผœ์ฃผ์ž

const KAKAO_AUTHORIZE = `https://kauth.kakao.com/oauth/authorize?client_id=${KAKAO_SERVER_KEY}&redirect_uri=${KAKAO_REDIRECT_URI}&response_type=code`;

  1. ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜๋ฉด ์•„๊นŒ ํฌํ•จ๋˜์–ด ์žˆ๋˜ Redirect URI๋กœ ์ž๋™์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ์ด๋•Œ ์ธ๊ฐ€์ฝ”๋“œ๊ฐ€ ๊ฐ™์ด ์˜จ๋‹ค.

์ธ๊ฐ€์ฝ”๋“œ๋Š” url์˜ ์ฟผ๋ฆฌ ํ˜•ํƒœ{RedirectUri}?code={์ธ๊ฐ€์ฝ”๋“œ}๋กœ ์˜จ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” {๋„๋ฉ”์ธ}/auth?code={์ธ๊ฐ€์ฝ”๋“œ}ํ˜•ํƒœ

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋œ ํŽ˜์ด์ง€์—์„œ๋Š” useSearchParams()๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ url์—์„œ 'code'์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ธ ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ code ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

ํ•ด๋‹น ์ธ๊ฐ€์ฝ”๋“œ๋กœ ๋กœ๊ทธ์ธapi๋กœ ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•œ ํ›„ ๊ฒฐ๊ณผ๋กœ ๋ฐ›์€ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์ „์—ญ ์ƒํƒœ๋กœ ์ €์žฅํ•œ ํ›„ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋ฉด ๋. (์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ๋ณธ ๊ธ€ ์•„๋ž˜์— ๊ธฐ๋ก)

  1. ํ•ด๋‹น ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ๋ฐฑ์—”๋“œ์—๊ฒŒ ๋ณด๋‚ด์ฃผ๋ฉด ๋กœ๊ทธ์ธ ์™„๋ฃŒ

๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•œ ์ผ๋ฐ˜์ ์ธ ๋กœ๊ทธ์ธ์—์„œ๋Š” API์— ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ํฌํ•จํ•ด์„œ ์š”์ฒญํ•˜๋ฉด ๋กœ๊ทธ์ธ ์™„๋ฃŒ๋œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ณด๋‚ด์ค€๋‹ค.

๋ฐฑ์—”๋“œ์˜ ๋กœ๊ทธ์ธ api (์—ฌ๊ธฐ์„œ๋Š” /users/kakao?code={์ธ๊ฐ€์ฝ”๋“œ}์™€ ํ†ต์‹ ํ•ด์คฌ๋‹ค.

๋กœ๊ทธ์ธ api๋ฅผ ์š”์ฒญํ•˜๋Š”๋ฐ ๋œฌ๋”์—†์ด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ uri๋ฅผ ๊ฐ™์ด ๋ณด๋‚ด์ฃผ๋Š”๊ฑด ์•„๋ž˜์™€ ๊ฐ™์€ ์‹œํ–‰์ฐฉ์˜ค๊ฐ€ ์žˆ์—ˆ๋‹ค


redirect uri ์ด์Šˆ ๋ฐœ์ƒ.. ๋ฐฑ์—”๋“œ์™€ ๋ฐค์ƒˆ ์˜๋…ผํ•˜๊ธฐ

์†Œ์…œ ๋กœ๊ทธ์ธ API๋ฅผ ๋ถ™์ด๋Š” ๊ณผ์ •์—์„œ ์ž๊พธ 500์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค
์•Œ๊ณ ๋ณด๋‹ˆ ์›์ธ์€ ๋ฐฑ์—”๋“œ์ชฝ์—์„œ Redirect URI๋ฅผ ํ•˜๋‚˜๋กœ ์„ค์ •ํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์ด์˜€๋‹ค.

์ฆ‰, ๋ฐฑ์—”๋“œ๊ฐ€ ์„ค์ •ํ•œ URI์ธ ํ”„๋กœ๋•์…˜ ๋งํฌ๊ฐ€ ์•„๋‹Œ ๋กœ์ปฌ(localhost:3000)์ด๋‚˜ develop(๋ณธ ํ”„๋กœ์ ํŠธ๋Š” develop๊ณผ main๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ๋ฐฐํฌ๋˜์–ด์žˆ๋‹ค)์—์„œ ๋ณด๋‚ด๋ฉด KOE006์—๋Ÿฌ(๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ฏธ์„ค์ • ์˜ค๋ฅ˜)๊ฐ€ ์ƒ๊ฒจ๋ฒ„๋ฆฌ๊ณ  ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐ›์€ ๋ฐฑ์—”๋“œ์—์„œ๋Š” 500์—๋Ÿฌ๋ฅผ ํ”„๋ก ํŠธ์—”๋“œ์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ƒํ™ฉ์ด์˜€๋‹ค.

๋งค๋ฒˆ ๋ฐฑ์—”๋“œ์—๊ฒŒ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋ฐ”๊ฟ”๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ ํ˜„์žฌ ํ”„๋ก ํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ uri๋“ค์„ ํ—ˆ์šฉํ•ด๋‹ฌ๋ผ๊ณ  ๋ถ€ํƒ๋“œ๋ ธ๋Š”๋ฐ

์š”๋ ‡๊ฒŒ ๋„๋ฉ”์ธ์„ ๋งค๋ฒˆ ๋ถ„๊ธฐ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ์…จ๋‹ค๊ณ  ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์ฃผ์…จ๋‹ค.

์ด ํ˜•ํƒœ๋Š” ๋ฐฑ์—”๋“œ์—๊ฒŒ๋„ ํ”„๋ก ํŠธ์—๊ฒŒ๋„ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์—†๋Š” ๋‚˜์œ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์—ˆ๊ณ , ์•„์˜ˆ redirect uri๋ฅผ ํ”„๋ก ํŠธ์—์„œ ํ•ด๋‹น api์™€ ํ†ต์‹ ํ• ๋•Œ ๋ณด๋‚ด์„œ ๋ฐฑ์—”๋“œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์—๊ฒŒ ๋ฐ›์€ RedirectURI๋ฅผ ๊ทธ๋Œ€๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์€ ์–ด๋–จ์ง€ ์ œ์•ˆ๋“œ๋ฆฌ๊ณ  ํ•ฉ์˜ํ•˜์˜€๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ”„๋ก ํŠธ๋Š” ๋กœ๊ทธ์ธapi๋กœ ํ†ต์‹ ํ•  ๋•Œ ์ธ๊ฐ€์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ uri๋„ ํฌํ•จ์‹œํ‚ค๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ด์ „์— ๋ฐฑ์—”๋“œ์— ์ •ํ•ด๋†“์€ ๊ฒฝ๋กœ๋กœ ํ”„๋ก ํŠธ์˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๊ฒฝ๋กœ๋ฅผ ๋งž์ถฐ์•ผํ•˜๋Š” ๋ณต์žกํ•œ ์ƒํ™ฉ๋„ ํ”ผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค

Before & After

๋‹น์‹œ ๋ฐค์ƒˆ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ํ•ด๊ฒฐํ•œ๊ฒŒ ๋„ˆ๋ฌด ๊ธฐ๋ป์„œ ๋””์ฝ” ๋Œ€ํ™” ์ผ๋ถ€๋ฅผ ์บก์ณํ–ˆ์—ˆ๋‹ค

2. ๋กœ๊ทธ์ธ ์ •๋ณด ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ

์ผ๋ฐ˜์ ์ธ ๋กœ๊ทธ์ธapi๋Š” ๋กœ๊ทธ์ธ์„ ์„ฑ๊ณตํ•˜๋ฉด ์œ ์ € ๋‹‰๋„ค์ž„๊ณผ ์ด๋ฉ”์ผ ์ฃผ์†Œ, ์—‘์„ธ์Šค ํ† ํฐ์„ ํฌํ•จํ•œ ํ† ํฐ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

localStorage.setItem('accesstoken', response.token.accessToken);

์„œ๋ฒ„ ํ†ต์‹  ์ค‘ ํ† ํฐ์ด ํ•„์š”ํ•œ ํ†ต์‹ ์—๋Š” ํ—ค๋”์— ์ž๋™์œผ๋กœ ์—‘์„ธ์Šคํ† ํฐ์„ ํฌํ•จํ•˜๋„๋ก ํ† ํฐ์€ ๋”ฐ๋กœ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•ด์คฌ๋‹ค.
๋ณด์•ˆ์ด ๊ฒฝ์•…์Šค๋Ÿฝ์ง€๋งŒ ๋‹คํ–‰ํžˆ ์„œ๋ฒ„์ชฝ์—์„œ OAuth๋กœ ํ† ํฐ ๋งŒ๋ฃŒ์˜ ๊ฐœ๋…์„ ์ ์šฉํ•ด์คฌ๋‹ค


์œ ์ € ์ •๋ณด ์ €์žฅ ๋ฐ ์ ‘๊ทผ (recoil)

๊ทธ ์™ธ์— ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ์ธ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋‚˜ ์œ ์ € ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•  ์œ ์ € ๋ฐ์ดํ„ฐ๋“ค์€ Recoil์„ ์ด์šฉํ•˜์—ฌ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค

recoil์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์•„๊นŒ ๋ณธ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ๋ณด์ž

์„œ๋ฒ„๊ฐ€ ๋ฐ˜ํ™˜ํ•ด์ค€ ๋กœ๊ทธ์ธ ์ •๋ณด ์‘๋‹ต์„ setUser๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋ชจ์Šต์ด ๋ณด์ธ๋‹ค.

Recoil๋กœ userAtom์„ ์ •์˜ํ•ด์ฃผ๊ณ , ์ด ์•„ํ†ฐ๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ๋“ค์„ useUserState๋ผ๋Š” ํ›…์— ๊ตฌํ˜„ํ•ด๋’€๋‹ค.

  • userData : ์œ ์ €์•„ํ†ฐ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • setUser({๊ฐ์ฒด}) : ์œ ์ €์•„ํ†ฐ์„ {๊ฐ์ฒด}๋กœ ์„ค์ •(๋ณ€๊ฒฝ)ํ•ด์ค€๋‹ค = ๋กœ๊ทธ์ธ
  • clearUser : ์œ ์ € ์•„ํ†ฐ์„ ๋น„์šด๋‹ค = ๋กœ๊ทธ์•„์›ƒ
  • isLogin : ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค€๋‹ค

์‚ฌ์‹ค ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ๋ฐ”๋กœ useRecoilValue๋‚˜ useSetRecoilState๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ.. ๊ฐœ์ธ์ ์œผ๋กœ ํŠน์ • ์•„ํ†ฐ๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…๋“ค์„ ํ•œ ํŒŒ์ผ์˜ ํ•œ ํ›… ์•ˆ์— ๋ชจ์•„๋‘๋Š”๊ฑธ ์„ ํ˜ธํ•ด์„œ ๋‚œ ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ง ๊ฑฐ๋‹ค. ๊ฐ์ž ์ทจํ–ฅ์— ๋งž๊ฒŒ ์ž‘์„ฑํ•˜์ž

์ด๋Ÿฐ์‹์œผ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ userState ํ›…์„ ์‚ฌ์šฉํ•ด์„œ ์ „์—ญ์ƒํƒœ์ธ ์œ ์ € ์ •๋ณด์— ์ ‘๊ทผํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


recoil์ƒํƒœ ์ƒˆ๋กœ๊ณ ์นจ ์œ ์ง€

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ recoil๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ „์—ญ์ƒํƒœ๋Š” ํ—ˆ๋ฌดํ•˜๊ฒŒ๋„ ์ƒˆ๋กœ๊ณ ์นจ ํ•œ๋ฒˆ์— ๋‚ ์•„๊ฐ€๋ฒ„๋ฆฐ๋‹ค.. NextJS์˜ ๊ฒฝ์šฐ ํŽ˜์ด์ง€๋ฅผ ๋ฐ”๊ฟ€๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ๊ณ ์นจ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•œ ๋Œ€์‘์ด ํ•„์š”ํ–ˆ๋‹ค.

recoil-persist ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์„œ userAtom์„ persistAtom์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.


๋กœ๊ทธ์•„์›ƒ ๋ฐ ํƒˆํ‡ด๊ธฐ๋Šฅ ๊ตฌํ˜„

๋กœ๊ทธ์•„์›ƒ๊ณผ ์„œ๋น„์Šค ํƒˆํ‡ด์˜ ๊ฒฝ์šฐ๋„ ๋กœ๊ทธ์ธ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด๋œ๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ ๋กœ๊ทธ์•„์›ƒ์ด๋ผ๋Š” ์•ก์…˜์„ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๋กœ๊ทธ์ธ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด /auth/logout ํŽ˜์ด์ง€๋กœ ์ด๋™๋˜๊ณ  ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ์•„์›ƒ ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค

์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์•„์›ƒ ์ž‘์—…์€

  1. ๋กœ๊ทธ์•„์›ƒ api๋กœ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ณ  (์œ„์—์„œ patchLogout๊ณผ ๋™์ผ)
  2. ์ „์—ญ ์ƒํƒœ์— ์žˆ๋Š” ์œ ์ € ์ •๋ณด๋ฅผ ์—†์• ๊ณ  (clearUser)
  3. ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์žˆ๋Š” ์—‘์„ธ์Šคํ† ํฐ๋„ ์—†์• ๊ณ  (localstorage.removeItem)
  4. ์ด์ „ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

์ด ๋ชจ๋“  ๊ณผ์ •์„ ํฌํ•จํ•œ๋‹ค

์ƒ๊ฐ๋ณด๋‹ค ๊น”๋”ํ•˜๊ณ  ์‹œ์ค‘ ์„œ๋น„์Šค์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. ์„œ๋น„์Šค ํƒˆํ‡ด ํ”Œ๋กœ์šฐ๋„ ํŽ˜์ด์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋ฟ ๋กœ์ง์€ ๋˜‘๊ฐ™๋‹ค.


3. ์—‘์„ธ์Šค ํ† ํฐ ๊ด€๋ฆฌํ•˜๊ธฐ

์œ„์—์„œ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ถ”๊ฐ€ํ•œ ์—‘์„ธ์Šคํ† ํฐ์„ ์„œ๋ฒ„ํ†ต์‹ ์—์„œ ํšจ์œจ์ ์ด๊ฒŒ ํ™œ์šฉํ•ด๋ณด์ž


ํ† ํฐ์œผ๋กœ ํ†ต์‹ ํ•  ๋•Œ Bearer ๋ถ™์ด๊ธฐ

์ž๊พธ Unauthorized์—๋Ÿฌ๊ฐ€ ๋– ์„œ ํ™•์ธํ•ด๋ณด๋‹ˆ ํ† ํฐ์˜ ํ˜•์‹์„ ์•Œ๋ ค์ฃผ์ง€ ์•Š๊ณ  ๋ƒ…๋‹ค ์•ก์„ธ์Šคํ† ํฐ๋งŒ ๋ณด๋‚ด์„œ ์ƒ๊ธฐ๋Š” ์˜ค๋ฅ˜์˜€๋‹ค.

Bearer์„ ์—‘์„ธ์Šคํ† ํฐ ์•ž์— ์ถ”๊ฐ€ํ•˜๋‹ˆ ๊ฒฐ๊ณผ๋ฅผ ์ž˜ ๋ฐ›์•„์˜ค๋”๋ผ

Bearer์„ ๋ถ™์—ฌ์•ผํ•˜๋Š” ์ด์œ ์™€ ์—‘์„ธ์Šคํ† ํฐ์˜ ์ข…๋ฅ˜๋Š” ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•˜์ž


์„œ๋ฒ„ ํ†ต์‹ ์šฉ ํ—ค๋”์— ์—‘์„ธ์Šคํ† ํฐ ์ถ”๊ฐ€ (feat. axios)

์ด์ œ ์„œ๋ฒ„ํ†ต์‹ ์„ ํ•  ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ ํ—ค๋”์— ์—‘์„ธ์Šคํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณด๋‚ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ทผ๋ฐ.. ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์— ์“ฐ์ด๋Š”, ์ฆ‰ ์—‘์„ธ์Šคํ† ํฐ์„ ํฌํ•จ์‹œ์ผœ์•ผ ํ•  api๊ฐ€ ์•„์ฃผ ๋งŽ์€๋ฐ ๊ทธ ๋ชจ๋“  api์— ์ €๋ ‡๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜ ์—‘์„ธ์Šคํ† ํฐ์„ ํฌํ•จ์‹œํ‚ค๊ณ  ์‹ถ์ง€ ์•Š๋‹ค.

๊ทธ๋ƒฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ค๋”์— ์—‘์„ธ์Šคํ† ํฐ์ด ์„ธํŒ…๋˜์–ด ์žˆ์œผ๋ฉด ํŽธํ•  ๊ฒƒ ๊ฐ™๋‹ค.

axios.create()๋ฅผ ์ด์šฉํ•˜์—ฌ ์•„๋ž˜์ฒ˜๋Ÿผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ปค์Šคํ…€ํ•ด์ฃผ์ž.
baseURL๋„ ์„ธํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ด์ œ api๊ฒฝ๋กœ๋„ baseURL ์ค‘๋ณต ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

์ปค์Šคํ…€ ์ธ์Šคํ„ด์Šค๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜๋Š” getAccesstoken()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์—์„œ ์—‘์„ธ์Šคํ† ํฐ์„ ๊บผ๋‚ด๊ณ  ์ด ํ† ํฐ์„ interceptors๋กœ ๊ธฐ๋ณธ ํ—ค๋”์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ํฌ์ฆˆํ”ผ์ปค ํ”„๋กœ์ ํŠธ๋Š” ๋กœ๊ทธ์ธ ์—†์ด(์ฆ‰ ์—‘์„ธ์Šคํ† ํฐ ์—†์ด๋„) ํ†ต์‹ ํ•˜๋Š” Api๋„ ๊ฝค ์žˆ์–ด์„œ ์ด api๋“ค์€ ๋”ฐ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค (publicApi์™€ privateApi๋กœ ๋‚˜๋‰จ)


์„ธ์…˜ ๋งŒ๋ฃŒ์‹œ ์ž๋™ ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„

์œ„์—์„œ ์‚ฌ์šฉํ•œ axiosInstance๋ฅผ ์ž˜ ์„ธํŒ…ํ•˜๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋กœ ์„œ๋ฒ„ ํ†ต์‹ ์„ ํ•  ๋•Œ ๋งˆ๋‹ค ํŠน์ • ์‘๋‹ต์— ๋Œ€ํ•ด ํŠน์ • ํ–‰๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค

์ด๋ ‡๊ฒŒ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ํ†ต์‹ ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋œจ๋ฉด alert์ฐฝ์ด ๋œจ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ ์•ˆ์—์„œ ํŠน์ •์—๋Ÿฌ(์—ฌ๊ธฐ์„œ๋Š” ์„ธ์…˜๋งŒ๋ฃŒ์ธ 415์—๋Ÿฌ)๋ฅผ ๋ถ„๊ธฐ์ฒ˜๋ฆฌํ•ด์„œ ๋‹ค๋ฅธ alert์ฐฝ์„ ๋„์›Œ์ฃผ๊ณ  ๋กœ๊ทธ์•„์›ƒ์„ ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ interceptors.request.use์™€ interceptors.response.use๊ฐ€ ๋‹ค๋ฅด๋‹ˆ ์ž˜ ๊ตฌ๋ถ„ํ•ด์„œ ์“ฐ์ž

axios.interceptors.request.use(
  (config) => {
	...
    return config;
  },
  (error) => {
    ...
    return Promise.reject(error);
  }
);

// ์œ„์™€ ๋‹ค๋ฆ„
axios.interceptors.response.use(
  (config) => {
	...
    return config;
  },
  (error) => {
    ...
    return Promise.reject(error);
  }
);

๋‚œ ๋ถ„๋ช… ๋ฆด๋ฆฌ์ฆˆ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ คํ–ˆ๋Š”๋ฐ..
์–ด์ฉŒ๋‹ค ์ด๋Ÿฐ ์ •๋ณด์„ฑ ํฌ์ŠคํŒ…์„..

profile
๊น€์„ ๋‹ฌ ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ

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