Frontend/React

[React/Axios] ๐Ÿคฌ Axios message: 'Network Error'(CORS ์˜ค๋ฅ˜)

_์„ฑํ˜ธ_ 2022. 10. 30. 15:22
728x90
๋ฐ˜์‘ํ˜•

๐Ÿšจ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

AxiosError message: 'Network Error'

const userInfoPatch = async (userInfo) => {
    try {
      // url: ์„œ๋ฒ„ ์ฃผ์†Œ, id: ์‚ฌ์šฉ์ž ์•„์ด๋””, userInfo: ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ์ฒด
      await axios.patch(`${url}/member/${id}`, userInfo).then(() => {
        alert('์ˆ˜์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
      });
    } catch (error) {
      console.log(error);
    }
  };

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ๋Š” ๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์˜€๊ณ , ์„œ๋ฒ„ ์ธก์—์„œ ๋ถ„๋ช… ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ PATCH์— ๋Œ€ํ•ด ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ GET, POST, DELETE ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ์—ˆ๊ธฐ์— ๋”์šฑ ์ด์œ ๋ฅผ ์ฐพ๊ธฐ ์‰ฝ์ง€ ์•Š์•˜๋‹ค.

 

CORS(Cross-Origin Resource Sharing)๋ž€โ“

'๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ' ๋ผ๋Š” ๋œป์„ ๊ฐ€์ง€๋Š” ํ•ด๋‹น ์ •์ฑ…์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค์— request๋ฅผ ํ•  ๋•Œ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๊ต์ฐจ ์ถœ์ฒ˜ HTTP ์š”์ฒญ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

 

๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  (CORS) - HTTP | MDN

๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ (Cross-Origin Resource Sharing, CORS)๋Š” ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ

developer.mozilla.org

ex) ๋ฆฌ์•กํŠธ ์„œ๋ฒ„ http://localhost:3000, ์Šคํ”„๋ง ์„œ๋ฒ„ http://localhost:5000

๋ธŒ๋ผ์šฐ์ €๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์„œ๋ฒ„(๋ฆฌ์•กํŠธ, ์Šคํ”„๋ง)์— ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ CORS ์ •์ฑ…์˜ ์ด์œ ๋กœ Error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํด๋ผ์ด์–ธํŠธ์— proxy๋ฅผ ๋‘์–ด ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

ํ”„๋ก์‹œ(proxy) ์„œ๋ฒ„๋ž€โ“

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋Œ€์‹  ๋ฐ›์•„์ฃผ๋Š” ์—ญํ• 
  • ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ๋กœ ์ง์ ‘ ํ†ต์‹ ์„ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ์‚ฌ์ด์—์„œ ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ์ค‘๊ณ„ํ•˜๋Š” ์—ญํ• 

 

ํ”„๋ก์‹œ(proxy) ์„ค์ • ๋ฐฉ๋ฒ•

  1. http-proxy-middleware(์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ)
  2. package.json์— proxy ์ถ”๊ฐ€(create-react-app์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ๋งŒ ๊ฐ€๋Šฅ) โœ…

package.json

"proxy": "http://localhost:5000",

package.json ํŒŒ์ผ์— "proxy": "์„œ๋ฒ„ ๋„๋ฉ”์ธ" ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด proxy ์ฃผ์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  path๋งŒ ์ž…๋ ฅํ•œ๋‹ค. axios ์‚ฌ์šฉ ์‹œ '/member/์‚ฌ์šฉ์ž ์•„์ด๋””'๋ผ๊ณ  ํ•˜๋ฉด 'http://localhost:5000/member/์‚ฌ์šฉ์ž ์•„์ด๋””'๋กœ ๊ฐ€๊ฒŒ ๋œ๋‹ค.

const userInfoPatch = async (userInfo) => {
    try {
      // id: ์‚ฌ์šฉ์ž ์•„์ด๋””, userInfo: ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ์ฒด
      await axios.patch(`/member/${id}`, userInfo).then(() => {
        alert('์ˆ˜์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
      });
    } catch (error) {
      console.log(error);
    }
  };

 

๐Ÿ’ป ์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ

 

PROXY SERVER๋ž€?

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋Œ€์‹  ๋ฐ›์•„์ฃผ๋Š” ์—ญํ• ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ๋กœ ์ง์ ‘ ํ†ต์‹ ์„ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ์‚ฌ์ด์—์„œ ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ์ค‘๊ณ„ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.proxyimageํด๋ผ์ด์–ธํŠธ๊ฐ€

velog.io

 

๐Ÿคฌ CORS? ๊ทธ๊ฒŒ ๋ญ”๋ฐ !

์ฒซ ๋งŒ๋‚จ.. ๐Ÿ˜” - ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ณ ์ž ํ•˜์˜€๊ณ  ์ฝ”๋กœ๋‚˜ ๊ด€๋ จ API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋‘๊ณณ์˜ API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๊ณ  ๊ทธ์ค‘ ๊ตญ๋‚ด ํ˜„ํ™ฉ์€ ๊ตฟ๋ฐ”์ด์ฝ”๋กœ๋‚˜ ์—์„œ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ณ  pos

baegofda.tistory.com