๐Ÿ’ป My Work/๐Ÿ”ฅ React

[React/JS] CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ(์ด๋ฏธ์ง€ URL์„ API ์š”์ฒญ, ์ด๋ฏธ์ง€ URL๋กœ Blob, Blob๋กœ File ์ƒ์„ฑ)

Jaeseo Kim 2022. 11. 4. 22:40

https://velog.io/@zero-black/CORS-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-Reverse-Proxy-server-%EA%B5%AC%EC%B6%95-with-Nginx

 

CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ + Reverse Proxy server ๊ตฌ์ถ• with Nginx

์œ„์™€ ๊ฐ™์ด React์—์„œ ์™ธ๋ถ€ api๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ, CORS ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.CORS๋Š” Cross Origin Resource Sharing๋กœ, ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ฐ„์— ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ ธ๋Š” ๋™์ผ

velog.io

์œ„ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค!! โ˜บ๏ธโ˜บ๏ธ

 

 

 

https://avoc-o-d.tistory.com/90

 

[React/JS] Image URL์„ ํŒŒ์ผ ๊ฐ์ฒด(File object)๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

const convertUrlToFile = async (url) => { const response = await fetch(url); const data = await response.blob(); const filename = url.split("/").pop(); // url์—์„œ ํŒŒ์ผ๋ช… ์ถ”์ถœ const ext = url.split(".").pop(); // url์—์„œ ์ด๋ฏธ์ง€ ํ˜•์‹ ์ถ”์ถœ con

avoc-o-d.tistory.com

์šฐ์„  ์ €๋Š” Iimage URL๋กœ api์š”์ฒญํ•  ๋•Œ, CORS ์—๋Ÿฌ๋ฅผ ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค...

 

 

ํ•ด๊ฒฐํ•ด๋ด…์‹œ๋‹ค!!!!๐Ÿ˜‚๐Ÿ˜‚๐Ÿ˜‚

์•„๋ž˜๋Š” ๊ฒฐ๋ก ์ ์œผ๋กœ ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค..

import axios from 'axios'

const media = axios.create({
  baseURL: "/media/",
});

// url -> file ๊ฐ์ฒด
async function convertURLtoFile(url) {
    let result;
    
    const filename = url.split("/").pop(); // url์—์„œ file ์ด๋ฆ„ ์ถ”์ถœ
    await media.get(url, { responseType: "blob" }).then((res) => {
      // File ํ˜•์‹์— ๋งž๊ฒŒ ํŒŒ์ผ ์ƒ์„ฑ
      result = new File([res.data], filename, { 
        type: res.data.type,
      });
    });

    return result;
}

 

 

 

 

 

00. http-proxy-middleware ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ


npm install http-proxy-middleware

 

 

 

01. setupProxy.js ํŒŒ์ผ ์ƒ์„ฑ


src/setupProxy.js

๋ฐ˜๋“œ์‹œ src ํด๋”์˜ ๋ฐ”๋กœ ์•„๋ž˜์— setupProxy.js์„ ์ƒ์„ฑํ•˜์—ฌ์•ผ ํ”„๋ก์‹œ ์„ค์ •์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜š

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

module.exports = function (app) {
  app.use(
    "/media",
    createProxyMiddleware({
      target: ์š”์ฒญํ•  API ์ฃผ์†Œ,
      changeOrigin: true,
    })
  );
};

์ €๋Š” ์ด๋ฏธ์ง€ ์š”์ฒญ์„ ์œ„ํ•ด โœจ /media โœจ ์ดํ•˜ url๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ํ”„๋ก์‹œ ์„ค์ •์„ ํ•ด์คฌ์Šต๋‹ˆ๋‹ค.

 

 

 

02. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ - create


์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์„œ axios ์„ธํŒ…์„ ํ•ด์ค๋‹ˆ๋‹ค!

import axios from 'axios'

const media = axios.create({
  baseURL: "/media/",
});

// image url๋กœ API ์š”์ฒญ
media.get(url).then((res) => {
	// res ์š”์ฒญ ๊ฒฐ๊ณผ~~
});

 

 

 

 

03. ์ด๋ฏธ์ง€ url๋กœ API ์š”์ฒญ


import axios from 'axios'

const media = axios.create({
  baseURL: "/media/",
});

// url -> file ๊ฐ์ฒด
async function convertURLtoFile(url) {
    let result;
    
    const filename = url.split("/").pop(); // url์—์„œ file ์ด๋ฆ„ ์ถ”์ถœ
    await media.get(url, { responseType: "blob" }).then((res) => {
      // File ํ˜•์‹์— ๋งž๊ฒŒ ํŒŒ์ผ ์ƒ์„ฑ
      result = new File([res.data], filename, { 
        type: res.data.type,
      });
    });

    return result;
}

res ์ฝ˜์†” ๊ฒฐ๊ณผ

์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ณผ ๋ถ€๋ถ„!

๐Ÿ”ฅ { responseType: "blob" }
๋ฅผ ํ†ตํ•ด Blob ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
๐Ÿ”ฅ { type: res.data.type } ๋ฅผ ํ†ตํ•ด File์˜ type์„ Blob์˜ type ๊ทธ๋Œ€๋กœ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

{ responseType: "blob" }์„ ์•ˆ ํ•ด์ฃผ๋ฉด ์ด๋ ‡๊ฒŒ ๋ฐ”์ด๋„ˆ๋ฆฌ string์ด ์™€์š”!

 

 

 

 

 

๐Ÿ˜‚๐Ÿ˜‚๐Ÿ˜‚์˜(์›ํžˆ)๊ณ (ํ†ต๋ฐ›๋Š”)..CORS...๐Ÿ˜ญ๐Ÿ˜ญ๐Ÿ˜ญ