Solve Problem/Deep Dive

์›น๊ณผ React Native์—์„œ CORS๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ? (+2024๋…„ 12์›” ๊ทผํ™ฉ)

์•ˆ๋‹คํฌ 2024. 12. 16. 15:59
728x90

๐Ÿ‘€๋ณธ๋ก ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „, ๊ทผํ™ฉ์„ ๋จผ์ € ๊ณต์œ ํ•˜๊ฒ ๋‹ค!

 

๊ทผํ™ฉ

2024๋…„ 11์›”๋ถ€ํ„ฐ ํ•œ๊ตญ์–ด๋Šฅ๋ ฅ์‹œํ—˜ ๋ชจ์˜ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ [TopikOn]์—์„œ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋งก๊ณ ์žˆ๊ณ , 2025๋…„ 1์›” ์ถœ์‹œ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ ์žˆ๋‹ค. [๋‚˜๋ฅผ ํฌํ•จํ•œ ํ”„๋ก ํŠธ 2๋ช… + ๋ฐฑ์—”๋“œ 1๋ช… + ๋””์ž์ด๋„ˆ 1๋ช… + ๊ธฐํš์ž 1๋ช… + ํ’€์Šคํƒ/๊ธฐํš/๋งค๋‹ˆ์ € 1๋ช…] = ์ด 6๋ช…๊ณผ ํ•จ๊ป˜ํ•œ๋‹ค.

๋ชจ๋‘๊ฐ€ ๋ฆฌ๋ชจํŠธ๋กœ ์ผํ•˜์ง€๋งŒ ๊ฐ€๋”์€ ๊ฒŒ๋”๋ฅผ ์ผœ๋†“๊ณ  ํ•˜๋ฃจ์ข…์ผ ๊ฐ™์ด ์žˆ๋Š” ๊ธฐ๋ถ„์„ ๋Š๋ผ๋ฉฐ ์ฝ”๋”ฉํ•  ๋•Œ๋„ ์žˆ๋‹ค. ๋•๋ถ„์— ๋ฐด์ฟ ๋ฒ„์—์„œ ์™ธ๋กญ์ง€ ์•Š๊ฒŒ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹คใ…Žใ…Ž

 

๊ธฐ์ˆ ์Šคํƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

- ํ”„๋ก ํŠธ์—”๋“œ: React Native + Next.js

- ๋ฐฑ์—”๋“œ: NestJS

 

React Native๋กœ๋Š” ์ด๋ฏธ [๋ฃจ๋น—]์—์„œ ์„œ๋น„์Šค ์šด์˜์„ ๊ฒฝํ—˜ํ•˜๊ณ  [ํŒจ์ŠคํŠธ์บ ํผ์Šค ๊ฐ•์˜](์ ‘์† ์•ˆ๋˜๋ฉด ์ด ๋งํฌ)๊นŒ์ง€ ์ดฌ์˜ํ•ด๋ณด์•˜์ง€๋งŒ,

Next.js๋ฅผ ํ™œ์šฉํ•œ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์€ ์ฒ˜์Œ์ด๋ผ ์›น์— ๊ด€๋ จ๋œ ์ง€์‹์ด ๋ถ€์กฑํ•จ์„ ๋Š๋ผ๊ณ  ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์•„์ฃผ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์ฃผ์ œ๋กœ ๊ธ€ ๋ฐœํ–‰์„ ํ•  ์˜ˆ์ •์ด๋‹ค.

๋‹จ์ˆœํžˆ ๊ฐœ๋…์„ ๋‚˜์—ดํ•˜๊ธฐ๋ณด๋‹จ ํ˜„์—…์—์„œ์˜ ์—ฐ๊ด€์„ฑ์„ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.


 

์˜ค๋Š˜์€ ์›น๊ณผ React Native์—์„œ์˜ CORS ์ฐจ์ด์— ๋Œ€ํ•ด ์งง๊ฒŒ ๋‹ค๋ค„๋ณธ๋‹ค.

 

CORS (Cross-Origin Resource Sharing)

๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ ์ •์ฑ…์„ ์ดํ•ดํ•  ๋•Œ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฐœ๋…์ด๋‹ค.

CORS๋Š” ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…(Same-Origin Policy)์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ฐ„์˜ ์š”์ฒญ์ด ์ œํ•œ๋˜๋Š” ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

 

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์˜ ๋ฐฑ์—”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜์–ด์žˆ์„๊นŒ?

์™€์ผ๋“œ์นด๋“œ(*)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ถœ์ฒ˜๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒ€์›์—๊ฒŒ ์งˆ๋ฌธํ–ˆ๋‹ค.

 

ํŽธ์˜๋ฅผ ์œ„ํ•ด ํ—ˆ์šฉ๋˜์–ด์žˆ๊ฒ ๋‹ค๋งŒ, ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ๋„๋ฉ”์ธ๋งŒ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋ก ํŠธ ์›น๋ทฐ์—์„œ ์š”์ฒญํ•˜๋Š” ๋„๋ฉ”์ธ์ด https://www.yourapp.com์ด๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ—ˆ์šฉํ•  ๋„๋ฉ”์ธ์„ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜์—ฌ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ๋“ฑ๋กํ•œ๋‹ค.

app.enableCors({
  origin: ["https://www.yourapp.com"],
  ...
});

 

ํ•˜์ง€๋งŒ ์›น ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ์ปฌํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„๋กœ API๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผํ•  ๋• ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿด ๋• ํ”„๋ก์‹œ(proxy)๋ฅผ ์‚ฌ์šฉํ•ด Header์˜ Host๋ฅผ ์ˆ˜๋™์œผ๋กœ ์š”์ฒญํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ํ—ˆ์šฉํ•œ ๋„๋ฉ”์ธ์—์„œ ๋ณด๋‚ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ถ”์ฒœํ•˜์ง€ ์•Š์Œ.)

๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„์—์„œ๋Š” APIํ‚ค, JWTํ† ํฐ ๋“ฑ์˜ ์ถ”๊ฐ€ ์ธ์ฆ๋ฐฉ์‹์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๊ฒ€์ฆํ•˜๋Š” ๋“ฑ ๋‹ค์ค‘ ๋ณด์•ˆ ๋ ˆ์ด์–ด๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๊ฒ ๋‹ค.

 

๐Ÿค” ๊ทธ๋Ÿฐ๋ฐ ๋˜ ํ•˜๋‚˜ ์ƒ๊ธฐ๋Š” ๊ถ๊ธˆ์ฆ.

React Native์—์„œ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋Š” ๊ฑด CORS์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๊ฑธ๊นŒ?

 

๊ทธ๋ ‡๋‹ค. React Native๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์— Origin ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ถœ์ฒ˜(Origin)๋ผ๋Š” ๊ฐœ๋…์ด ์ ์šฉ๋˜์ง€ ์•Š์•„ CORS ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ€์‹  ๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(fetch, axios)๋ฅผ ํ†ตํ•ด ์š”์ฒญ์ด ์ง์ ‘ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋„๋ฉ”์ธ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด, ์ถ”๊ฐ€์ ์ธ ์ธ์ฆ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ฒ€์ฆ์ด ํ•„์š”ํ•˜๊ฒ ๋‹ค. ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” JWTํ† ํฐ์ฒ˜๋Ÿผ.

 

๋งˆ๋ฌด๋ฆฌ

Native ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณด์•ˆ ๋ชจ๋ธ๊ณผ ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜๋‹ค.

'๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…(Same-Origin Policy)'๊ณผ ์ด๋ฅผ ๋Œ€์‘ ํ•˜๊ธฐ ์œ„ํ•œ CORS์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์•Œ๊ณ  ์‹ค์ œ ํ”„๋กœ๋•ํŠธ์—์„œ ๋””๋ฒ„๊น…, ํ”„๋ก์‹œ, ๊ทธ๋ฆฌ๊ณ  ๋ณด์•ˆ ์ธ์ฆ ๋ฐฉ์‹(JWT, API ํ‚ค ๋“ฑ)๊ณผ ๊ฐ™์€ ์‹ค์ „ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ์„ ๊ทน๋ณตํ•ด์•ผํ•œ๋‹ค.

 

์˜ค๋Š˜์€ ์—ฌ๊ธฐ์„œ ๋!๐Ÿซก

์ถœ์ฒ˜: https://mingos-habitat.tistory.com/34 [๋ฐ๊ณ ์˜์„œ์‹์ง€:ํ‹ฐ์Šคํ† ๋ฆฌ]