오리진 <origin>은 Access-Control-Allow-Origin에 의해 허용되지 않습니다


184
XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 

교차 도메인 아약스 요청에 대해 읽고 기본 보안 문제를 이해합니다. 필자의 경우 2 대의 서버가 로컬에서 실행 중이며 테스트 중에 도메인 간 요청을 활성화하고 싶습니다.

localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server

localhost:8080 - GAE server내 페이지가 노드 서버에서로드되는 동안 아약스 요청을 발행하고 있습니다. 가장 쉽고 안전한 방법은 무엇입니까 ( disable-web-security옵션으로 크롬을 시작하고 싶지는 않음 ). 변경 'Content-Type'해야하는 경우 노드 서버에서 변경 해야합니까? 어떻게?


더 빠른 해결책은 여기에서 찾을 수 있습니다 : stackoverflow.com/a/21622564/4455570
Gabriel Wamunyu

답변:


195

그것들은 다른 포트에서 실행되기 때문에 다른 JavaScript origin입니다. 이들이 동일한 컴퓨터 / 호스트 이름에 있는지는 중요하지 않습니다.

서버에서 CORS를 활성화해야합니다 (localhost : 8080). 이 사이트를 확인하십시오 : http://enable-cors.org/

서버에 HTTP 헤더를 추가하기 만하면됩니다.

Access-Control-Allow-Origin: http://localhost:3000

또는 간단하게하기 위해 :

Access-Control-Allow-Origin: *

서버가 쿠키를 설정하려고하는데 사용하는 경우 "*"를 사용하지 마십시오. withCredentials = true

자격 증명 요청에 응답 할 때 서버는 도메인을 지정해야하며 와일드 카드를 사용할 수 없습니다.

자세한 내용은 withCredentials여기를 참조 하십시오


이 헤더를 HTML에 추가하려면 어떻게해야합니까?
Azam Alvi

1
포트가 필요하다고 생각하지 않았지만 3000과 같은 비표준 포트를 사용하는 경우 CORS 정책에 포트를 포함시켜야합니다.
Michael Connor

4
이 답변에 감사드립니다. 여기서 '*'를 값으로 사용하는 보안상의 의미를 강조하고 싶습니다. 이렇게하면 모든 출처를 사용할 수 있습니다. developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… 첫 번째 예제는 액세스가 가장 적은 것 같습니다. : 여기에 여러 도메인으로이 작업을 수행하는 방법에 대한 자세한 stackoverflow.com/a/1850482/1566623
크리스토퍼 Kuttruff

14
명확하게하기 위해, "서버에 HTTP 헤더 추가"가 필요하다고 말하면, 주어진 Access-Control-Allow-Origin헤더는 서버가 보내는 HTTP 응답에 추가 된 헤더 여야 함을 의미합니다 . 이 헤더는 서버 응답의 일부 여야하며 클라이언트 요청의 일부일 필요는 없습니다 . 특히 클라이언트가 원하는 실제 요청을 OPTIONS하기 전에 브라우저가 요청을 보내기 전에 해당 OPTIONS요청에 대한 서버의 응답에 헤더가 포함되어 있지 않으면 브라우저가 원하는 요청을 보내지 않습니다.
AjaxLeung 5

1
enable-cors.org에서 백엔드 서버에 대한 관련 팁을 읽으십시오.
Karlth

69

Chrome에서 Ajax 요청을 신속하게 해결해야하는 경우이 Chrome 플러그인을 사용하면 적절한 응답 헤더를 추가하여 모든 소스에서 모든 사이트에 자동으로 액세스 할 수 있습니다

Chrome 확장 프로그램 허용 제어 허용 : *


6
왜 당신이 더 많은지지를 얻지 못하는지 모르겠습니다. Chrome을 사용하는 localhost에서 개발하는 데 가장 방해가되지 않습니다.
David Betz

분명히 동의합니다. 원격 서버의 구성을 변경하지 않고도 원격 서버에 대해 localhost dev를 쉽게 사용할 수 있습니다.
Jens Wegar

@DavidBetz : 확장을 검증하고 그것을 신뢰하는 것은 물론;)
haylem

2
이것은 최고의 답변이어야합니다! 특히 로컬 호스트가 관련된 경우.
Mr. Benedict

16
이것이 좋은 해결책이라면 CORS는 처음에는 발명되지 않았을 것입니다. 이 헤더를 모든 호스트에 적용하면 CORS 보호가 비활성화되고 사용자뿐만 아니라 악성 스크립트에 노출됩니다. 은행 계좌가 갑자기 비워도 놀라지 마십시오.
고인돌

54

이 문제를 해결하려면 CORS를 활성화해야합니다

간단한 node.js로 앱을 만든 경우

응답 헤더에 설정하십시오.

var http = require('http');

http.createServer(function (request, response) {
response.writeHead(200, {
    'Content-Type': 'text/plain',
    'Access-Control-Allow-Origin' : '*',
    'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE'
});
response.end('Hello World\n');
}).listen(3000);

앱이 Express 프레임 워크로 생성 된 경우

같은 CORS 미들웨어를 사용하십시오

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
}

통해 신청

app.configure(function() {
    app.use(allowCrossDomain);
    //some other code
});    

여기 두 개의 참조 링크가 있습니다

  1. 표현하는 방법에 방법을 허용하는 법
  2. diving-into-node-js-very-first-app #Ajax 섹션 참조

사용 방법을 지정할 수 있습니까 config.allowedDomains? 내 경우에는 거기에 어떤 URI를 넣어야합니까?
bsr

@bsr : 당신이 사용 *하거나 specific domain액세스를 원합니다.
mithunsatheesh

1
그래서 내가 얻는 유일한 app.configure()기능 오류가 아닌가?
Pramesh Bajracharya

@PrameshBajrachaya 나는 "app.configure"부분을 포함하지 않았고 "app.use (allowCrossDomain)"만 포함 시켰고 그것은 나를 위해 일했다.
Giorgos Sfikas

8

@Rocket hazmat의 답변을 받아 솔루션으로 연결합니다. 실제로 GAE 서버에서 헤더를 설정해야했습니다. 나는 이것을 설정했다

"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"

설정에만 "Access-Control-Allow-Origin" 오류가 발생했습니다

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.

또한 인증 토큰을 보내야하는 경우이를 추가하십시오

"Access-Control-Allow-Credentials" -> "true"

또한 클라이언트에서 withCredentials

이로 인해 2 개의 요청이 하나의 서버로 전송됩니다 OPTIONS. 인증 쿠키는 함께 전송되지 않으므로 외부 인증을 처리해야합니다.


7

router.js에서 get / post 메소드를 호출하기 전에 코드를 추가하십시오. 오류없이 작동합니다.

//Importing modules @Brahmmeswar
const express = require('express');
const router = express.Router();

const Contact = require('../models/contacts');

router.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });

5

크롬에서 아약스를 사용하여 교차 출처 리소스를 호출하는 동안 문제가 발생했습니다.

노드 js 및 로컬 http 서버를 사용하여 노드 js 앱을 배포했습니다.

교차 출처 리소스에 액세스 할 때 오류 응답이 발생했습니다.

나는 그것에 대한 하나의 해결책을 찾았다.

1) app.js 파일에 아래 코드를 추가했습니다.

res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");

2) 내 HTML 페이지에서 cross origin resource를 사용하여 $.getJSON();

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});

5

express를 사용하는 경우 다음과 같이 cors 미들웨어를 사용할 수 있습니다.

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())

3

가져 오기 아래에서 NodeJS 서버에 추가하십시오.

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

3

그 후에 403이 있으면 WEB.XML tomcat 구성의 필터를 다음과 같이 줄이십시오.

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
</filter>

2

나는 아파치 Tomcat8에 대한 답을 마침내 얻었습니다.

tomcat web.xml 파일을 편집해야합니다.

아기는 webapps 폴더 안에 있고

sudo gedit /opt/tomcat/webapps/your_directory/WEB-INF/web.xml

찾아서 편집

<web-app>


<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>


<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>



</web-app>

이렇게하면 모든 호스트에서 Access-Control-Allow-Origin이 허용됩니다. 모든 호스트에서 호스트로만 변경해야하는 경우

<param-name>cors.allowed.origins</param-name>
<param-value>http://localhost:3000</param-value>

*에서 http : // your_public_IP 또는 http://www.example.com으로의 위 코드

Tomcat 필터 설명서를 참조하십시오.

감사


1

안녕하세요 이것은 노드에서 CORS 문제를 해결하는 방법입니다. Node.js (또는 서버 파일)의 서버 "api"측에 다음 행을 추가하십시오. "cors"를 설치하십시오.

    const express = require('express');
    const app = express();
    app.use(express.json());
    var cors = require('cors');
    app.use(cors());

0

dataType : 'jsonp'를 사용하십시오.

   async function get_ajax_data(){

       var _reprojected_lat_lng = await $.ajax({

                                type: 'GET',

                                dataType: 'jsonp',

                                data: {},

                                url: _reprojection_url,

                                error: function (jqXHR, textStatus, errorThrown) {

                                    console.log(jqXHR)

                                },

                                success: function (data) {

                                    console.log(data);



                                    // note: data is already json type, you just specify dataType: jsonp

                                    return data;

                                }

                            });





 } // function               

0

PHP의 경우이를 사용하여 헤더를 설정하십시오.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

0
router.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "*");
res.header("Access-Control-Allow-Headers", "*");
next();});

프론트 엔드에서 전화하는 경로에 이것을 추가하십시오. 예를 들어 http : // localhost : 3000 / users / register 를 호출하는 경우이 코드 조각을이 경로가 배치하는 백엔드 .js 파일에 추가해야합니다.


0

솔루션을 검색하는 사람이 있다면 Express를 사용하는 경우 빠른 솔루션입니다.

const express = require('express')
const cors = require('cors')
const app = express()

1) npm을 사용하여 cors 설치 npm install cors --save

2) 가져 오기 [필수] const cors = require('cors')

3) 미들웨어로 사용 app.use(cors())

insatll 및 cors 사용법에 대한 자세한 내용 . 그것이, 희망적으로 작동합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.