Cross-Origin Resource Sharing (CORS)の有効化

Estimated reading time: 1 minute

KtorはデフォルトでCross-Origin Resource Sharing (CORS)の適切な実装をサポートするインターセプタを提供しています。

Cross-Origin Resource Sharing (CORS)はドメイン境界をまたぐアクセスを有効にする仕様です。パブリックなコンテンツを配信する場合、Javascriptやブラウザアクセスから普遍的にアクセス可能にできるようにするためCORSを検討してください。 参考: enable-cors.org

This feature is defined in the class io.ktor.features.CORS and no additional artifacts are required.

基本

まず初めに、CORS Featureをアプリケーションにインストールします。

fun Application.main() {
  ...
  install(CORS)
  ...
}

CORS Featureのデフォルトの設定はGETPOSTHEADHTTPメソッドと以下のヘッダーのみ扱えます:

  HttpHeaders.Accept
  HttpHeaders.AcceptLanguages
  HttpHeaders.ContentLanguage
  HttpHeaders.ContentType

発展的内容

以下はCORSを有効にしているAPI関数を表す発展的な例です。

fun Application.main() {
  ...
  install(CORS)
  {
    method(HttpMethod.Options)
    header(HttpHeaders.XForwardedProto)
    anyHost()
    host("my-host")
    // host("my-host:80")
    // host("my-host", subDomains = listOf("www"))
    // host("my-host", schemes = listOf("http", "https"))
    allowCredentials = true
    allowNonSimpleContentTypes = true
    maxAge = Duration.ofDays(1)
  }
  ...
}

設定

  • method("HTTP_METHOD") : 設定したHTTPメソッドを、CORSを利用するHTTPメソッド群ホワイトリストに追加します。
  • header("header-name") : 設定したHeaderをCORSを利用するヘッダー群ホワイトリストに追加します。
  • exposeHeader("header-name") : レスポンス内にこのヘッダーを追加します。
  • exposeXHttpMethodOverride() : レスポンス内にX-Http-Method-Overrideヘッダーを追加します。
  • anyHost() : リソースに任意のホストからアクセスすることを許可します。
  • host("hostname") : 指定したホストのみCORSを使えるようにします。port番号やサブドメイン一覧やschemaを指定することもできます。
  • allowCredentials : Access-Control-Allow-Credentialsヘッダーをレスポンスに含めます。
  • allowNonSimpleContentTypes: Content-Typeリクエストヘッダーを、simple content type以外のホワイトリスト値として追加することができます。
  • maxAge: 指定したmaxAgedでAccess-Control-Max-Ageヘッダーをレスポンスに含めます。