브라우저에서 기본적으로 API를 요청할 때, 브라우저의 현재 주소와 API의 주소 도메인이 일치해야만 데이터에 접근할 수 있다. 만약 다른 도메인에서 API를 요청해서 사용할 수 있게 해주려면 CORS설정이 필요하다.
: 교차출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 "브라우저"에서 알려주는 체제
: 웹 콘텐츠의 출처(Origin)는 접근할 때 사용하는 ①.URL의 스킴(프로토콜), ②.호스트(도메인), ③.포트로 정의된다. 두 객체에서 3가지가 일치하는 경우 같은 출처를 가졌다고 말한다. 일부 작업은 동일 출처 콘텐츠로 제한되나, CORS를 통해 제한을 해제할 수 있음
로컬환경에서 개발한 앱은 기본적으로 localhost:3000
으로 사작한다. 그러나 나중에 로컬환경에서 개발한 실제 서비스, 프로젝트의 클라이언트에서 서버의 API로 요청하게 되면, 이 포트로 요청하는 것이 차단됨
➡️ 개발할 당시에는 이 현상이 굉장이 귀찮은 일로 느껴질 수 있지만, 실제로 개발한 서비스 & 프로젝트가 모든 출처의 접근을 허락한다면 이는 큰 문제로 야기될 수 있음
만약 실제 서비스가 되는 상용앱을 운영 중이라면, 구축한 클라이언트 뒤의 서버와 연결되어 있는 DB에는 라이브 데이터(live data)가 쌓일 것
: 실제 서비스 되고 있는 앱의 데이터베이스(Dat Base, DB)에 적재되고 있는 데이터를 의미 ( 유저 및 상품, 결제 등 다양한 정보들)
이런 라이브 데이터는 민감성이 높은 데이터들 위주 ➡️ 보안이 매우매우 중요!
그러나 서비스 & 프로젝트가 모든 출처의 접근을 허락한다면, 이러한 보안성이 현저히 낮아지고, 해킹 위험에 그대로 노출되게 됨...
따라서, 모든 도메인을 허용해서는 안되고, "특정"도메인을 허용하도록 구현해야함
: 클라이언트가 자신을 통해서 다른 트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템 & 응용프로그램을 가리킴
그러나 위 과정 없이 React 라이브러리, 혹은 Webpack Dev Server에서 제공하는 proxy 기능을 사용하욘 CORS 정책을 우회할 수 있다. (별도의 응답 헤더를 받을 필요 없음)
위 그림은 proxy를 적용해 브라우저를 속이기 전 흐름
위 그림은 proxy를 적용해 브라우저를 속인 후 흐름
먼저 webpack dev server
에서 제공하는 proxy 기능을 사용하는 방법
webpack dev server
의 proxy를 사용하게 되면, 브라우저 API를 요청할 때 백엔드 서버에 직접 요청을 하지 않고, 현재 개발서버의 주소로 우회요청을 하게 됨"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 주소"
}
proxy는 보통 맨 밑에 작성을 함
그리고 기존 fetch 혹은 axios를 통해 요청하던 부분에서 도메인 부분을 제거
// 제거하기 전
export async function getAllfetch() {
const response = await fetch('우회할 api주소/params');
.then(() => {
...
})
}
// 제거한 후
export async function getAllfetch() {
const response = await fetch('/params');
.then(() => {
...
})
}
webpack dev server에서 제공하는 proxy는 전역적인 설정이기 때문에, 종종 해당 방법이 충분히 적용되지 않는 경우 발생
➡️ 수동으로 proxy를 적용해줘야 하는 경우가 있는데, 이때는 http-proxy-middleware
라이브러리를 사용해야 함
http-proxy-middleware
라이브러리 설치npm install http-proxy-middleware --save
const {createProxyMiddleware} = require('http-proxy-middleware');
module.export = function(app) {
app.use(
'/api', // proxy가 필요한 path parameter를 입력
createProxyMiddleware({
target: 'http://localhost:5000', // 타겟이 되는 api url를 입력
changeOrigin: true, // 대상 서버 구성에 따라 호스트 헤더가 변경되도록 설정
})
);
};
export async function getAllfetch() {
const response = await fetch('우회할 api주소/params');
.then(() => {
...
})
}
export async function getAllfetch() {
const response = await fetch('/params');
.then(() => {
...
})
}