Private Space でのルーティング
最終更新日 2024年05月07日(火)
Table of Contents
Private Space でのルーターは、Common Runtime 内のルーターとは少し動作が異なります。この記事では、その違いについて説明します。Common Runtime と Private Space に共通のルーティング動作については、「HTTP ルーティング」を参照してください。
Heroku エラーコード
Common Runtime の Heroku エラーコードのうち、Private Space のルーターでは以下のエラーをサポートしています。
- H10 - App crashed (アプリがクラッシュしました)
- H11 - Backlog too deep (バックログが深すぎます)
- H12 - Request timeout (リクエストタイムアウト)
- H13 - Connection closed without response (応答なしで接続が閉じられました)
- H15 - Idle connection (アイドル接続)
- H17 - Poorly formatted HTTP response (HTTP 応答の形式が不完全です)
- H18 - Server Request Interrupted (サーバーリクエストが中断されました)
- H19 - Backend connection timeout (バックエンド接続タイムアウト)
- H21 - Backend connection refused (バックエンド接続が拒否されました)
- H25 - HTTP Restriction: Oversized cookies (HTTP の制限: Cookie のサイズが大きすぎます)
- H25 - HTTP Restriction: Oversized header (HTTP の制限: ヘッダーのサイズが大きすぎます)
- H25 - HTTP Restriction: Oversized status line (HTTP の制限: ステータス行のサイズが大きすぎます)
- H26 - Request Error: Unsupported expect header value (リクエストエラー: サポートされていない expect ヘッダーの値です)
- H26 - Request Error: Bad header (リクエストエラー: ヘッダーが不正です)
- H27 - Client Request Interrupted (クライアントリクエストが中断されました)
- H28 - Client Connection Idle (クライアント接続がアイドル状態です)
- H99 - Platform error (プラットフォームエラー)
サイズの大きい Cookie とヘッダーのサポート
Private Space のルーターでは、個々の HTTP ヘッダーのサイズは 512 KB までサポートされます。
応答本体サイズのログ記録
Private Space のルーターでは、アプリログの bytes
フィールドで応答本体のサイズのみをカウントします。Common Runtime の Heroku ルーターでは、ステータス行、ヘッダー、および本体サイズをカウントします。
dyno 接続の再利用
持続的 HTTP 接続をサポートするアプリケーションの場合、Private Space のルーターでは、dyno への接続を複数のリクエストで再利用する場合があります。これらの再利用される接続は、クライアントソフトウェアと Heroku プラットフォームの間の接続からは独立しています。
応答本体のバッファリング
Private Space のルーターでは、小さな本体の断片をクライアントに多数送信することを避けるために、応答本体を内部でバッファリングする場合があります。これにより、ほとんどのアプリケーションのパフォーマンスが向上しますが、低レイテンシーのストリーミングを必要とするアプリケーションには悪影響が及ぶ可能性があります。小さな本体の断片は最大 10 ミリ秒にわたってバッファリングされますが、ネットワークの特性のためにクライアントでバッファリング時間が延びる可能性があります。
メンテナンスモードとカスタムエラーページ
Private Space では、メンテナンスモードとカスタムエラーページの両方がサポートされています。ただし、Common Runtime と違って、Private Space のルーターでメンテナンスとカスタムエラーページを提供するためには、少なくとも 1 つの Web dyno が実行されている必要があります。
Content-Length および Content-Type ヘッダー
Common Runtime のルーティングでは、リクエストに複数の Content-Length
ヘッダーがあっても、同じ値が含まれている限りは許可されます。Private Space のルーターはこれと異なり、複数の Content-Length
ヘッダーが存在するときは常に 400 Bad Response
を返します。
また Private Space のルーターでは、MIME スニッフィング標準に基づき、dyno の応答に Content-Type
ヘッダーがない場合はリクエストでこのヘッダーを設定しようとします。
クエリ文字列のログ記録
Private Space のルーターによって生成されるログメッセージの path
フィールドには、(URL または GET パラメータとも呼ばれる) クエリ文字列パラメータが含まれています。一部のアプリケーションでは、クエリ文字列を使用して機密性の高いデータを渡します。たとえば、OAuth アプリケーションでは通常、クエリ文字列パラメータを使用してサービス間で一時トークンを渡します。
SNI サーバー名と host ヘッダーの一致
一部のクライアントおよび CDN では、Heroku アプリケーションに接続するとき、リクエストの host ヘッダーとは異なる SNI サーバー名の値を設定します。Heroku では、Private Space アプリケーションにおいて、アプリケーションのパブリック DNS エントリに対し、内部的な Space 名を指す CNAME レコードを設定することを推奨しています。これは通常、desolate-dawn-42.fathomless-ravine-43.herokuspace.com
形式のレコードを指す www.example-app.com
カスタムドメインのレコードです。
両方の名前が同じアプリケーションのドメインとして設定されている限り、サーバー名の値と host ヘッダーの値が一致しなくても許容されます。desolate-dawn-42.fathomless-ravine-43.herokuspace.com
形式のドメインは、Heroku によって設定および管理されます。
Private Space では、アプリに接続するために SNI のクライアントサポートが要求されます。
SSL セキュリティ
Private Space 内のアプリでは、クライアントとの TLS 接続のネゴシエーションに使用する暗号スイートを選択できます。すべての新しいアプリは、TLS v1.2 および 1.3 のみをサポートする spaces-tls-salesforce
スイートを使用して作成されます。
利用可能な Private Space 暗号スイート
spaces-tls-legacy
および spaces-strict-tls
暗号は 2023 年 4 月でサポートが終了しました。セキュリティのベストプラクティスのために、spaces-tls-salesforce
または spaces-tls-modern
のみを使用して Private Space 内のアプリを設定することをお勧めします。
Private Space 内のアプリは、次の暗号スイートのうち 1 つ以上を使用して設定できます。
spaces-tls-salesforce
Salesforce TLS ガイドラインに準拠し、すべての新しいアプリで使用されます。spaces-tls-modern
モダンスイートは TLSv1.2 および TLSv1.3 のみをサポートします。このスイートは、最高のセキュリティを提供し、比較的新しいブラウザやモバイル/IoT クライアントで機能します。
TLSv1.3 暗号スイート
TLSv1.3 では暗号スイート選択の動作が異なり、このセクションで説明する暗号スイート設定は、TLSv1.3 よりも前の TLS バージョンのみに適用されます。TLSv1.3 の暗号スイートは変更できず、次のデフォルトの暗号スイートがサポートされています。
TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
Salesforce 暗号スイート
Salesforce スイートはすべての新しいアプリで標準であり、アプリで Salesforce TLS ガイドラインを使用していることを保証するための簡単な方法を提供します。Heroku の現在の設定では TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
または TLS_RSA_WITH_AES_256_CBC_SHA256
暗号スイートをサポートしていないことに注意してください。
暗号
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
モダン暗号スイート
モダンスイートは TLSv1.2 のみをサポートします。このスイートは、最高のセキュリティを提供し、比較的新しいブラウザやモバイル/IoT クライアントで機能します。このスイートを適用するには、示されているように、他のスイートを無効にして spaces-tls-modern
スイートを有効にします。
$ heroku features:disable spaces-tls-salesforce --app desolate-dawn-42
$ heroku features:enable spaces-tls-modern --app desolate-dawn-42
$ heroku features:disable spaces-tls-legacy --app desolate-dawn-42
$ heroku features:disable spaces-strict-tls --app desolate-dawn-42
暗号
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
デフォルトの暗号
デフォルトスイートは TLSv1.2 および TLSv1.3 をサポートします。このスイートは高いセキュリティを提供し、幅広いブラウザおよびクライアントと互換性があります。デフォルトの TLS 動作にするには、示されているように、他のすべての TLS 暗号スイート機能を無効にします。
デフォルトの暗号スイートは、他のすべてのスイートが無効になった後に残る暗号です。新しいアプリは spaces-tls-salesforce
機能を有効にして作成されます。
$ heroku features:disable spaces-tls-salesforce --app desolate-dawn-42
$ heroku features:disable spaces-tls-modern --app desolate-dawn-42
$ heroku features:disable spaces-tls-legacy --app desolate-dawn-42
$ heroku features:disable spaces-strict-tls --app desolate-dawn-42
暗号
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
[非推奨] ストリクト
spaces-strict-tls
機能フラグを有効にした場合、Private Space のルーターは TLS バージョン 1.1 および 1.2 をサポートします。このフラグは非推奨であり、以前の Heroku TLS ターミネーション動作との下位互換性のためにのみ使用してください。
$ heroku features:disable spaces-tls-salesforce --app desolate-dawn-42
$ heroku features:disable spaces-tls-modern --app desolate-dawn-42
$ heroku features:disable spaces-tls-legacy --app desolate-dawn-42
$ heroku features:enable spaces-strict-tls --app desolate-dawn-42
暗号
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
HTTP 1.0
HTTP/2 は Private Space 用のパブリックベータ版です。Heroku Labs フラグを使用して HTTP/2 を有効にする
Private Space のルーターでは、HTTP 1.0 リクエストを HTTP 1.1 リクエストに変換して dyno に転送します。元のリクエストで HTTP 1.0 を使用していた場合、dyno からの HTTP 1.1 応答は HTTP 1.0 応答としてクライアントに送信されます。
Common Runtime のルーターでは HTTP 1.0 リクエストを HTTP 1.1 リクエストに変換しますが、HTTP 1.1 応答から HTTP 1.0 応答への逆変換は行いません。
ステータス行
Private Space のルーターは、CRLF
(\r\n
) で終わる行を考慮せず、リクエストの最初の行全体 (最初の \n
文字まで) をステータス行として扱います。ステータス行の終わりにベア改行を許可するのは、Nginx のような HTTP サーバーで一般的です。
サポートされている HTTP メソッド
Private Space のルーターでは、RFC で定義されていないものも含め、あらゆる HTTP メソッド (“動詞” と呼ぶ場合もある) をサポートしています。
カスタム DNS リゾルバー
Private Space のアプリでは、dyno の最初の DNS サーバーターゲットとして単一の DNS リゾルバーを挿入し、その後に標準の Private Space DNS ターゲットを続けることをサポートしています。この機能を使用するには、目的のアプリで spaces-extra-resolver
フラグを有効にしてから、HEROKU_EXTRA_RESOLVER
環境設定を設定する必要があります。
次に例を示します。
$ heroku labs:enable spaces-extra-resolver -a "$APP_NAME"
$ heroku config:set -a "$APP_NAME" HEROKU_EXTRA_RESOLVER=DNS-Server-IP