Nuxt 를 배워보자

CORS 에러가 도메인이 같고 포트가 틀려도 오류가나는가 ?

_Blue_Sky_ 2025. 2. 21. 22:07
728x90
네, CORS(Cross-Origin Resource Sharing) 에러는 도메인이 같더라도 포트가 다르면 발생할 수 있습니다. CORS 정책은 **origin(출처)**을 기준으로 동작하는데, 여기서 출처는 프로토콜(http, https 등), 도메인, 포트 번호의 조합으로 정의됩니다. 즉, 도메인이 동일하더라도 포트 번호가 다르면 브라우저는 이를 서로 다른 출처로 간주하고, 서버에서 적절한 CORS 헤더(예: Access-Control-Allow-Origin)가 설정되지 않았다면 CORS 에러가 발생합니다.
예시
  • http://example.com:8080에서 http://example.com:3000으로 요청을 보내면, 도메인(example.com)은 같지만 포트(8080 vs 3000)가 다르므로 브라우저는 이를 다른 출처로 인식합니다.
  • 이 경우 서버에서 Access-Control-Allow-Origin: http://example.com:8080처럼 요청 출처를 명시적으로 허용하거나, 와일드카드(*)를 사용해 모든 출처를 허용해야 합니다.
 
728x90
해결 방법
  1. 서버에서 CORS 설정 조정
    서버 응답에 적절한 헤더를 추가합니다. 예를 들어:
     
    Access-Control-Allow-Origin: http://example.com:8080
    또는 개발 중이라면 모든 출처를 허용하도록 설정:
     
    Access-Control-Allow-Origin: *
  2. 프록시 사용
    프론트엔드와 백엔드가 같은 도메인, 같은 포트로 보이도록 프록시 서버를 설정합니다. 예를 들어, 개발 환경에서 Webpack이나 Vite 같은 도구의 프록시 기능을 활용할 수 있습니다.
  3. 포트 통일
    가능하다면 프론트엔드와 백엔드를 동일한 포트에서 실행하도록 환경을 구성합니다(배포 환경에서 주로 사용).

그래! nuxt의 server 디렉토리에 로직을 올리고 /api/... 해도 오류가 안나던데?

 

 
오, 좋은 질문입니다! Nuxt에서 server 디렉토리에 API 로직을 올리고 /api/...로 호출했을 때 CORS 에러가 발생하지 않는 이유는 Nuxt의 서버 사이드 구조와 프록시 역할 때문입니다. 좀 더 자세히 설명해볼게요.
Nuxt의 server 디렉토리와 기본 동작
Nuxt 3에서 server 디렉토리는 서버 사이드 로직(예: API 엔드포인트)을 정의하는 데 사용됩니다. 예를 들어, server/api/hello.js 파일을 만들면 자동으로 /api/hello 엔드포인트가 생성됩니다. 이 엔드포인트는 Nuxt의 내장 서버(기본적으로 Nitro 기반)에서 실행되며, 클라이언트 요청은 Nuxt 서버가 중간에서 처리합니다.
이 과정에서 중요한 점은:
  • 클라이언트(브라우저)가 /api/...로 요청을 보내면, 이 요청은 별도의 외부 서버가 아니라 Nuxt 애플리케이션 자체로 가게 됩니다.
  • Nuxt 서버는 프론트엔드와 백엔드 로직을 하나의 출처(origin)에서 실행하므로, 브라우저 입장에서는 같은 도메인, 같은 포트에서 요청과 응답이 이루어지는 셈입니다.
왜 CORS 에러가 안 나는가?
CORS 에러는 다른 출처로 요청을 보낼 때 발생합니다. 하지만 Nuxt의 경우:
  1. 동일 출처: 프론트엔드(예: http://localhost:3000)와 server/api 엔드포인트(역시 http://localhost:3000/api/...)가 동일한 도메인과 포트에서 제공됩니다. 즉, 브라우저는 이를 "다른 출처"로 인식하지 않습니다.
  2. Nitro의 통합: Nuxt의 서버는 Nitro 엔진으로 구동되며, 클라이언트와 API 간의 요청을 내부적으로 라우팅합니다. 이 과정에서 별도의 외부 서버로 요청이 나가지 않으므로 CORS 정책이 적용될 일이 없습니다.
비교: 별도의 백엔드 서버와의 차이
만약 Nuxt 외부에 별도의 백엔드 서버(예: http://localhost:8080)를 두고, Nuxt 프론트엔드(http://localhost:3000)에서 그 서버로 요청을 보낸다면 포트가 다르기 때문에 CORS 에러가 발생할 가능성이 있습니다. 하지만 Nuxt의 server 디렉토리는 이런 구조가 아니라, 애플리케이션 내부에서 모든 요청을 처리하므로 문제가 없는 겁니다.
추가 확인 포인트
혹시 궁금증이 남을 수 있으니 몇 가지 확인해볼 만한 상황을 정리해 볼게요:
  • 개발 vs 프로덕션: 개발 환경(nuxt dev)에서는 기본적으로 모든 것이 localhost:3000에서 실행되지만, 프로덕션 환경에서 별도의 서버로 API를 분리했다면 CORS 설정이 필요할 수 있습니다.
  • 프록시 설정: 만약 외부 API를 호출하고 있는데도 CORS 에러가 안 난다면, nuxt.config.ts에 프록시 설정이 되어 있을 가능성이 있습니다. 예:
    serverMiddleware: [
      { path: '/api', handler: '~/server/api/index.js' }
    ],
    또는 Nitro의 프록시 기능을 통해 외부 요청을 내부처럼 처리했을 수도 있습니다.
결론
Nuxt의 server 디렉토리에서 /api/...를 사용할 때는 프론트엔드와 백엔드가 동일한 출처로 동작하기 때문에 CORS 에러가 발생하지 않습니다. 이건 Nuxt의 통합된 구조 덕분이고, 별도의 외부 서버를 호출하지 않는 한 걱정할 필요가 없어요. 
728x90