๐Ÿ’ป TIL 23.03.13

๊น€์˜์šฐ(Yeongwoo Kim)ยท2023๋…„ 3์›” 16์ผ
0
post-thumbnail

โ—๏ธ๋ฌธ์ œ

  • ์šฐ๋ฆฌ๋Š” ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ JWT๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

    JWT(JSON WEB TOKEN)๋ž€ ์›น์—์„œ ์‚ฌ์šฉ๋˜๋Š” JSON ํ˜•์‹์˜ ํ† ํฐ์— ๋Œ€ํ•œ ํ‘œ์ค€ ๊ทœ๊ฒฉ์œผ๋กœ, ์ฃผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ๋˜๋Š” ์ธ๊ฐ€ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ„์— ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

  • ๋กœ๊ทธ์ธ ์ธ์ฆ ๋ฐฉ์‹์—์„œ localhost์™€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

    auth ํŽ˜์ด์ง€์—์„œ ์•Œ๋งž๋Š” ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ „์†กํ•œ๋‹ค๋ฉด, JWT๋ฅผ cookie์— ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ํ˜•์‹์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

    • 'api.xxx.xxx/xxx'์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ํ•ด๋‹น ํŽ˜์ด์ง€์— JWT๊ฐ€ ์™€์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์—†๋‹ค๋ฉด 401 ERROR๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค.
    • ์ด๋•Œ, cookie์˜ ์„ธํŒ…์— Same-site:none, Secure:true๋กœ ์„ค์ •ํ•จ์œผ๋กœ์จ http์—์„œ๋Š” ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๊ฒŒ ํ–ˆ๋‹ค.

    ํ•˜์ง€๋งŒ localhost:3000/์€ https๊ฐ€ ์•„๋‹Œ http ์‚ฌ์ดํŠธ๋กœ ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ์ •๋ณด๋ฅผ ๋ฐ›์ง€ ๋ชปํ•ด์„œ local ํ™˜๊ฒฝ์—์„œ api๋ฅผ ์š”์ฒญํ•˜๋ฉด 401 ERROR๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

    ๐Ÿ” ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

  • MSW(Mock Service Worker) ๋„์ž…

    MSW๋ž€, API Mocking ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์„œ๋ฒ„ํ–ฅ์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ๋ชจ์˜ ์‘๋‹ต(Mocked response)์„ ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, Mock Service Worker(MSW) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•˜๋ฉด, Mock ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜์ง€ ์•Š์•„๋„ API๋ฅผ ๋„คํŠธ์›Œํฌ ์ˆ˜์ค€์—์„œ Mocking ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ฐธ์กฐ : Mocking์œผ๋กœ ์ƒ์‚ฐ์„ฑ๊นŒ์ง€ ์ฑ™๊ธฐ๋Š” FE ๊ฐœ๋ฐœ

    • ์ฆ‰ ์ •๋ฆฌํ•˜์ž๋ฉด, ๊ธฐ์กด์˜ API์„œ๋ฒ„์— ์š”์ฒญ์€ ๋ณด๋‚ด์ง€๋งŒ, local ์„œ๋ฒ„์—์„œ๋Š” ์ง€์ •ํ•ด๋‘” Mock Data๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ API ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑˆ ๋’ค ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ˜ฉ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ์ง€๋‚œ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์šฐ๋ฆฌ๋Š” SEO๋ฅผ ์œ„ํ•ด์„œ NEXT.JS์˜ SSG ๋žœ๋”๋ง ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ MSW๋ฅผ ๋„์ž…ํ•ด์„œ ์ž‘์—…์„ ํ•˜๋Š”๋ฐ MSW๊ฐ€ API์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ธฐ ์ „์— pre-rendering์— ์˜ํ•ด ์ด๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ๋ฐ›์•„ ์ถœ๋ ฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— MSW๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด๋‹ค.

  • ์•ž์œผ๋กœ Back-end์™€ Front-end์—์„œ ์ž‘์—…์†๋„๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” MSW๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์•ฝ์†๋œ ์ƒํƒœ์—์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ง๋ฉดํ•ด์„œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ํŒ€์›๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆด๋‹ค.

  • ๊ทธ ๊ฒฐ๊ณผ ์šฐ๋ฆฌ๋Š” ๊ทธ๋™์•ˆ ์ž‘์—…ํ–ˆ๋˜ Next.Js๋ฅผ ํฌ๊ธฐํ•˜๊ณ  React.Js๋กœ migrationํ•œ ๋’ค CSR ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐Ÿ™ Migration ํ–ˆ์„ ๋•Œ ๋ฌธ์ œ์ ์€ ์—†์„๊นŒ?

  • Next.Js์—์„œ React.Js๋กœ ์˜ฎ๊ธฐ๊ธฐ๋กœ ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์‹ ๊ฒฝ์“ฐ์˜€๋˜ ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์™œ? Next๋ฅผ ์„ ํƒํ–ˆ์ง€? ํ•ด๋‹น ์งˆ๋ฌธ์˜ ๋‹ต์€ ์ „ ๊ฒŒ์‹œ๋ฌผ์— ์žˆ๋‹ค.

    ์Šคํ„ฐ๋””๋‹ˆ๊นŒ SEO๊ฐ€ ๊ผญ ํ•„์š”ํ•˜์ง€ ์•Š๋‚˜์š”? ๊ทธ๋Ÿฌ๋ฉด ์ €ํฌ SSR์ด๋‚˜ SSG๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋Š”๊ฒŒ ์–ด๋–จ๊นŒ์š”?!

  • ๋งž๋‹ค. ์šฐ๋ฆฌ๋Š” SEO์— ๋„์›€์ด ๋˜๋Š” SSR ๋˜๋Š” SSG๋ฅผ ์„ ํƒํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ CSR์„ ์„ ํƒํ•˜๋ฉด SEO๋ฅผ ํฌ๊ธฐํ•ด์•ผํ•˜๋‚˜...๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ํ•ด๋‹น ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ฒ€์ƒ‰์„ ํ–ˆ๋‹ค.

  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์šฐ๋ฆฌ๋Š” ํ•ด๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, AWS์˜ S3๋ฅผ ์ด์šฉํ•ด ๋ฐฐํฌ๋ฅผ ํ•˜๊ณ , Cloud Front์˜ Ramda@Edge๋ฅผ ์ด์šฉํ•˜๋ฉด CSR์—์„œ ๋ถ€์กฑํ•œ SEO ์ตœ์ ํ™”๋ฅผ ๋„์™€์ค€๋‹ค๋Š” ๊ธ€์„ ์ฝ์—ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์€ ์ถ”ํ›„์— ๊ณต๋ถ€๋ฅผ ํ•œ ๋’ค์— ๋‚จ๊ธธ ์˜ˆ์ •์ด๋‹ค.

๐Ÿฅฒ Next ์•ˆ๋…•...

profile
์ฐจ๊ทผ์ฐจ๊ทผ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค

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