コンテンツにスキップ

HTTPミドルウェア

ミドルウェアはルート処理の前後にHTTPリクエストを処理します。

ミドルウェアはHTTPハンドラをラップして処理ロジックを追加します。各ミドルウェアはオプションマップを受け取り、ハンドララッパーを返します:

middleware:
- cors
- ratelimit
options:
cors.allow.origins: "https://example.com"
ratelimit.requests: "100"

オプションはドット記法を使用:middleware_name.option.name。後方互換性のためにレガシーアンダースコア形式もサポートされています。

マッチ前はルートマッチング前に実行—CORSや圧縮などの横断的な関心事に。 マッチ後はルートがマッチした後に実行—ルート情報が必要な認可に。
middleware: # マッチ前
- cors
- compress
options:
cors.allow.origins: "*"
post_middleware: # マッチ後
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"

マッチ前

ブラウザリクエスト用のCross-Origin Resource Sharing。

middleware:
- cors
options:
cors.allow.origins: "https://app.example.com"
cors.allow.credentials: "true"
オプションデフォルト説明
cors.allow.origins*許可するオリジン(カンマ区切り、*.example.comをサポート)
cors.allow.methodsGET,POST,PUT,DELETE,OPTIONS,PATCH許可するメソッド
cors.allow.headersOrigin,Content-Type,Accept,Authorization,X-Requested-With許可するリクエストヘッダー
cors.expose.headers-クライアントに公開するヘッダー
cors.allow.credentialsfalseCookie/認証を許可
cors.max.age86400プリフライトキャッシュ(秒)
cors.allow.private.networkfalseプライベートネットワークアクセス

OPTIONSプリフライトリクエストは自動的に処理されます。


マッチ前

キーごとの追跡を持つトークンバケットレート制限。

middleware:
- ratelimit
options:
ratelimit.requests: "100"
ratelimit.window: "1m"
ratelimit.key: "ip"
オプションデフォルト説明
ratelimit.requests100ウィンドウごとのリクエスト数
ratelimit.window1m時間ウィンドウ
ratelimit.burst20バースト容量
ratelimit.keyipキー戦略
ratelimit.cleanup_interval5mクリーンアップ頻度
ratelimit.entry_ttl10mエントリ有効期限
ratelimit.max_entries100000追跡する最大キー数

キー戦略: ipheader:X-API-Keyquery:api_key

429 Too Many Requestsをヘッダー付きで返します:X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset


マッチ前

レスポンスのGzip圧縮。

middleware:
- compress
options:
compress.level: "default"
compress.min.length: "1024"
オプションデフォルト説明
compress.leveldefaultfastestdefault、またはbest
compress.min.length1024最小レスポンスサイズ(バイト)

クライアントがAccept-Encoding: gzipを送信した場合のみ圧縮します。


マッチ前

プロキシヘッダーからクライアントIPを抽出。

middleware:
- real_ip
options:
real_ip.trusted.subnets: "10.0.0.0/8,172.16.0.0/12"
オプションデフォルト説明
real_ip.trusted.subnetsプライベートネットワーク信頼するプロキシCIDR
real_ip.trust_allfalseすべてのソースを信頼(安全でない)

ヘッダー優先順位: True-Client-IP > X-Real-IP > X-Forwarded-For


マッチ前

トークンベースの認証。トークンストア設定についてはセキュリティを参照。

middleware:
- token_auth
options:
token_auth.store: "app:tokens"
オプションデフォルト説明
token_auth.store必須トークンストアレジストリID
token_auth.header.nameAuthorizationヘッダー名
token_auth.header.prefixBearer ヘッダープレフィックス
token_auth.query.paramx-auth-tokenクエリパラメータフォールバック
token_auth.cookie.namex-auth-tokenCookieフォールバック

ダウンストリームミドルウェア用にコンテキストにアクターとセキュリティスコープを設定します。リクエストをブロックしません—認可はファイアウォールミドルウェアで行われます。


マッチ前

PrometheusスタイルのHTTPメトリクス。設定オプションはありません。

middleware:
- metrics
メトリクスタイプ説明
wippy_http_requests_totalCounter総リクエスト数
wippy_http_request_duration_secondsHistogramリクエストレイテンシー
wippy_http_requests_in_flightGauge同時リクエスト数

エンドポイントファイアウォール {#endpoint_firewall}

Section titled “エンドポイントファイアウォール {#endpoint_firewall}”

マッチ後

マッチしたエンドポイントに基づく認可。token_authからのアクターが必要。

post_middleware:
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"
オプションデフォルト説明
endpoint_firewall.actionaccessチェックする権限アクション

401 Unauthorized(アクターなし)または403 Forbidden(権限拒否)を返します。


リソースファイアウォール {#resource_firewall}

Section titled “リソースファイアウォール {#resource_firewall}”

マッチ後

IDで特定のリソースを保護。ルーターレベルで便利。

post_middleware:
- resource_firewall
post_options:
resource_firewall.action: "admin"
resource_firewall.target: "app:admin-panel"
オプションデフォルト説明
resource_firewall.actionaccess権限アクション
resource_firewall.target必須リソースレジストリID

マッチ前

ハンドラからのX-Sendfileヘッダー経由でファイルを配信。

middleware:
- sendfile
options:
sendfile.fs: "app:downloads"

ハンドラはファイル配信をトリガーするためにヘッダーを設定:

ヘッダー説明
X-Sendfileファイルシステム内のファイルパス
X-File-Nameダウンロードファイル名

再開可能なダウンロードのためのRangeリクエストをサポート。


マッチ後

WebSocket接続をプロセスにリレー。WebSocketリレーを参照。

post_middleware:
- websocket_relay
post_options:
wsrelay.allowed.origins: "https://app.example.com"

Post-match

プロセスからServer-Sent Eventsをストリーミングします。Server-Sent Eventsを参照してください。

post_middleware:
- sse_relay
post_options:
sserelay.allowed.origins: "https://app.example.com"

Pre-match

受信リクエストのOpenTelemetryスパンとメトリクスを記録します。OTelが有効な場合に自動登録され、それ以外の場合はno-opとして動作します。

middleware:
- otel

オプションは受け取りません。metricsミドルウェアと連携して動作します。PrometheusカウンターとOTelトレースの両方が必要な場合は、両方を有効にしてください。


ミドルウェアはリストされた順序で実行されます。推奨される順序:

middleware:
- real_ip # 1. 最初にReal IPを抽出
- cors # 2. CORSプリフライトを処理
- compress # 3. レスポンス圧縮をセットアップ
- ratelimit # 4. レート制限をチェック
- metrics # 5. メトリクスを記録
- token_auth # 6. リクエストを認証
post_middleware:
- endpoint_firewall # ルートマッチ後に認可