ASP.NET Core でのクロス オリジン要求 (CORS) を有効にします。Enable Cross-Origin Requests (CORS) in ASP.NET Core

作成者 Mike WassonShayne Boyer、および Tom DykstraBy Mike Wasson, Shayne Boyer, and Tom Dykstra

ブラウザーのセキュリティは、Web ページが別のドメインに AJAX 要求を行うことを防止します。Browser security prevents a web page from making AJAX requests to another domain. この制限は同一生成元ポリシーと呼ばれ、悪意のあるサイトが別のサイトから機密データを読み取れないようにします。This restriction is called the same-origin policy, and prevents a malicious site from reading sensitive data from another site. しかし、他のサイトがあなたの Web API にクロスオリジン要求を行えるようにする必要がある場合もあります。However, sometimes you might want to let other sites make cross-origin requests to your web API.

クロス オリジン リソース共有(CORS) は、サーバーに同一生成元ポリシーの制限を緩和させる W3C 標準の1つです。Cross Origin Resource Sharing (CORS) is a W3C standard that allows a server to relax the same-origin policy. CORS を使用することによって、不明なリクエストは拒否しながら、一部のクロス オリジン要求のみを明示的に許可できるようになります。Using CORS, a server can explicitly allow some cross-origin requests while rejecting others. CORS は JSONP のようなかつての技術より安全でフレキシブルなものです。CORS is safer and more flexible than earlier techniques such as JSONP. このトピックでは、ASP.NET Core アプリケーションで CORS を有効にする方法を説明します。This topic shows how to enable CORS in an ASP.NET Core application.

「同一生成元」とはWhat is "same origin"?

2 つの URL のスキーム、ホスト、ポートが同じである場合、その URL は同一生成元となります。Two URLs have the same origin if they have identical schemes, hosts, and ports. (RFC 6454)(RFC 6454)

次の 2 つの URL は生成元が同じです。These two URLs have the same origin:

  • http://example.com/foo.html

  • http://example.com/bar.html

次の URL は、上の URL とは生成元が異なります。These URLs have different origins than the previous two:

  • http://example.net - 異なるドメイン http://example.net - Different domain

  • http://www.example.com/foo.html - 異なるサブドメインhttp://www.example.com/foo.html - Different subdomain

  • https://example.com/foo.html - 異なるスキームhttps://example.com/foo.html - Different scheme

  • http://example.com:9000/foo.html - 異なるポートhttp://example.com:9000/foo.html - Different port

注意

Internet Explorer は、生成元を比較するときにポートを考慮しません。Internet Explorer doesn't consider the port when comparing origins.

CORS の設定Setting up CORS

アプリケーションに CORS を設定するために Microsoft.AspNetCore.Cors パッケージをプロジェクトに追加します。To set up CORS for your application add the Microsoft.AspNetCore.Cors package to your project.

Startup.cs に CORS サービスを追加します。Add the CORS services in Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors();
}

ミドルウェアによる CORS の有効化Enabling CORS with middleware

アプリケーション全体で CORS を有効にするためにUseCors拡張メソッドを使用して CORS ミドルウェアを要求パイプラインに追加します。To enable CORS for your entire application add the CORS middleware to your request pipeline using the UseCors extension method. CORS ミドルウェアは アプリで定義されたエンドポイントより先に呼び出される必要があることに注意してください (例: Note that the CORS middleware must precede any defined endpoints in your app that you want to support cross-origin requests (ex. UseMvcを呼び出す前)。before any call to UseMvc).

CORS ミドルウェアを追加するときにCorsPolicyBuilderクラスを使用してクロス オリジン ポリシーを指定することができます。You can specify a cross-origin policy when adding the CORS middleware using the CorsPolicyBuilder class. これには、2 つの方法があります。There are two ways to do this. 1 つは、ラムダで UseCors を呼び出すことです:The first is to call UseCors with a lambda:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // Shows UseCors with CorsPolicyBuilder.
    app.UseCors(builder =>
       builder.WithOrigins("http://example.com"));

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });

注: URL は末尾にスラッシュを付けずに指定される必要があります (/)。Note: The URL must be specified without a trailing slash (/). URL が /で終了する場合、比較時にfalseが返され、ヘッダーが返されません。If the URL terminates with /, the comparison will return false and no header will be returned.

ラムダは、CorsPolicyBuilder オブジェクトをとります。The lambda takes a CorsPolicyBuilder object. 構成オプションのリストはこのトピックで後述します。You'll find a list of the configuration options later in this topic. この例では、ポリシーは http://example.com からのクロス オリジン要求を許可し、他の生成元からの要求は許可しません。In this example, the policy allows cross-origin requests from http://example.com and no other origins.

fluent API をもつ CorsPolicyBuilder では、メソッドの呼び出しを連結することができることに注意してください。Note that CorsPolicyBuilder has a fluent API, so you can chain method calls:

app.UseCors(builder =>
    builder.WithOrigins("http://example.com")
           .AllowAnyHeader()
    );

2 つ目の方法は、名前が付いた CORS ポリシーを 1 つまたは複数定義し、実行時に名前によってポリシーを選択することです。The second approach is to define one or more named CORS policies, and then select the policy by name at run time.

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowSpecificOrigin",
            builder => builder.WithOrigins("http://example.com"));
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // Shows UseCors with named policy.
    app.UseCors("AllowSpecificOrigin");
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

この例では、"AllowSpecificOrigin" という名前の CORS ポリシーを追加します。 This example adds a CORS policy named "AllowSpecificOrigin". このポリシーを選択するには、UseCors にこの名前を渡します。To select the policy, pass the name to UseCors.

MVC での CORS を有効にします。Enabling CORS in MVC

MVC は、アクション、コント ローラーごとまたはグローバルにすべてのコント ローラーごとの特定の CORS を適用するのに代わりに使用できます。You can alternatively use MVC to apply specific CORS per action, per controller, or globally for all controllers. MVC を使用して、CORS を有効にする場合、同じ CORS サービスを使用するが、CORS ミドルウェアではありません。When using MVC to enable CORS the same CORS services are used, but the CORS middleware isn't.

アクションごとPer action

特定のアクションの CORS ポリシーの追加を指定する、[EnableCors]属性をアクションにします。To specify a CORS policy for a specific action add the [EnableCors] attribute to the action. ポリシー名を指定します。Specify the policy name.

[HttpGet]
[EnableCors("AllowSpecificOrigin")]
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

コント ローラーあたりPer controller

特定のコント ローラーの CORS ポリシーの追加を指定する、[EnableCors]属性をコント ローラー クラスにします。To specify the CORS policy for a specific controller add the [EnableCors] attribute to the controller class. ポリシー名を指定します。Specify the policy name.

[Route("api/[controller]")]
[EnableCors("AllowSpecificOrigin")]
public class ValuesController : Controller

グローバルGlobally

有効にする CORS グローバルにすべてのコント ローラーの追加、CorsAuthorizationFilterFactoryグローバル フィルターのコレクションをフィルターします。You can enable CORS globally for all controllers by adding the CorsAuthorizationFilterFactory filter to the global filter collection:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin"));
    });
}

優先順位: アクション、コント ローラーで、グローバルです。The precedence order is: Action, controller, global. アクション レベル ポリシー コント ローラー レベルのポリシーより優先し、コント ローラー レベルのポリシーのグローバル ポリシーよりも優先します。Action-level policies take precedence over controller-level policies, and controller-level policies take precedence over global policies.

CORS を無効にします。Disable CORS

コント ローラーまたはアクションの CORS を無効にする、[DisableCors]属性。To disable CORS for a controller or action, use the [DisableCors] attribute.

[HttpGet("{id}")]
[DisableCors]
public string Get(int id)
{
    return "value";
}

CORS ポリシーのオプションCORS policy options

このセクションでは、CORS ポリシーで設定できるさまざまなオプションについて説明します。This section describes the various options that you can set in a CORS policy.

いくつかのオプションの読み取りに役立つ場合があります方法 CORS 機能最初。For some options it may be helpful to read How CORS works first.

許可されるオリジンを設定します。Set the allowed origins

1 つまたは複数の特定のオリジンを許可します。To allow one or more specific origins:

options.AddPolicy("AllowSpecificOrigins",
builder =>
{
    builder.WithOrigins("http://example.com", "http://www.contoso.com");
});

すべてのオリジンを許可します。To allow all origins:

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace CorsExample4
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
            {
                // BEGIN01
                options.AddPolicy("AllowSpecificOrigins",
                builder =>
                {
                    builder.WithOrigins("http://example.com", "http://www.contoso.com");
                });
                // END01

                // BEGIN02
                options.AddPolicy("AllowAllOrigins",
                    builder =>
                    {
                        builder.AllowAnyOrigin();
                    });
                // END02

                // BEGIN03
                options.AddPolicy("AllowSpecificMethods",
                    builder =>
                    {
                        builder.WithOrigins("http://example.com")
                               .WithMethods("GET", "POST", "HEAD");
                    });
                // END03

                // BEGIN04
                options.AddPolicy("AllowAllMethods",
                    builder =>
                    {
                        builder.WithOrigins("http://example.com")
                               .AllowAnyMethod();
                    });
                // END04

                // BEGIN05
                options.AddPolicy("AllowHeaders",
                    builder =>
                    {
                        builder.WithOrigins("http://example.com")
                               .WithHeaders("accept", "content-type", "origin", "x-custom-header");
                    });
                // END05

                // BEGIN06
                options.AddPolicy("AllowAllHeaders",
                    builder =>
                    {
                        builder.WithOrigins("http://example.com")
                               .AllowAnyHeader();
                    });
                // END06

                // BEGIN07
                options.AddPolicy("ExposeResponseHeaders",
                    builder =>
                    {
                        builder.WithOrigins("http://example.com")
                               .WithExposedHeaders("x-custom-header");
                    });
                // END07

                // BEGIN08
                options.AddPolicy("AllowCredentials",
                    builder =>
                    {
                        builder.WithOrigins("http://example.com")
                               .AllowCredentials();
                    });
                // END08

                // BEGIN09
                options.AddPolicy("SetPreflightExpiration",
                    builder =>
                    {
                        builder.WithOrigins("http://example.com")
                               .SetPreflightMaxAge(TimeSpan.FromSeconds(2520));
                    });
                // END09
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCors("AllowSpecificOrigins");
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

すべてのオリジンからの要求を許可する前に慎重に検討してください。Consider carefully before allowing requests from any origin. これは、事実上あらゆる web サイトが、API への AJAX 呼び出しを実行できることを意味します。It means that literally any website can make AJAX calls to your API.

許可される HTTP メソッドを設定します。Set the allowed HTTP methods

すべての HTTP メソッドを使用するには。To allow all HTTP methods:

options.AddPolicy("AllowAllMethods",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .AllowAnyMethod();
    });

これは、事前要求とアクセスの制御の許可する-メソッド ヘッダーに影響します。This affects pre-flight requests and Access-Control-Allow-Methods header.

許可されている要求ヘッダーを設定します。Set the allowed request headers

CORS プレフライト要求がアプリケーションによって設定される HTTP ヘッダーの一覧を表示する、アクセス コントロール-要求ヘッダー ヘッダーが含ま可能性があります (いわゆる"要求ヘッダーを author") です。A CORS preflight request might include an Access-Control-Request-Headers header, listing the HTTP headers set by the application (the so-called "author request headers").

特定のヘッダー。 ホワイト リストをTo whitelist specific headers:

options.AddPolicy("AllowHeaders",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .WithHeaders("accept", "content-type", "origin", "x-custom-header");
    });

許可するには、すべての著者要求ヘッダー。To allow all author request headers:

options.AddPolicy("AllowAllHeaders",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .AllowAnyHeader();
    });

ブラウザーがアクセス コントロール-要求ヘッダーを設定する方法の完全一致しません。Browsers are not entirely consistent in how they set Access-Control-Request-Headers. 以外の何もするヘッダーを設定する場合は"*"、する必要がありますを含めるには、少なくとも「受け入れる」、「コンテンツの種類」と「発生元」、およびサポートする任意のカスタム ヘッダー。If you set headers to anything other than "*", you should include at least "accept", "content-type", and "origin", plus any custom headers that you want to support.

公開されている応答ヘッダーを設定します。Set the exposed response headers

既定では、ブラウザーはすべてのアプリケーションに応答ヘッダーを公開しません。By default, the browser doesn't expose all of the response headers to the application. (を参照してください http://www.w3.org/TR/cors/#simple-response-header )。既定で利用できる応答ヘッダーは次のとおりです。(See http://www.w3.org/TR/cors/#simple-response-header.) The response headers that are available by default are:

  • キャッシュ制御Cache-Control

  • コンテンツの言語Content-Language

  • Content-TypeContent-Type

  • 有効期限が切れるExpires

  • Last-ModifiedLast-Modified

  • プラグマPragma

CORS の仕様を呼び出す単純な応答ヘッダーです。The CORS spec calls these simple response headers. その他のヘッダー使用可能にするアプリケーション。To make other headers available to the application:

options.AddPolicy("ExposeResponseHeaders",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .WithExposedHeaders("x-custom-header");
    });

クロス オリジン要求に資格情報Credentials in cross-origin requests

資格情報では、CORS 要求で特別な処理が必要です。Credentials require special handling in a CORS request. 既定では、ブラウザーは、クロス オリジン要求に資格情報を送信しません。By default, the browser doesn't send any credentials with a cross-origin request. Cookie と、HTTP 認証スキームの資格情報が含まれます。Credentials include cookies as well as HTTP authentication schemes. クロス オリジン要求に資格情報を送信するには、クライアントは XMLHttpRequest.withCredentials を true に設定する必要があります。To send credentials with a cross-origin request, the client must set XMLHttpRequest.withCredentials to true.

XMLHttpRequest を直接使用するには。Using XMLHttpRequest directly:

var xhr = new XMLHttpRequest();
xhr.open('get', 'http://www.example.com/api/test');
xhr.withCredentials = true;

JQuery: でIn jQuery:

$.ajax({
  type: 'get',
  url: 'http://www.example.com/home',
  xhrFields: {
    withCredentials: true
}

さらに、サーバーは、資格情報を許可する必要があります。In addition, the server must allow the credentials. クロス オリジンの資格情報を使用するには。To allow cross-origin credentials:

options.AddPolicy("AllowCredentials",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .AllowCredentials();
    });

これで、HTTP 応答では、サーバーでクロス オリジン要求の資格情報は、ブラウザーに指示する、アクセス コントロール-を許可する-資格情報ヘッダーが含まれます。Now the HTTP response will include an Access-Control-Allow-Credentials header, which tells the browser that the server allows credentials for a cross-origin request.

ブラウザーが資格情報を送信、応答には有効なアクセス制御を許可する-資格情報ヘッダーが含まれていない場合は、ブラウザーは、アプリケーションへの応答を公開しないし、AJAX 要求は失敗します。If the browser sends credentials, but the response doesn't include a valid Access-Control-Allow-Credentials header, the browser won't expose the response to the application, and the AJAX request fails.

クロス オリジンの資格情報を許可する場合に注意します。Be careful when allowing cross-origin credentials. 別のドメインで web サイトは、ユーザーの知らない間にユーザーの代理でアプリにログインしているユーザーの資格情報を送信できます。A website at another domain can send a logged-in user's credentials to the app on the user's behalf without the user's knowledge. CORS の仕様もその設定を規定する配信元"*"(すべてのオリジン) が有効ではない場合、Access-Control-Allow-Credentialsヘッダーが存在します。The CORS specification also states that setting origins to "*" (all origins) is invalid if the Access-Control-Allow-Credentials header is present.

プレフライト有効期限を設定します。Set the preflight expiration time

アクセス コントロール-Max-age ヘッダーでは、プレフライト要求に応答をキャッシュできる期間を指定します。The Access-Control-Max-Age header specifies how long the response to the preflight request can be cached. このヘッダーを設定します。To set this header:

options.AddPolicy("SetPreflightExpiration",
    builder =>
    {
        builder.WithOrigins("http://example.com")
               .SetPreflightMaxAge(TimeSpan.FromSeconds(2520));
    });

CORS のしくみHow CORS works

このセクションでは、HTTP メッセージのレベルでの CORS 要求での動作について説明します。This section describes what happens in a CORS request at the level of the HTTP messages. 予期しない動作が発生したときに CORS ポリシーを正しく構成できるようにする CORS のしくみと troubleshooted を理解しておく必要があります。It's important to understand how CORS works so that the CORS policy can be configured correctly and troubleshooted when unexpected behaviors occur.

CORS の仕様には、クロス オリジン要求を有効にするいくつかの新しい HTTP ヘッダーが導入されています。The CORS specification introduces several new HTTP headers that enable cross-origin requests. ブラウザーでは、CORS をサポートする場合は、クロス オリジン要求を自動的にこれらのヘッダーを設定します。If a browser supports CORS, it sets these headers automatically for cross-origin requests. カスタムの JavaScript コードは、CORS を有効にするため必要はありません。Custom JavaScript code isn't required to enable CORS.

クロス オリジン要求の例を次に示します。Here is an example of a cross-origin request. Originヘッダーは要求を行っているサイトのドメインを提供します。The Origin header provides the domain of the site that's making the request:

GET http://myservice.azurewebsites.net/api/test HTTP/1.1
Referer: http://myclient.azurewebsites.net/
Accept: */*
Accept-Language: en-US
Origin: http://myclient.azurewebsites.net
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host: myservice.azurewebsites.net

サーバーは、要求を許可している場合は、応答でアクセス制御の許可する-オリジン ヘッダーを設定します。If the server allows the request, it sets the Access-Control-Allow-Origin header in the response. このヘッダーの値は、要求の Origin ヘッダーと一致するか、ワイルドカード文字は、"*"、すべてのオリジンを許可されていることを意味します。The value of this header either matches the Origin header from the request, or is the wildcard value "*", meaning that any origin is allowed:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/plain; charset=utf-8
Access-Control-Allow-Origin: http://myclient.azurewebsites.net
Date: Wed, 20 May 2015 06:27:30 GMT
Content-Length: 12

Test message

応答には、アクセス コントロール-を許可する-オリジン ヘッダーが含まれていない、AJAX 要求が失敗します。If the response doesn't include the Access-Control-Allow-Origin header, the AJAX request fails. 具体的には、ブラウザーには、要求が許可されていません。Specifically, the browser disallows the request. サーバーでは、正常な応答を返す、場合でも、ブラウザーしない応答を使用できるように、クライアント アプリケーション。Even if the server returns a successful response, the browser doesn't make the response available to the client application.

プレフライト要求Preflight Requests

いくつかの CORS 要求については、ブラウザーは、リソースの実際の要求を送信する前に「プレフライト要求を」と呼ばれる、追加の要求を送信します。For some CORS requests, the browser sends an additional request, called a "preflight request", before it sends the actual request for the resource. ブラウザーは、次の条件に該当する場合、プレフライト要求を省略できます。The browser can skip the preflight request if the following conditions are true:

  • 要求メソッドが GET、HEAD、または POST、およびThe request method is GET, HEAD, or POST, and

  • アプリケーションが、要求のヘッダーを受け入れる、Accept-language、Content-language 以外に設定されていないコンテンツの種類、または最後のイベント ID、およびThe application doesn't set any request headers other than Accept, Accept-Language, Content-Language, Content-Type, or Last-Event-ID, and

  • Content-type ヘッダー (場合に設定) は、次のいずれか。The Content-Type header (if set) is one of the following:

    • application/x-www-form-urlencodedapplication/x-www-form-urlencoded

    • マルチパート フォーム データmultipart/form-data

    • テキスト/プレーンtext/plain

アプリケーションで、XMLHttpRequest オブジェクトで setRequestHeader を呼び出すことによって設定されたヘッダーを要求ヘッダーについて規則が適用されます。The rule about request headers applies to headers that the application sets by calling setRequestHeader on the XMLHttpRequest object. (CORS の仕様は、これら「作成者要求ヘッダー」を呼び出します)。ルールは、ユーザー エージェント、ホスト、またはコンテンツの長さなど、ブラウザーを設定できますヘッダーに適用されません。(The CORS specification calls these "author request headers".) The rule doesn't apply to headers the browser can set, such as User-Agent, Host, or Content-Length.

プレフライト要求の例を次に示します。Here is an example of a preflight request:

OPTIONS http://myservice.azurewebsites.net/api/test HTTP/1.1
Accept: */*
Origin: http://myclient.azurewebsites.net
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: accept, x-my-custom-header
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host: myservice.azurewebsites.net
Content-Length: 0

事前要求は、HTTP OPTIONS メソッドを使用します。The pre-flight request uses the HTTP OPTIONS method. 2 つの特殊なヘッダーが含まれています。It includes two special headers:

  • アクセス コントロール-要求メソッド: 実際の要求に使用される HTTP メソッド。Access-Control-Request-Method: The HTTP method that will be used for the actual request.

  • アクセス コントロール-要求ヘッダー。 アプリケーションが、実際の要求で設定できる要求ヘッダーの一覧。Access-Control-Request-Headers: A list of request headers that the application set on the actual request. (ここでも、これが含まれていないブラウザーを設定するヘッダーには。)(Again, this doesn't include headers that the browser sets.)

次に、応答の例、サーバーで要求を許可すると仮定した場合を示します。Here is an example response, assuming that the server allows the request:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Access-Control-Allow-Origin: http://myclient.azurewebsites.net
Access-Control-Allow-Headers: x-my-custom-header
Access-Control-Allow-Methods: PUT
Date: Wed, 20 May 2015 06:33:22 GMT

応答には、許可されているメソッドを一覧表示するアクセスの制御の許可する-メソッド ヘッダーおよび必要に応じて、アクセス コントロール-を許可する-ヘッダー ヘッダー、許可されているヘッダーの一覧が含まれています。The response includes an Access-Control-Allow-Methods header that lists the allowed methods, and optionally an Access-Control-Allow-Headers header, which lists the allowed headers. プレフライト要求が成功した場合、ブラウザーは、前述のとおり、実際の要求を送信します。If the preflight request succeeds, the browser sends the actual request, as described earlier.