メインコンテンツまでスキップ

API Gateway

API Gateway は 443/TCP でクライアントからの接続を受け付け、アプリケーションの Web UI や外部連携のための API を提供する。

TLS通信

API Gateway では、以下の処置により、全ての通信を TLS で暗号化して行います。

  • サーバ証明書がない状態で受信したリクエストはすべて 400 のエラーで返す
  • http 80 番ポートに受信した場合、 301 で https にリダイレクトする
  • 全ての通信のレスポンスヘッダーに HSTS ヘッダーを付与する
Strict-Transport-Security: max-age=<seconds>; includeSubDomains; preload

mTLS認証

(未検討) https://github.com/cloudflare/pingora/issues/594

セッション管理アクション

ルーティングチェーンのアクションではセッション管理のアクションを設定することが可能です。

セッションCookie発行アクション

セッションCookie発行アクションにより、認証されていないアクセスのセッションを管理できます。 CHIPIN_SESSION Cookie でセッションを識別しますが、攻撃などで負荷がかからないように API Gateway 内のメモリ上での管理は行わず JWT の発行にとどめます。 JWTのクレームは API Gateway のリクエストコンテキストの変数として保存されます。 JWTのクレームおよびリクエストコンテキスト上の変数名は以下の通りです。

クレーム名説明変数名
issstringセッションIDを発行した仮想ホストのFQDNsession_originator
substringセッションID.session_id
iatinteger発行日時(UNIXタイムスタンプ)session_start_at
expinteger有効期限(UNIXタイムスタンプ)session_expire_at

セッションIDには、CSPRNG(暗号論的擬似乱数生成器)アルゴリズムを使って18バイトの乱数を生成し、base64エンコードした24文字の文字列を使用します。 JWTにはレルムの鍵(インベントリのレルムの signingKeyプロパティ)で署名します。

Cookie はレルムの設定のセッション保持期間(インベントリのレルムの sessionTimeout プロパティ)に従って有効期限が設定されます。 保持期間の 50% の時間を経過してアクセスすると同じセッションIDで Cookie が再発行されます。従って、セッション保持期間よりも認証トークンのライフタイムが長い場合はライフタイムが残っているにも関わらずログアウトしてしまう場合がありますので注意が必要です。

セッションオブジェクト保存アクション

認証に成功すると、認証前セッションで発行されたセッションIDをキーにしてセッションオブジェクトをメモリ上に作成し、そこにユーザIDなど認証で得られたユーザの属性情報を保持します。 (詳細未)

ライブマイグレーション

API Gateway は動作しているサーバとは別のサーバに無停止で移ることができます。 これには前段に ALB のようなロードバランサを配置して行う方式と route53 のような GSLB で切り替える方式があります。 いずれの場合でも移動元の API Gateway はグレースフルシャットダウンにより、処理途中のリクエストを完了させてから停止します。 この実装により無停止ローリングアップデートも可能になります。

SPNとの接続はサービス Consumer となるため、マイグレーションにおいて問題となることはありません。

エラーコンテンツ

API-Gateway でリクエストを処理中にエラーが発生した場合、エラーを返しますが、そのときのレスポンスの内容についてはリクエストの Accept ヘッダの内容に合わせて選択します。例えば、 JavaScript から Fetch でアクセスする場合は、

Accept: application/json

がリクエストヘッダに設定されます。これに対して HTML を返すとクライアントのコーディングでパースに失敗する場合があります。 これを避けるために API-Gateway では Accept ヘッダを見てクライアントが受け入れ可能なタイプのコンテンツを返す仕組みを提供します。

また、以下の要件を満たすよう考慮します。

  • エラーコンテンツを返すために再度エラーにならないよう、コンテンツは API Gateway が自力で生成できなければならない
  • エラーコンテンツがHTMLである場合、ページ内の参照で再度エラーにならないよう、シングルHTMLで内容を構成するようにする
  • Realm や Service ごとにカスタマイズを可能とする
  • カスタマイズにおいてはコンテンツ内に JavaScript のパラメータやメッセージに埋め込めるようテンプレート言語をサポートする (詳細未)