[HTTP/Network] Proxy

Hannahhhยท2022๋…„ 10์›” 13์ผ
0

HTTP/Network

๋ชฉ๋ก ๋ณด๊ธฐ
12/12

๐Ÿ‘€ CORS ์ •์ฑ…์˜ ํ•„์š”์„ฑ & CORS ์—๋Ÿฌ ๋ฐœ์ƒ ์ด์œ  ๋ฐ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•


๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ API๋ฅผ ์š”์ฒญ ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ ํ˜„์žฌ ์ฃผ์†Œ์™€ API ์˜ ์ฃผ์†Œ์˜ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•ด์•ผ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ API๋ฅผ ์š”์ฒญํ•ด์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ ค๋ฉด CORS ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.


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


๋ผ์ด๋ธŒ ๋ฐ์ดํ„ฐ(์‹ค์ œ ์„œ๋น„์Šค ๋˜๊ณ  ์žˆ๋Š” ์•ฑ์˜ DB์— ์ ์žฌ๋˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ)์™€ ๊ฐ™์ด ๋ฏผ๊ฐ์„ฑ์ด ๋†’์€ ๋ฐ์ดํ„ฐ๋“ค์€ ๋ณด์•ˆ์ด ๋งค์šฐ ์ค‘์š”ํ•œ๋ฐ, ์„œ๋น„์Šค๊ฐ€ ๋ชจ๋“  ์ถœ์ฒ˜์˜ ์ ‘๊ทผ์„ ํ—ˆ๋ฝํ•œ๋‹ค๋ฉด ๋ณด์•ˆ์„ฑ์€ ๋‚ฎ์•„์ง€๊ณ , ํ•ดํ‚น ์œ„ํ—˜์„ฑ์ด ๋†’์•„์ง„๋‹ค.
๋”ฐ๋ผ์„œ, ํŠน์ • ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

์ด๋•Œ, ์ •์„์ ์œผ๋กœ CORS ์ •์ฑ… ์œ„๋ฐ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ์‘๋‹ต ํ—ค๋”๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค.

์ฆ‰, ์„œ๋ฒ„์—์„œ ์ ์ ˆํ•œ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.(CORS Error)




๐Ÿ” Proxy


์œ„์™€ ๊ฐ™์€ ์ •์„์ ์ธ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ, React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ or Webpack Dev Server์—์„œ ์ œ๊ณตํ•˜๋Š” proxy ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ CORS ์ •์ฑ…์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ„๋„์˜ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ฐ›์„ ํ•„์š”์—†์ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ React ์•ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ , React ์•ฑ์—์„œ proxy๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ๋กœ ์ „๋‹ฌ(์šฐํšŒ ์š”์ฒญ)ํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์‘๋‹ต์„ proxy๋ฅผ ํ†ตํ•ด React ์•ฑ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.(์šฐํšŒ ์‘๋‹ต)
์ด ํ›„, React ์•ฑ์ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„ ๋Œ€์‹  ๋ธŒ๋ผ์šฐ์ €๋กœ ์žฌ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถœ์ฒ˜๊ฐ€ ๊ฐ™์•„์ง€๋ฏ€๋กœ, ๋ธŒ๋ผ์šฐ์ €๋Š” cors ์ •์ฑ…์„ ์œ„๋ฐ˜ํ•œ์ง€ ๋ชจ๋ฅด๊ฒŒ ๋œ๋‹ค.(๋ธŒ๋ผ์šฐ์ €๋ฅผ proxy ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์†์ด๋Š” ๊ฒƒ)



๐Ÿ‘€ Proxy ์‚ฌ์šฉ๋ฒ•


โœ” Webpack dev server proxy

Webpack dev server์˜ proxy ์‚ฌ์šฉ ์‹œ, ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ์ง์ ‘์ ์œผ๋กœ ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๊ณ , ํ˜„์žฌ ๊ฐœ๋ฐœ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋กœ ์šฐํšŒ ์š”์ฒญํ•œ๋‹ค.
์ดํ›„, Webpack dev server์—์„œ ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›์•„ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ ํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต์„ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Create React App์„ ํ†ตํ•ด ์ƒ์„ฑํ•œ React ํ”„๋กœ์ ํŠธ์—์„œ Webpack dev server์˜ proxy๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด, package.json ํŒŒ์ผ์—์„œ "proxy"๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

...
"browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
	"proxy" : "์šฐํšŒํ•  API ์ฃผ์†Œ" // ๋ณดํ†ต ๋งจ ๋ฐ‘์— ์ž‘์„ฑํ•˜์—ฌ ๊ธˆ๋ฐฉ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. 
}

์ดํ›„, ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ์กด์˜ fetch ๋˜๋Š” axios๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•˜๋˜ ์ฝ”๋“œ์—์„œ ๋„๋ฉ”์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•œ๋‹ค.

// ์ œ๊ฑฐ ์ „
export async function getAllfetch() {

    const response = await fetch('์šฐํšŒํ•  api์ฃผ์†Œ/params');
    .then(() => {
			...
		})
}

// ์ œ๊ฑฐ ํ›„
export async function getAllfetch() {

    const response = await fetch('/params');
    .then(() => {
			...
		})
}



โœ” http-proxy-middleware proxy(React Proxy)

Webpack dev server proxy๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, http-proxy-middleware ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜๋™์ ์œผ๋กœ proxy๋ฅผ ์ ์šฉํ•œ๋‹ค.

npm install http-proxy-middleware --save ๋ช…๋ น์–ด๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ ,

src ํด๋” ์•ˆ์—์„œ setupProxy.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์„ค์น˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ ๋‹ค์Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(
    '/api', //proxy๊ฐ€ ํ•„์š”ํ•œ path prameter
    createProxyMiddleware({
      target: 'http://localhost:5000', //ํƒ€๊ฒŸ์ด ๋˜๋Š” api url.
      changeOrigin: true, //๋Œ€์ƒ ์„œ๋ฒ„ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ํ˜ธ์ŠคํŠธ ํ—ค๋”๊ฐ€ ๋ณ€๊ฒฝ๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„
    })
  );
};

์ดํ›„, webpack dev server proxy ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋งˆ์ฐฌ ๊ฐ€์ง€๋กœ, ๊ธฐ์กด์˜ fetch ๋˜๋Š” axios๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•˜๋˜ ์ฝ”๋“œ์—์„œ ๋„๋ฉ”์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•œ๋‹ค.






Reference: ์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

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