HTTPミドルウェア
HTTPミドルウェアは、エンドポイントのメタデータが付与される前、またはルートによってパラメータとエンドポイントIDが提供された後の、2つのルーターチェーンのいずれかで実行されます。
分類:ミドルウェアリファレンス。 各YAMLブロックはルーターの断片です。指定したミドルウェアが登録済みであり、参照するトークンストア、ファイルシステム、エンドポイント、アクター、ポリシーの各エントリが存在することを前提としています。
ミドルウェアの仕組み
各ミドルウェアはオプションマップを受け取り、ハンドラのラッパーを返します:
middleware:
- cors
- ratelimit
options:
cors.allow.origins: "https://example.com"
ratelimit.requests: "100"
オプションにはmiddleware_name.option.name形式のドット記法を使用します。後方互換性のため、従来のアンダースコア形式もサポートされています。
プリハンドラとマッチ後
middleware: # Before endpoint metadata
- cors
- compress
options:
cors.allow.origins: "*"
post_middleware: # Post-match
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"
利用可能なミドルウェア
CORS {#cors}
ブラウザリクエスト向けの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.methods |
GET,POST,PUT,DELETE,OPTIONS,PATCH |
許可するメソッド |
cors.allow.headers |
Origin,Content-Type,Accept,Authorization,X-Requested-With |
許可するリクエストヘッダー |
cors.expose.headers |
- | クライアントに公開するヘッダー |
cors.allow.credentials |
false |
Cookie/認証を許可 |
cors.max.age |
86400 |
プリフライトのキャッシュ時間(秒) |
cors.allow.private.network |
false |
プライベートネットワークアクセス |
OPTIONSプリフライトリクエストは自動的に処理されます。
レート制限 {#ratelimit}
キー単位で追跡するトークンバケット方式のレート制限です。
middleware:
- ratelimit
options:
ratelimit.requests: "100"
ratelimit.window: "1m"
ratelimit.key: "ip"
| オプション | デフォルト | 説明 |
|---|---|---|
ratelimit.requests |
100 |
時間枠あたりのリクエスト数 |
ratelimit.window |
1m |
時間枠 |
ratelimit.burst |
20 |
バースト容量 |
ratelimit.key |
ip |
キー戦略 |
ratelimit.cleanup_interval |
5m |
クリーンアップ間隔 |
ratelimit.entry_ttl |
10m |
エントリの有効期限 |
ratelimit.max_entries |
100000 |
追跡するキーの最大数 |
キー戦略: ip、header:X-API-Key、query:api_key
429 Too Many Requestsをヘッダー付きで返します:X-RateLimit-Limit、X-RateLimit-Window。
圧縮 {#compress}
レスポンスをGzip圧縮します。
middleware:
- compress
options:
compress.level: "default"
compress.min.length: "1024"
| オプション | デフォルト | 説明 |
|---|---|---|
compress.level |
default |
fastest、default、bestのいずれか |
compress.min.length |
1024 |
レスポンスの最小サイズ(バイト) |
クライアントがAccept-Encoding: gzipを送信した場合にのみ圧縮します。
実クライアントIP {#real_ip}
プロキシヘッダーからクライアントIPを抽出します。
middleware:
- real_ip
options:
real_ip.trusted.subnets: "10.0.0.0/8,172.16.0.0/12"
| オプション | デフォルト | 説明 |
|---|---|---|
real_ip.trusted.subnets |
ループバック、RFC 1918、リンクローカル、CGNAT、IPv6ローカル範囲 | 信頼するプロキシCIDR |
real_ip.trust_all |
false |
すべてのソースを信頼(安全でない) |
ヘッダーの優先順位: True-Client-IP > X-Real-IP > X-Forwarded-For
トークン認証 {#token_auth}
トークンベースの認証です。トークンストアの設定についてはセキュリティを参照してください。
middleware:
- token_auth
options:
token_auth.store: "app:tokens"
| オプション | デフォルト | 説明 |
|---|---|---|
token_auth.store |
必須 | トークンストアのレジストリID |
token_auth.header.name |
Authorization |
ヘッダー名 |
token_auth.header.prefix |
Bearer |
ヘッダーのプレフィックス |
token_auth.query.param |
x-auth-token |
クエリパラメータのフォールバック |
token_auth.cookie.name |
x-auth-token |
Cookieのフォールバック |
後続ミドルウェア向けに、コンテキストへアクターとセキュリティスコープを設定します。リクエスト自体は拒否しません。認可はファイアウォールミドルウェアで行われます。
メトリクス {#metrics}
Prometheus形式のHTTPメトリクスです。このミドルウェアは、メトリクスコレクターが利用できる場合にのみ登録され、設定オプションはありません。
middleware:
- metrics
| メトリクス | 型 | 説明 |
|---|---|---|
wippy_http_requests_total |
Counter | リクエスト総数 |
wippy_http_request_duration_seconds |
Histogram | リクエストのレイテンシ |
wippy_http_requests_in_flight |
Gauge | 同時処理中のリクエスト数 |
エンドポイントファイアウォール {#endpoint_firewall}
一致したエンドポイントに基づく認可です。リクエストコンテキストにアクターとセキュリティスコープが必要です。token_authは、それらを提供する方法の1つです。
post_middleware:
- endpoint_firewall
post_options:
endpoint_firewall.action: "access"
| オプション | デフォルト | 説明 |
|---|---|---|
endpoint_firewall.action |
access |
検査する権限アクション |
アクターがない場合は401 Unauthorized、権限がない場合は403 Forbiddenを返します。
リソースファイアウォール {#resource_firewall}
特定のリソースをIDで保護します。ルーターレベルでの使用に適しています。
post_middleware:
- resource_firewall
post_options:
resource_firewall.action: "admin"
resource_firewall.target: "app:admin-panel"
| オプション | デフォルト | 説明 |
|---|---|---|
resource_firewall.action |
access |
権限アクション |
resource_firewall.target |
必須 | リソースのレジストリID |
Sendfile {#sendfile}
ハンドラからX-Sendfileヘッダーを使用してファイルを配信します。
middleware:
- sendfile
options:
sendfile.fs: "app:downloads"
ハンドラは、ファイル配信を開始するために次のヘッダーを設定します:
| ヘッダー | 説明 |
|---|---|
X-Sendfile |
ファイルシステム内のファイルパス |
X-File-Name |
ダウンロード時のファイル名 |
再開可能なダウンロードのため、範囲リクエストをサポートしています。
WebSocketリレー {#websocket_relay}
WebSocket接続をプロセスへ中継します。WebSocketリレーを参照してください。
post_middleware:
- websocket_relay
post_options:
wsrelay.allowed.origins: "https://app.example.com"
SSEリレー {#sse_relay}
プロセスからServer-Sent Eventsをストリーミングします。Server-Sent Eventsを参照してください。
post_middleware:
- sse_relay
post_options:
sserelay.allowed.origins: "https://app.example.com"
OpenTelemetry {#otel}
受信リクエストのOpenTelemetryサーバースパンを記録します。常に登録され、OTelまたはそのHTTP計装が無効な場合はno-opとして動作します。
middleware:
- otel
オプションはありません。metricsミドルウェアと併用できます。PrometheusカウンターとOTelトレースの両方が必要な場合は、両方を有効にしてください。
ミドルウェアの順序
リクエストでは、ミドルウェアは記載順に実行されます。レスポンス処理は逆順に戻ります。推奨される順序:
middleware:
- real_ip # 1. Extract real IP first
- cors # 2. Handle CORS preflight
- compress # 3. Set up response compression
- ratelimit # 4. Check rate limits
- metrics # 5. Record metrics
- token_auth # 6. Authenticate requests
post_middleware:
- endpoint_firewall # Authorize after route match
関連項目
- ルーティング - ルーター設定
- セキュリティ - トークンストアとポリシー
- WebSocketリレー - WebSocket処理
- Server-Sent Events - SSEストリーミング
- ターミナル - ターミナルサービス