CORS Access-Control-Allow-Headers 와일드 카드가 무시됩니까?


118

Chrome을 사용하여 제대로 작동하도록 도메인 간 CORS 요청을받는 데 문제가 있습니다.

요청 헤더 :

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4

응답 헤더 :

Access-Control-Allow-Headers:*
Access-Control-Allow-Origin:*
Allow:GET, POST, OPTIONS
Content-Length:0
Date:Tue, 30 Oct 2012 20:04:28 GMT
Server:BaseHTTP/0.3 Python/2.7.3

오류:

XMLHttpRequest cannot load domain. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.

옵션 요청을 제공하는 Python 코드는 다음과 같습니다.

self.send_response(200)
self.send_header('Allow', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Headers', '*')
self.send_header('Content-Length', '0')
self.end_headers()

Access-Control-Allow-Origin와일드 카드가 무시되는 것 같 습니까?

답변:


185

Access-Control-Allow-Headers헤더의 와일드 카드 지원은 2016 년 5 월에만 생활 표준추가 되었으므로 모든 브라우저에서 지원되지 않을 수 있습니다. 아직 구현하지 않은 브라우저에서는 정확히 일치해야합니다 : https://www.w3.org/TR/2014/REC-cors-20140116/#access-control-allow-headers-response-header

많은 수의 헤더가 예상되는 경우 헤더의 값을 읽고 해당 값을 Access-Control-Request-Headers헤더에 다시 에코 할 수 있습니다 Access-Control-Allow-Headers.


55
resp.setHeader ( "Access-Control-Allow-Headers", req.getHeader ( "Access-Control-Request-Headers")); // 모든 헤더 허용
Sam Barnum 2013 년

3
루비에서는 "if request.headers [ 'Access-Control-Request-Headers'] then headers [ 'Access-Control-Allow-Headers'] = request.headers [ 'Access-Control-Request-Headers'] end"가 보입니다. 괜찮습니다.
Tsuneo Yoshioka 2014

1
@monsur : 이 답변 은 적어도 이론적으로는 와일드 카드가 허용된다는 것을 지적했기 때문에 이것을 반영하기 위해 답변을 업데이트했습니다. 내 스타일이 마음에 들지 않으면 취향에 맞게 편집하십시오.
MvG

2
경고의 한마디로, 브라우저가 프리 플라이트 응답 (Access-Control-Max-Age 사용)을 캐시하도록 허용하는 경우 Access-Control-Request-Headers 값을 다시 전달하면 문제가 발생할 수 있습니다. 첫 번째 요청이 연속 요청의 모든 헤더를 나열한다는 것을 모릅니다.
Simon Ejsing 2017 년

2
이 제품의 보안 문제 것이 얼마나 당신이 우리를 말할 수있는 경우 @monokrome은 .. 좋은 것
prettyvoid

52

해당 CORS 헤더는 *값으로 지원하지 않으며 유일한 방법은 다음으로 바꾸는 것 *입니다.

Accept, Accept-CH, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Ext, Accept-Features, Accept-Language, Accept-Params, Accept-Ranges, Access-Control-Allow-Credentials, Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Request-Headers, Access-Control-Request-Method, Age, Allow, Alternates, Authentication-Info, Authorization, C-Ext, C-Man, C-Opt, C-PEP, C-PEP-Info, CONNECT, Cache-Control, Compliance, Connection, Content-Base, Content-Disposition, Content-Encoding, Content-ID, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Script-Type, Content-Security-Policy, Content-Style-Type, Content-Transfer-Encoding, Content-Type, Content-Version, Cookie, Cost, DAV, DELETE, DNT, DPR, Date, Default-Style, Delta-Base, Depth, Derived-From, Destination, Differential-ID, Digest, ETag, Expect, Expires, Ext, From, GET, GetProfile, HEAD, HTTP-date, Host, IM, If, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Keep-Alive, Label, Last-Event-ID, Last-Modified, Link, Location, Lock-Token, MIME-Version, Man, Max-Forwards, Media-Range, Message-ID, Meter, Negotiate, Non-Compliance, OPTION, OPTIONS, OWS, Opt, Optional, Ordering-Type, Origin, Overwrite, P3P, PEP, PICS-Label, POST, PUT, Pep-Info, Permanent, Position, Pragma, ProfileObject, Protocol, Protocol-Query, Protocol-Request, Proxy-Authenticate, Proxy-Authentication-Info, Proxy-Authorization, Proxy-Features, Proxy-Instruction, Public, RWS, Range, Referer, Refresh, Resolution-Hint, Resolver-Location, Retry-After, Safe, Sec-Websocket-Extensions, Sec-Websocket-Key, Sec-Websocket-Origin, Sec-Websocket-Protocol, Sec-Websocket-Version, Security-Scheme, Server, Set-Cookie, Set-Cookie2, SetProfile, SoapAction, Status, Status-URI, Strict-Transport-Security, SubOK, Subst, Surrogate-Capability, Surrogate-Control, TCN, TE, TRACE, Timeout, Title, Trailer, Transfer-Encoding, UA-Color, UA-Media, UA-Pixels, UA-Resolution, UA-Windowpixels, URI, Upgrade, User-Agent, Variant-Vary, Vary, Version, Via, Viewport-Width, WWW-Authenticate, Want-Digest, Warning, Width, X-Content-Duration, X-Content-Security-Policy, X-Content-Type-Options, X-CustomHeader, X-DNSPrefetch-Control, X-Forwarded-For, X-Forwarded-Port, X-Forwarded-Proto, X-Frame-Options, X-Modified, X-OTHER, X-PING, X-PINGOTHER, X-Powered-By, X-Requested-With


.htaccess 예 (CORS 포함) :

<IfModule mod_headers.c>
  Header unset Connection
  Header unset Time-Zone
  Header unset Keep-Alive
  Header unset Access-Control-Allow-Origin
  Header unset Access-Control-Allow-Headers
  Header unset Access-Control-Expose-Headers
  Header unset Access-Control-Allow-Methods
  Header unset Access-Control-Allow-Credentials

  Header set   Connection                         keep-alive
  Header set   Time-Zone                          "Asia/Jerusalem"
  Header set   Keep-Alive                         timeout=100,max=500
  Header set   Access-Control-Allow-Origin        "*"
  Header set   Access-Control-Allow-Headers       "Accept, Accept-CH, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Ext, Accept-Features, Accept-Language, Accept-Params, Accept-Ranges, Access-Control-Allow-Credentials, Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Request-Headers, Access-Control-Request-Method, Age, Allow, Alternates, Authentication-Info, Authorization, C-Ext, C-Man, C-Opt, C-PEP, C-PEP-Info, CONNECT, Cache-Control, Compliance, Connection, Content-Base, Content-Disposition, Content-Encoding, Content-ID, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Script-Type, Content-Security-Policy, Content-Style-Type, Content-Transfer-Encoding, Content-Type, Content-Version, Cookie, Cost, DAV, DELETE, DNT, DPR, Date, Default-Style, Delta-Base, Depth, Derived-From, Destination, Differential-ID, Digest, ETag, Expect, Expires, Ext, From, GET, GetProfile, HEAD, HTTP-date, Host, IM, If, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Keep-Alive, Label, Last-Event-ID, Last-Modified, Link, Location, Lock-Token, MIME-Version, Man, Max-Forwards, Media-Range, Message-ID, Meter, Negotiate, Non-Compliance, OPTION, OPTIONS, OWS, Opt, Optional, Ordering-Type, Origin, Overwrite, P3P, PEP, PICS-Label, POST, PUT, Pep-Info, Permanent, Position, Pragma, ProfileObject, Protocol, Protocol-Query, Protocol-Request, Proxy-Authenticate, Proxy-Authentication-Info, Proxy-Authorization, Proxy-Features, Proxy-Instruction, Public, RWS, Range, Referer, Refresh, Resolution-Hint, Resolver-Location, Retry-After, Safe, Sec-Websocket-Extensions, Sec-Websocket-Key, Sec-Websocket-Origin, Sec-Websocket-Protocol, Sec-Websocket-Version, Security-Scheme, Server, Set-Cookie, Set-Cookie2, SetProfile, SoapAction, Status, Status-URI, Strict-Transport-Security, SubOK, Subst, Surrogate-Capability, Surrogate-Control, TCN, TE, TRACE, Timeout, Title, Trailer, Transfer-Encoding, UA-Color, UA-Media, UA-Pixels, UA-Resolution, UA-Windowpixels, URI, Upgrade, User-Agent, Variant-Vary, Vary, Version, Via, Viewport-Width, WWW-Authenticate, Want-Digest, Warning, Width, X-Content-Duration, X-Content-Security-Policy, X-Content-Type-Options, X-CustomHeader, X-DNSPrefetch-Control, X-Forwarded-For, X-Forwarded-Port, X-Forwarded-Proto, X-Frame-Options, X-Modified, X-OTHER, X-PING, X-PINGOTHER, X-Powered-By, X-Requested-With"
  Header set   Access-Control-Expose-Headers      "Accept, Accept-CH, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Ext, Accept-Features, Accept-Language, Accept-Params, Accept-Ranges, Access-Control-Allow-Credentials, Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Request-Headers, Access-Control-Request-Method, Age, Allow, Alternates, Authentication-Info, Authorization, C-Ext, C-Man, C-Opt, C-PEP, C-PEP-Info, CONNECT, Cache-Control, Compliance, Connection, Content-Base, Content-Disposition, Content-Encoding, Content-ID, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Script-Type, Content-Security-Policy, Content-Style-Type, Content-Transfer-Encoding, Content-Type, Content-Version, Cookie, Cost, DAV, DELETE, DNT, DPR, Date, Default-Style, Delta-Base, Depth, Derived-From, Destination, Differential-ID, Digest, ETag, Expect, Expires, Ext, From, GET, GetProfile, HEAD, HTTP-date, Host, IM, If, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Keep-Alive, Label, Last-Event-ID, Last-Modified, Link, Location, Lock-Token, MIME-Version, Man, Max-Forwards, Media-Range, Message-ID, Meter, Negotiate, Non-Compliance, OPTION, OPTIONS, OWS, Opt, Optional, Ordering-Type, Origin, Overwrite, P3P, PEP, PICS-Label, POST, PUT, Pep-Info, Permanent, Position, Pragma, ProfileObject, Protocol, Protocol-Query, Protocol-Request, Proxy-Authenticate, Proxy-Authentication-Info, Proxy-Authorization, Proxy-Features, Proxy-Instruction, Public, RWS, Range, Referer, Refresh, Resolution-Hint, Resolver-Location, Retry-After, Safe, Sec-Websocket-Extensions, Sec-Websocket-Key, Sec-Websocket-Origin, Sec-Websocket-Protocol, Sec-Websocket-Version, Security-Scheme, Server, Set-Cookie, Set-Cookie2, SetProfile, SoapAction, Status, Status-URI, Strict-Transport-Security, SubOK, Subst, Surrogate-Capability, Surrogate-Control, TCN, TE, TRACE, Timeout, Title, Trailer, Transfer-Encoding, UA-Color, UA-Media, UA-Pixels, UA-Resolution, UA-Windowpixels, URI, Upgrade, User-Agent, Variant-Vary, Vary, Version, Via, Viewport-Width, WWW-Authenticate, Want-Digest, Warning, Width, X-Content-Duration, X-Content-Security-Policy, X-Content-Type-Options, X-CustomHeader, X-DNSPrefetch-Control, X-Forwarded-For, X-Forwarded-Port, X-Forwarded-Proto, X-Frame-Options, X-Modified, X-OTHER, X-PING, X-PINGOTHER, X-Powered-By, X-Requested-With"
  Header set   Access-Control-Allow-Methods       "CONNECT, DEBUG, DELETE, DONE, GET, HEAD, HTTP, HTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2, OPTIONS, ORIGIN, ORIGINS, PATCH, POST, PUT, QUIC, REST, SESSION, SHOULD, SPDY, TRACE, TRACK"
  Header set   Access-Control-Allow-Credentials   "true"

  Header set DNT "0"
  Header set Accept-Ranges "bytes"
  Header set Vary "Accept-Encoding"
  Header set X-UA-Compatible "IE=edge,chrome=1"
  Header set X-Frame-Options "SAMEORIGIN"
  Header set X-Content-Type-Options "nosniff"
  Header set X-Xss-Protection "1; mode=block"
</IfModule>

자주하는 질문:

  • Access-Control-Allow-Headers, Access-Control-Expose-Headers, Access-Control-Allow-Methods값은 매우 긴?

    그것들은 *구문을 지원하지 않으므로 웹에서 가장 일반적인 (그리고 이국적인) 헤더를 다양한 형식으로 수집했습니다. # 1 # 2 # 3 (그리고 때때로 목록을 업데이트 할 것입니다)

  • Header unset ______구문 을 사용하는 이유는 무엇 입니까?

    GoDaddy 서버 (내 웹 사이트가 호스팅됩니다 ..)에는 헤더가 이미 설정되어있는 경우 이전 값이 기존 값과 결합되는 이상한 버그가 있습니다.이 방식으로 기존 값을 "사전 정리"합니다. (정말로 빠른 && 더러운 솔루션)

  • '있는 그대로'사용하는 것이 안전한가요?

    글쎄 .. 다음 "폴더"위치에서 제공되는 스크립트 (PHP, HTML, ...) 및 리소스 (.JPG, .JS, .CSS)에 대한 헤더를 제한하기 때문에 대부분 대답은 YES.htaccess 입니다. 선택적으로 Access-Control-Allow-Methods라인 을 제거 할 수 있습니다. 또한 Connection, Time-Zone, Keep-AliveDNT, Accept-Ranges, Vary, X-UA-Compatible, X-Frame-Options, X-Content-Type-Options그리고 X-Xss-Protection내 온라인 서비스를 사용하고 단지 제안입니다 .. 너무 사람들을 제거 주시기 ...

위의의견 에서 가져온


이것은 확실히 내 생명을 구했습니다. 나는 CORS가 활성화 된 CDN 공급자를 사용하고 있었고 내 웹 사이트에서 허용 Access-Control-Allow-Origin "*"했지만 이것을 사용할 때까지 아무것도 작동하지 않았습니다. CDN 제공 업체조차도 우리에게 답을주지 못했습니다. 나는 Siteground 에서 웹 사이트를 실행합니다 . 아마도 GoDaddy 로서 먼저 모든 것을 설정 해제해야합니다.
Ignacio Bustos

훌륭한 게시물입니다.이 페이지의 상단으로 올라와야합니다.
CommonKnowledge

1
내 특정한 경우에는 Access-Control-Allow-MethodsHTTP / 0.9, HTTP / 1.0, HTTP / 1.1, HTTP / 2
umbe1987

HTTP / 2는 유효한 '메소드'일까요? HTTP / 1.1에서 2로 업그레이드하는 것이 그렇게 작동합니까? 내가 여기를 보면 : sookocheff.com/post/networking/how-does-http-2-work HTTP / ... 부분은 첫 번째가 아닌 세 번째로 가야합니다.
Henk Poley

HTTP / 2.0을 지원하려면 'PRI'메소드를 추가해야합니까?
Henk Poley

17

Access-Control-Allow-Headers: *OPTIONS 요청에 대해서만 설정해야 함을 발견했습니다 . POST 요청을 위해 반환하면 브라우저가 요청을 취소합니다 (최소한 크롬의 경우).

다음 PHP 코드가 저에게 효과적입니다.

// Allow CORS
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');    
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
}   
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Allow-Headers: *");
}

오해의 소지가있는 답변으로 유사한 질문을 찾았습니다.

  • 서버 스레드는 이것이 크롬의 2 년 버그라고 말합니다 : Access-Control-Allow-Headerslocalhost와 일치하지 않습니다. 잘못되었습니다. Post를 사용하여 로컬 서버에 CORS를 정상적으로 사용할 수 있습니다.
  • Access-Control-Allow-Headers와일드 카드를 허용합니다. 또한 잘못되었습니다. 와일드 카드가 저에게 적합합니다 (Chrome에서만 테스트했습니다)

문제를 파악하는 데 반나절이 걸립니다.

즐거운 코딩


2
Safari 7.0.4에서 Wildcard ( "Access-Control-Allow-Headers : *")가 작동하지 않았습니다.
Tsuneo Yoshioka

Access-Control-Allow-Headers 설정이 Chrome 버전 40.0.2214.111 m의 POST에서 작동한다는 것을 알았습니다.
데릭 그리어

3
이것은 바로 ..... 사양은 허용하지 않습니다하지 않는 것 *Access-Control-Allow-Headers도에 대한 OPTIONS.
Pacerier

1

monsur에서 인용,

Access-Control-Allow-Headers 헤더는 와일드 카드를 허용하지 않습니다. http://www.w3.org/TR/cors/#access-control-allow-headers-response-header 와 정확히 일치해야합니다 .

그래서 여기 내 PHP 솔루션이 있습니다.

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  $headers=getallheaders();
  @$ACRH=$headers["Access-Control-Request-Headers"];
  header("Access-Control-Allow-Headers: $ACRH");
}

1
사실, 이유는 단순히header('Access-Control-Allow-Headers: ' . $_SERVER['HTTP_ACCESS_CONTROL_ALLOW_HEADERS']);
Pacerier

0

여기에 nginx의 주문이 있습니다.

location / {
    # Simple requests
    if ($request_method ~* "(GET|POST)") {
      add_header "Access-Control-Allow-Origin"  *;
    }

    # Preflighted requests
    if ($request_method = OPTIONS ) {
      add_header "Access-Control-Allow-Origin"  *;
      add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
      add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
    }

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