React를 이용해서 SNS를 만드는 강의를 들으며 Client는 3000포트, Back Server는 3065포트를 사용해서 개발을 했더니 CORS에러가 발생하였다. 강의를 들으며 대충 이해를 하고 해결하긴 했지만 웹 개발자라면 꼭 알고있어야 하는 개념이기 때문에 제대로 다뤄볼 것이다🏃♂️
CORS는 Cross-Origin Resource Sharing의 약자로 직역하면 교차 출처 자원의 공유
이다.
브라우저간 데이터를 주고받는 과정에서 도메인의 이름이 서로 다른 사이트간에 사전에 공유 설정을 하지 않은채로 API 요청이 발생하면 CORS 에러가 발생하게 된다.
내 경우엔 Client : 3000포트
, Server : 3065포트
였고 Client가 Server에 API를 요청했지만 연결이 차단되며 CORS 에러가 발생하게 된 것이다. 이러한 에러는 둘의 포트가 다르거나, 도메인이 다르거나, 아이피가 다르면 발생하게 된다.
이러한 에러가 존재하는 이유는 Client가 무분별하게 다른 resource에 접근하는 것을 막기 위해서 이다.
Access-Control-Allow-Origin는 Server쪽에서 요청에 응답할때 설정해주는 것이다.
Router 안에 직접 입력
// http://localhost:3000의 접근만 허용
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
// 모든 도메인의 접근을 허용
res.setHeader('Access-Control-Allow-Origin', '*');
두가지 방식으로 적을 수 있지만 되도록이면 특정 도메인을 입력하는 것이 위험성이 적다.
Cors 라이브러리 사용
const express = require('express');
const cors = require('cors');
const app = express();
// 기본 설정
app.use(cors());
// 직접 특정 도메인 설정
app.use(cors({
origin: 'http://localhost:3000'
}));
npm i cors
를 통해 라이브러리를 설치 한 후 app.js
에 다음과 같은 코드를 작성해주면 Access-Control-Allow-Origin 설정이 가능하다!
Proxy는 Client쪽에서 요청을 보낼때 직접 Server로 보내는 것이 아니라 Proxy Server를 거쳐서 최종 Server에 도달하는 것을 의미한다. 즉 Client의 실제 IP와 포트번호를 알 수 없도록 하는 것이 Proxy의 역할이다.
http-proxy-middleware 라이브러리 사용
// src/setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app){
app.use(
createProxyMiddleware('/api', {
target: 'http://localhost:3065',
changeOrigin: true
})
)
};
npm i http-proxy-middleware
를 통해 라이브러리를 설치 한 후 src/setupProxy.js
에 다음과 같은 코드를 작성해주면 Proxy 설정이 가능하다!
위 코드가 의미하는 것은 /api
라는 주소로 요청을 보낼 땐 Server와 같은 http://localhost:3065
로 바꿔서 요청을 보낸다는 의미이다. 따라서 3000포트 였던 Client가 Proxy를 거쳐 Server와 같은 3060포트가 되는 것이다.