Origin 이란 URI 스키마(프로토콜), 호스트 이름(도메인), 포트 번호의 조합
Origin = Protocol + host (hostname + port)
예시)
Same-origin-policy
SOP에 의해 웹 브라우저는 하나의 웹 페이지에서 다른 웹 페이지의 데이터에 접근하기 위한 스크립트가 있을 때, 두 웹 페이지가 같은 origin일 때만 이를 허가합니다.
Cross-origin resource sharing
(사진출처:https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
위 플로우 차트를 보면 서버 응답에서 Access-Control을 확인합니다!
클라이언트 요청이 Bad Request가 아니어도, 서버가 허락한 origin에 클라이언트 origin이 없다면 에러가 발생하는 것이다!
Access-Control-Allow-Origin 과 관련한 에러 발생 시!
서버 쪽에 클라이언트에 origin 을 허락하도록 처리해주면 된다.
서버 코드가 Spring Boot로 작성되었다면 해당 Controller에
@CrossOrigin(origins="허용하고자 하는 origin")
추가하기!
개발자 모드를 켜서 확인해보면 이런 오류가 난다!!
그래서 내 경우에도
백엔드 개발자 분이
application.yml
client:
origins:
# dev: ${CLIENT_ORIGIN_DEV}
# prod: ${CLIENT_ORIGIN_PROD}
origins에 dev와 prod 둘 다 배포용 주소로 넣어주셨다고 하셨다.
따라서 로컬로 돌리려고 하니까 내 origin은 허용하지 않아서 오류가 난 것 이었다!
그래서 배포용은 prod이므로 dev는 내 로컬로 변경시켜주면 된다!
프록시 서버?
인터넷에서 유저를 대신해 데이터를 가져오는 서버,
클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해줌
package.json에 proxy 값을 설정
CRA로 생서한 프로젝트에서는, package.json에 proxy 값을 설정하여 proxy 기능을 활성화 하는 방법이 있다.
{
//...
"proxy": "http://localhost:4000"
}
저 주소에는 제가 접근하고자 하는 주소를 넣어주어야 합니다!
http-proxy-middleware 라이브러리를 사용하면 로컬 환경에 한해 CORS 에러를 해결할 수 있다.
setupProxy.js
const { createProxyMiddleware } = require("http-proxy-middleware");
module.exports = function (app) {
app.use(
"/api",
createProxyMiddleware({
target: "http://localhost:8080",
changeOrigin: true,
})
);
};
클라이언트 단에서 proxy를 설정하는 경우!!!!!!
서버에서 이미 Origin을 설정한 경우라면 소용없다...
제 경험담...^^
CORS 정책은 보안을 위해 브라우저에서 직접 적용되는 정책이기 때문에, 서버에서 특정 origin에서의 요청을 허용하도록 설정해두었다면 그 설정에 따라 브라우저가 동작하게 됩니다!
따라서 이 경우에는 서버 측 설정을 수정하여 문제를 해결해야 합니다.... 요점 명심하시길! ㅠ^ㅠ
프록시 서버 종류!
포워드 프록시 서버가 앞단에서 먼저 요청을 받은 후, 인터넷에 연결하여 그 결과를 클라이언트에게 전달(forward) 해준다.
클라이언트가 example.com 웹 서비스에 데이터를 요청하면 Reverse Proxy는 이 요청을 받아서 내부 서버에서 먼저 데이터를 받은 후에, 이 데이터를 클라이언트에게 전달.
[웹 개발]Origin(출처)란 무엇인가?
Origin, SOP 그리고 CORS
[CORS] CORS란? CORS 에러 해결하기
CORS 에러를 해결하는 방법, proxy 기능
[React + Node.js + Mongo DB Atlas] Netlify(프론트엔드 배포) + Elastic Beanstalk(백엔드 배포) 배포하고 연결하기