๐๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ๊ธฐ ์ , ๊ทผํฉ์ ๋จผ์ ๊ณต์ ํ๊ฒ ๋ค!
๊ทผํฉ
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 ํค ๋ฑ)๊ณผ ๊ฐ์ ์ค์ ๊ธฐ์ ์ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๋ณด์์ ๊ทน๋ณตํด์ผํ๋ค.
์ค๋์ ์ฌ๊ธฐ์ ๋!๐ซก