Skip to content

Latest commit

Β 

History

History
123 lines (84 loc) Β· 2.96 KB

07-cors-and-env-setup.md

File metadata and controls

123 lines (84 loc) Β· 2.96 KB

CORS μ„€μ •κ³Ό ν™˜κ²½λ³€μˆ˜

πŸ’‘ CORS(Cross-Origin Resource Sharing)

  • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ‹€λ₯Έ λ„λ©”μΈμ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  λ•Œ λ°œμƒν•˜λŠ” λ³΄μ•ˆμƒμ˜ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€.
  • 예λ₯Ό λ“€μ–΄, ν”„λ‘ νŠΈμ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ http://localhost:3000 μ—μ„œ μ‹€ν–‰ 쀑이고, λ°±μ—”λ“œ API μ„œλ²„κ°€ http://localhost:4000 μ—μ„œ λ™μž‘ 쀑이라면,
    이 λ‘˜μ€ μ„œλ‘œ λ‹€λ₯Έ λ„λ©”μΈμœΌλ‘œ κ°„μ£Όλ˜μ–΄ CORS λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

둜컬 개발 ν™˜κ²½μ—μ„œ CORS μ„€μ •

둜컬 ν™˜κ²½μ—μ„œ ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œ κ°„ API 호좜 μ‹œ CORS λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.
이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ°±μ—”λ“œμ— CORS 섀정을 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

export default function App() {
	const [data, setData] = useState("");

	useEffect(() => {
		fetch(`${import.meta.env.VITE_API_SERVER}/api/hello`)
			.then((response) => response.json())
			.then((data) => setData(JSON.stringify(data)));
	}, []);

	// ...

	return (
		// ...
		<p>
			/api/hello: <code>{data}</code>
		</p>
		// ...
	);
}

이 μ½”λ“œλ₯Ό μž‘μ„±ν•œ λ’€ ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄, 개발자 도ꡬ μ½˜μ†”μ— λ‹€μŒκ³Ό 같은 μ—λŸ¬κ°€ λ‚˜νƒ€λ‚  것이닀

Access to fetch at 'http://localhost:4000/api/hello' from origin 'http://localhost:3000' has been blocked by CORS policy.

λ°±μ—”λ“œ CORS μ„€μ •

express.jsλ₯Ό μ‚¬μš©ν•˜λŠ” λ°±μ—”λ“œμ— CORS 섀정을 μΆ”κ°€ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

  1. CORS 라이브러리 μ„€μΉ˜

    cd ~/git/backfront/backend
    npm install cors
    
  2. app.js 파일 μˆ˜μ •

    const cors = require("cors");
    
    // ...
    
    app.use(cors());
  3. μ„œλ²„ μž¬μ‹œμž‘ ν›„ 확인

    npm start
    

VITE ν™˜κ²½λ³€μˆ˜λ₯Ό μ΄μš©ν•œ 동적인 λΉŒλ“œ

ν™˜κ²½λ³„ μ„€μ •μ˜ ν•„μš”μ„±

둜컬 개발 ν™˜κ²½μ—μ„œλŠ” ν”„λ‘ νŠΈμ—”λ“œ(3000 포트)와 λ°±μ—”λ“œ(4000 포트)κ°€ μ„œλ‘œ λ‹€λ₯Έ λ„λ©”μΈμ—μ„œ μ‹€ν–‰λ˜μ§€λ§Œ, 배포 ν™˜κ²½μ—μ„œλŠ” λ™μΌν•œ λ„λ©”μΈμ—μ„œ μ œκ³΅λœλ‹€.
이λ₯Ό μœ„ν•΄ ν™˜κ²½λ³€μˆ˜λ‘œ API μ„œλ²„ μ£Όμ†Œλ₯Ό λ™μ μœΌλ‘œ μ„€μ •ν•΄μ•Ό ν•œλ‹€.


ν™˜κ²½λ³€μˆ˜ μ„€μ •

  1. 둜컬 ν™˜κ²½ μ„€μ •

    frontend/.env.local νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ λ‚΄μš©μ„ μΆ”κ°€ν•œλ‹€.

    VITE_API_SERVER=http://localhost:4000
    
  2. μ½”λ“œ μˆ˜μ •

    frontend/src/App.tsx νŒŒμΌμ—μ„œ ν•˜λ“œμ½”λ”©λœ URL을 ν™˜κ²½λ³€μˆ˜λ‘œ λŒ€μ²΄ν•œλ‹€.

    useEffect(() => {
    	fetch(`${import.meta.env.VITE_API_SERVER}/api/hello`)
    		.then((response) => response.json())
    		.then((data) => setData(JSON.stringify(data)));
    }, []);
  3. μ„œλ²„μ—μ„œ ν™˜κ²½λ³€μˆ˜ μ„€μ •

    배포 ν™˜κ²½μ—μ„œλŠ” frontend/.env νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ λ‚΄μš©μ„ μΆ”κ°€ν•œλ‹€

    VITE_API_SERVER=
    
  4. μ„œλ²„ μž¬μ‹œμž‘

    ν™˜κ²½λ³€μˆ˜ λ³€κ²½ ν›„ μ„œλ²„λ₯Ό μž¬μ‹œμž‘ν•˜μ—¬ λ³€κ²½ 사항을 μ μš©ν•œλ‹€

    npm start