CORS : 신임 정보 플래그가 true 인 경우 Access-Control-Allow-Origin에서 와일드 카드를 사용할 수 없습니다.


295

관련 설정이 있습니다

프론트 엔드 서버 (Node.js, 도메인 : localhost : 3000) <---> 백엔드 (Django, Ajax, 도메인 : localhost : 8000)

브라우저 <-webapp <-Node.js (앱 제공)

브라우저 (webapp)-> Ajax-> Django (Serve ajax POST requests)

이제 내 문제는 webapp가 백엔드 서버에 Ajax 호출을하는 데 사용하는 CORS 설정입니다. 크롬에서는 계속

신임 정보 플래그가 true 인 경우 Access-Control-Allow-Origin에서 와일드 카드를 사용할 수 없습니다.

파이어 폭스에서도 작동하지 않습니다.

내 Node.js 설정은 다음과 같습니다

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://localhost:8000/');
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
};

그리고 장고에서는 이 미들웨어이것 과 함께 사용하고 있습니다

webapp는 다음과 같이 요청합니다.

$.ajax({
    type: "POST",
    url: 'http://localhost:8000/blah',
    data: {},
    xhrFields: {
        withCredentials: true
    },
    crossDomain: true,
    dataType: 'json',
    success: successHandler
});

따라서 webapp가 보내는 요청 헤더는 다음과 같습니다.

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
Access-Control-Allow-Methods: 'GET,PUT,POST,DELETE'
Content-Type: application/json 
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=***; sessionid="***"

응답 헤더는 다음과 같습니다.

Access-Control-Allow-Headers: Content-Type,*
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Type: application/json

내가 잘못 가고있는 곳?!

편집 1 :을 사용 chrome --disable-web-security하고 있지만 실제로는 실제로 작동하기를 원합니다.

편집 2 : 답변 :

그래서 나를위한 솔루션 django-cors-headers구성 :

CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000' # Here was the problem indeed and it has to be http://localhost:3000, not http://localhost:3000/
)

1
나에게 그것은 http가없는 localhost : 3000입니다. CORS_ORIGIN_WHITELIST = ( 'localhost : 3000',)
Andrei

하나의 PC에서 프론트 엔드 및 백엔드 개발을 사용한다는 의미입니까?
fanhualuojin154873

다른 PC의 프론트 엔드와 백엔드는 어떻습니까?
fanhualuojin154873

@ixaxaar 왜 http로 말을합니까? 우리는 모두` 'localhost : 3000'` 만 작동합니다.
244boy

@ 244boy 그래 요점은 아니에요 http, 그것은 /끝입니다. http를 생략해도 효과가 있다고 생각하지만 몇 년 동안 실제로이 작업을 수행하지 않았으므로 지금 무엇이 효과가 있는지 모릅니다.
ixaxaar

답변:


247

이것은 보안의 일부이므로 그렇게 할 수 없습니다. 자격 증명을 허용 Access-Control-Allow-Origin하려면 사용하지 않아야합니다 *. 정확한 프로토콜 + 도메인 + 포트를 지정해야합니다. 참고로 다음 질문을 참조하십시오.

  1. Access-Control-Allow-Origin 와일드 카드 하위 도메인, 포트 및 프로토콜
  2. 자격 증명을 사용하여 원본 간 리소스 공유

게다가 *너무 관대하며 자격 증명 사용을 물리 칠 것입니다. 따라서 http://localhost:3000또는 http://localhost:8000출발지 허용 헤더로 설정 하십시오.


45
그러나 둘 이상의 도메인이 있으면 어떻게됩니까?
aroth

13
@aroth 도메인 목록을 제공 할 수 있습니다. 관련 질문 : stackoverflow.com/questions/1653308/…
user568109

13
@ user568109 "게다가 *너무 관대하며 자격 증명 사용을 무너 뜨릴 것"이라고 설명 할 수 있습니까?
휴고 우드

12
요청이 Cordova에서 발생할 수있는 것처럼 모바일 디바이스에서 온 경우 "정확한 도메인"은 무엇입니까?
Christian

8
@Christian은 다소 오래되었지만 여전히 궁금한 사람이 있으면 브라우저에서 실행되는 응용 프로그램에서만이 문제가 발생합니다.이 오류는 보안상의 이유로 브라우저에서 발생하기 때문입니다. 모바일 클라이언트, 우체부 또는 http 클라이언트를 사용하여 요청을하는 다른 백엔드 코드와 같은 다른 클라이언트에는이 문제가 없으므로 원점과 정확한 도메인에 대해 걱정할 필요가 없습니다 .
Alisson

32

CORS 미들웨어를 사용 중이고 withCredential부울 true 를 보내려는 경우 다음 과 같이 CORS를 구성 할 수 있습니다.

var cors = require('cors');    
app.use(cors({credentials: true, origin: 'http://localhost:3000'}));

16

사용중인 경우 미들웨어를 작성하는 대신 cors 패키지를 사용하여 CORS를 허용 express할 수 있습니다 .

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

app.use(cors());

app.get(function(req,res){ 
  res.send('hello');
});

12
아, 지금은, 그러나, 결과는 같은 더 편리의 :( BTW, 내가 사용app.use(cors({credentials: true}));
ixaxaar

1
테스트 된 Django CORS 미들웨어 를 살펴볼 수 있습니다 .
Bulkan

1
그래서 두 개의 장고 미들웨어가 있습니까? django-cors-header앱만 사용하겠습니다 . 설정 에 localhost 를 추가 CORS_ORIGIN_WHITELIST하고 다음 CORS_ALLOW_CREDENTIALS으로 설정 했는지 확인하십시오.True
Bulkan

1
네 사람, 아무 소용이 전에 한 것을 시도 CORS_ORIGIN_ALLOW_ALL = True, CORS_ORIGIN_WHITELIST = ( 'localhost' )그리고 CORS_ALLOW_CREDENTIALS = True 나는 이러한 헤더를 얻을 :Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:3000/ Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE Content-Type: application/json
ixaxaar

5
이 문서를 읽은 후 : github.com/expressjs/corsuse 이 구성을 사용하여 : app.use (cors ({credentials : true, origin : ' localhost : 3001 '})); 나를 위해 일하고 있습니다.
allel

11

시도 해봐:

const cors = require('cors')

const corsOptions = {
    origin: 'http://localhost:4200',
    credentials: true,

}
app.use(cors(corsOptions));

6

모든 출처를 허용하고 자격 증명을 true로 유지하려면 다음과 같이하십시오.

app.use(cors({
  origin: function(origin, callback){
    return callback(null, true);
  },
  optionsSuccessStatus: 200,
  credentials: true
}));

@TSlegaitis Haha 네, 그것이 모든 출처에서 작동하지만 자격 증명을 유지하는 이유입니다. 보안을 위해 권장하지는 않지만 작동합니다.
다람쥐

2

(편집) 이전에 권장 된 추가 기능을 더 이상 사용할 수 없습니다. 다른 방법으로 시도해 볼 수 있습니다


Chrome에서 개발 목적 으로이 애드온을 설치 하면 특정 오류가 제거됩니다.

Access to XMLHttpRequest at 'http://192.168.1.42:8080/sockjs-node/info?t=1546163388687' 
from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the 
'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' 
when the request's credentials mode is 'include'. The credentials mode of requests 
initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

설치 후 Intercepted URLsAddOn의 ( CORS , green 또는 red) 아이콘을 클릭하고 적절한 텍스트 상자를 채워서 URL 패턴을 추가하십시오 . 예제 URL 패턴에 맞는지 여기에 추가 http://localhost:8080될 것이다 :*://*


설치 직후 아이디어가 있습니까?
Jalil

그것은 나를 위해 일했다. 다른 유사한 추가 기능이있는 경우 경고를 추가하기 전에 제거해야합니다.
FilippoG

깨진 링크를 수정하십시오
Luk Aron

원래 추가 기능이 제거 된 것 같습니다. 상단에 (편집)으로 새로운 권장 사항을 추가했습니다.
eriel marimon

1

이것은 개발에서 나에게 도움이되지만 프로덕션에서는 아직 언급되지 않았지만 아마도 최선의 방법은 아닌 다른 일을 수행 할 수 있다고 조언 할 수는 없습니다. 어쨌든 여기에 간다 :

요청에서 오리진을 가져온 다음 응답 헤더에서 오리진을 사용할 수 있습니다. 표현 방식은 다음과 같습니다.

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', req.header('origin') );
  next();
});

파이썬 설정에서 어떤 모습 일지 모르겠지만 번역하기 쉽습니다.


Mozilla Dev Docs 는 허용 된 출처를 요청의 출처로 변경한다는 아이디어를 확장합니다. 'Vary : Origin'HTTP 응답 헤더와 허용 된 도메인을 허용 목록에 추가하는 것이 좋습니다.
Ramzis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.