Skip to main content Link Search Menu Expand Document (external link)

미팅을 진행할 때 서버측에서 CORS를 허용하지 않아, 개발에 문제가 발생하였다고 한다.

CORS 에 대한 자세한 설명은 인터넷에 많이 나와있다.

설명은 잘 나와 있지만, 해결 방법에 대해서는 자세히 나와있지가 않다.

그래서 작성하게 되었다.

CORS 란 무엇인가

클라이언트가 서버에 API 를 요청했을 때 도메인이 다른 경우 브라우저에서 차단하는 보안이다.

  • 서버에서 서버로 요청할 경우 CORS 는 발생하지 않는다.
  • 포스트맨에서 요청할 경우 CORS 는 발생하지 않는다. (포스트맨은 브라우저가 아니니까)

도메인이 다른 경우의 예시

# 도메인이 다르다.
"https://kspark.link": "https://kkyungvelyy.com"

# 서브 도메인이 다르다.
"https://front.kspark.link": "https://api.kspark.link"

CORS 해결 방법

CORS 를 해결하는 방법은 3가지가 있다. (내가 알고있는 방법)

  • Proxy 를 통해 클라이언트와 서버의 도메인을 동일하게 만든다.
  • Nginx, Apache 등 웹 엔진에서 클라이언트의 도메인을 허용한다. (Response Header 에 추가)
  • 서버에서 클라이언트의 도메인을 허용한다. (Response Header 에 추가)

개발할 때 CORS 임시 허용하기

크롬을 사용한다면, 크롬 확장도구를 사용한다.

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

module.exports = function (app) {
  // 'http://localhost/api' 로 요청하면 'http://apiserver:5000/api' 에 도착하게 된다.
  app.use(
    "/api",
    createProxyMiddleware({
      target: "http://apiserver:5000",
      changeOrigin: true,
      ws: true,
    })
  );
  // 웹소켓은 약간 다르다.
  app.use(
    createProxyMiddleware(["/socket.io"], {
      target: "http://apiserver:5000",
      changeOrigin: true,
      ws: true,
      router: {
        "/socket.io": "ws://apiserver:5000",
      },
    })
  );
};
  • package.json 에 프록시 추가하기
  // package.json
  {
  ...,
  "proxy": "http://apiserver.com:5000",
  ...,
  }