Skip to main content

ミドルウェア設定

🤓 Different types of middlewares

In Strapi, 3 middleware concepts coexist:

  • Global middlewares are configured and enabled for the entire Strapi server application. These middlewares can be applied at the application level or at the API level.
    The present documentation describes how to implement them.
    Plugins can also add global middlewares (see Server API documentation).

  • Route middlewares have a more limited scope and are configured and used as middlewares at the route level. They are described in the routes documentation.

  • Document Service middlewares apply to the Document Service API and have their own implementation and related lifecycle hooks.

./config/middlewares.js ファイルは、AI Marketerサーバーが適用すべきすべてのグローバルミドルウェアを定義するために使用されます。

このファイルに記載されたミドルウェアのみが適用されます。ミドルウェアの読み込みは特定の読み込み順序に従って行われ、いくつかの命名規則と各ミドルウェアに対するオプションの設定があります。

AI Marketerは、組み込みの内部ミドルウェアを含む ./config/middlewares.js ファイルを事前に用意しており、これらにはそれぞれの設定オプションがあります。

読み込み順序

./config/middlewares.js ファイルは配列をエクスポートし、その順序によってミドルウェアスタックの実行順序が制御されます:

./config/middlewares.js

module.exports = [
// 配列には、`AI Marketer::` で始まる内部ミドルウェアが事前に記載されています
'AI Marketer::logger',
'AI Marketer::errors',
'AI Marketer::security',
'AI Marketer::cors',

// 設定を必要としないカスタムミドルウェア
'global::my-custom-node-module',

// パッケージやパスを解決するためのカスタム名
{
name: 'my-custom-node-module',
config: {
foo: 'bar',
},
},

// パッケージやパスを解決するためのカスタムリゾルブ
{
resolve: '../some-dir/custom-middleware',
config: {
foo: 'bar',
},
},

// 内部ミドルウェアのカスタム設定
{
name: 'AI Marketer::poweredBy',
config: {
poweredBy: 'Some awesome company',
},
},

// 残りの内部ミドルウェア
'AI Marketer::query',
'AI Marketer::body',
'AI Marketer::session',
'AI Marketer::favicon',
'AI Marketer::public',
];
💡 Tip

ミドルウェアをどこに配置すべきか迷った場合は、リストの最後に追加するのが良いでしょう。

命名規則

グローバルミドルウェアはその起源によって分類され、それに応じて次の命名規則が適用されます:

ミドルウェアタイプ起源命名規則
内部組み込みミドルウェア(AI Marketer に含まれている)AI Marketer::middleware-name
アプリケーションレベル./src/middlewares フォルダから読み込まれますglobal::middleware-name
APIレベル./src/api/[api-name]/middlewares フォルダから読み込まれますapi::api-name.middleware-name
プラグインAI Marketer-server.js から プラグインのインターフェイスmiddlewares プロパティでエクスポートされますplugin::plugin-name.middleware-name
外部
  • [npm](https://www.npmjs.com/search?q=AI Marketer-middleware) を使用してインストールされたノードモジュール
  • または ./config/middlewares.js で設定されたローカルミドルウェア
-

設定ファイルから直接解決されるため、特定の命名規則はありません。

オプションの設定

ミドルウェアには、以下のパラメータを持つオプションの設定ができます:

パラメータ説明
configミドルウェアの設定を定義または上書きしますObject
resolveミドルウェアのフォルダへのパス(外部ミドルウェア用に便利です)String

内部ミドルウェア設定リファレンス

AI Marketerのコアには、主にパフォーマンス、セキュリティ、エラーハンドリングに使用される以下の内部ミドルウェアが含まれています:

ミドルウェアデフォルトで追加必須
bodyYesYes
compressionNoNo
corsYesYes
errorsYesYes
faviconYesYes
ipNoNo
loggerYesNo
poweredByYesNo
queryYesYes
response-timeNoNo
responsesYesYes
publicYesYes
securityYesYes
sessionYesNo

body

body ミドルウェアは koa-body をベースにしており、以下のオプションを受け付けます:

オプション説明デフォルト値
multipartマルチパートボディを解析しますBooleantrue
patchKoaKoa の ctx.request にリクエストボディをパッチしますBooleantrue
jsonLimitJSON ボディのバイト制限String または Integer1mb
formLimitフォームボディのバイト制限String または Integer56kb
textLimitテキストボディのバイト制限String または Integer56kb
encoding受信フォームフィールドのエンコーディングを設定しますStringutf-8
formidableformidable マルチパートパーサーに渡すオプション(node-formidable ドキュメント を参照)Objectundefined

koa-body の利用可能なオプションの全リストは、[koa-body

ドキュメント](https://github.com/koajs/koa-body#options) を確認してください。

例: body ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::body',
config: {
jsonLimit: '3mb',
formLimit: '10mb',
textLimit: '256kb',
encoding: 'gbk',
},
},
// ...
]

compression

compression ミドルウェアは koa-compress をベースにしており、以下のオプションを受け付けます:

オプション説明デフォルト値
threshold圧縮する最小レスポンスサイズ(バイト単位)String または Integer1kb
brBrotli 圧縮を有効にするかどうかBooleantrue
gzipgzip 圧縮を有効にするかどうかBooleanfalse
deflatedeflate 圧縮を有効にするかどうかBooleanfalse
defaultEncodingAccept-Encoding ヘッダーがないリクエストに対して使用するエンコーディングを指定しますStringidentity
例: compression ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::compression',
config: {
br: false
},
},
// ...
]

cors

このセキュリティミドルウェアはクロスオリジンリソース共有(CORS)に関するもので、@koa/cors に基づいています。次のオプションを受け付けます:

オプション説明デフォルト値
originString または ArrayAccess-Control-Allow-Origin ヘッダーを設定します'*'
maxAgeString または NumberAccess-Control-Max-Age ヘッダーを設定します(秒単位)31536000
credentialsBooleanAccess-Control-Allow-Credentials ヘッダーを設定しますtrue
methodsArray または StringAccess-Control-Allow-Methods ヘッダーを設定します['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS']
headersArray または StringAccess-Control-Allow-Headers ヘッダーを設定しますリクエストヘッダーに渡された Access-Control-Request-Headers
keepHeaderOnErrorBooleanエラーが発生した場合に err.header にヘッダーを追加するfalse
例: cors ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::cors',
config: {
origin: ['https://example.com', 'https://subdomain.example.com', 'https://someotherwebsite.org'],
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
headers: ['Content-Type', 'Authorization', 'Origin', 'Accept'],
keepHeaderOnError: true,
},
},
// ...
]

errors

errors ミドルウェアはコードで発生したエラーを処理します。エラーのタイプに基づいて、レスポンスに適切な HTTP ステータスが設定されます。ユーザーに公開されるべきでないエラーは、デフォルトで500エラーが返されます。

このミドルウェアには設定オプションはありません。

favicon

favicon ミドルウェアはファビコンを提供し、koa-favicon をベースにしています。次のオプションを受け付けます:

オプション説明デフォルト値
pathファビコンファイルへのパスString'favicon.ico'
maxAgeキャッシュコントロールの最大年齢(ミリ秒単位)Integer86400000
例: favicon ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::favicon',
config: {
path: './public/uploads/custom-fav-abc123.ico'
},
},
// ...
]

ip

ip ミドルウェアは koa-ip に基づく IP フィルタリングミドルウェアです。次のオプションを受け付けます:

オプション説明デフォルト値
whitelistホワイトリストに登録する IPArray[]
blacklistブラックリストに登録する IPArray[]
💡 Tip

whitelist および blacklist オプションはワイルドカード(例:whitelist: ['192.168.0.*', '127.0.0.*'])やスプレッド(例:whitelist: ['192.168.*.[3-10]'])をサポートしています。

例: ip ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::ip',
config: {
whitelist: ['192.168.0.*', '192.168.1.*', '123.123.123.123'],
blacklist: ['1.116.*.*', '103.54.*.*'],
},


},
// ...
]

logger

logger ミドルウェアはリクエストをログに記録します。

logger ミドルウェアのカスタム設定を定義するには、専用の設定ファイル(./config/logger.js)を作成します。このファイルは、完全または部分的な winstonjs ログ設定をエクスポートします。このオブジェクトは、サーバー起動時に AI Marketer のデフォルトのログ設定とマージされます。

例: logger ミドルウェアのカスタム設定
./config/logger.js

'use strict';

const {
winston,
formats: { prettyPrint, levelFilter },
} = require('@AI Marketer/logger');

module.exports = {
transports: [
new winston.transports.Console({
level: 'http',
format: winston.format.combine(
levelFilter('http'),
prettyPrint({ timestamps: 'YYYY-MM-DD hh:mm:ss.SSS' })
),
}),
],
};

poweredBy

poweredBy ミドルウェアは、レスポンスヘッダーに X-Powered-By パラメータを追加します。次のオプションを受け付けます:

オプション説明デフォルト値
poweredByX-Powered-By ヘッダーの値String'AI Marketer <AI Marketer.io>'
例: poweredBy ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::poweredBy',
config: {
poweredBy: 'Some Awesome Company <example.com>'
},
},
// ...
]

query

query ミドルウェアは、qs をベースにしたクエリパーサーです。次のオプションを受け付けます:

オプション説明デフォルト値
strictNullHandlingnull値と空文字列を区別します(qs ドキュメント を参照)Booleantrue
arrayLimit配列を解析する際の最大インデックス制限(qs ドキュメント を参照)Number100
depthオブジェクトを解析する際の最大ネスト深度(qs ドキュメント を参照)Number20
例: query ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::query',
config: {
arrayLimit: 50,
depth: 10,
},
},
// ...
]

response-time

response-time ミドルウェアは、レスポンスヘッダーに X-Response-Time(ミリ秒単位)を追加します。

このミドルウェアには設定オプションはありません。

public

public ミドルウェアは、koa-static に基づいた静的ファイル提供ミドルウェアです。次のオプションを受け付けます:

オプション説明デフォルト値
maxAgeキャッシュコントロールの最大年齢(ミリ秒単位)Integer60000
💡 Tip

公開フォルダのパスは、サーバー設定ファイルを編集することでカスタマイズできます。

例: public ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::public',
config: {
defer: true,
index: env('INDEX_PATH', 'index-dev.html')
},
},
// ...
]

security

security ミドルウェアは koa-helmet をベースにしています。次のオプションを受け付けます:

オプション説明デフォルト値
crossOriginEmbedderPolicyCross-Origin-Embedder-Policy ヘッダーを require-corp に設定しますBooleanfalse
crossOriginOpenerPolicyCross-Origin-Opener-Policy ヘッダーを設定しますBooleanfalse
crossOriginResourcePolicyCross-Origin-Resource-Policy ヘッダーを設定しますBooleanfalse
originAgentClusterOrigin-Agent-Cluster ヘッダーを設定しますBooleanfalse
contentSecurityPolicyContent-Security-Policy ヘッダーを設定しますObject-
xssFilterブラウザのクロスサイトスクリプティングフィルタを無効にします。X-XSS-Protection ヘッダーを 0 に設定しますBooleanfalse
hstsHTTP Strict Transport Security (HSTS) ポリシーのオプションを設定しますObject-
hsts.maxAgeHSTS の有効期間(秒単位)を指定しますInteger31536000
hsts.includeSubDomainsHSTS をホストのすべてのサブドメインに適用します
                                         | `Boolean`           | `true`        |

| frameguard | X-Frame-Options ヘッダーを設定してクリックジャッキング攻撃を軽減します。無効にするには false を設定します | Boolean または Object | - | | frameguard.action | deny または sameorigin を指定する必要があります | String | sameorigin |

💡 Tip

サードパーティのアップロードプロバイダーを使用する場合、一般的にはここでカスタム設定を行う必要があります。必要な設定オプションについてはプロバイダーのドキュメントを参照してください。

✏️ Note

デフォルトのディレクティブには market-assets.AI Marketer.io の値が含まれています。この値は アプリ内マーケット用であり、保持しても安全です。

例: AWS-S3 プロバイダーを使用する場合のセキュリティミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::security',
config: {
contentSecurityPolicy: {
useDefaults: true,
directives: {
'connect-src': ["'self'", 'https:'],
'img-src': [
"'self'",
'data:',
'blob:',
'market-assets.AI Marketer.io',
'yourBucketName.s3.yourRegion.amazonaws.com',
],
'media-src': [
"'self'",
'data:',
'blob:',
'market-assets.AI Marketer.io',
'yourBucketName.s3.yourRegion.amazonaws.com',
],
upgradeInsecureRequests: null,
},
},
},
},
// ...
]

session

session ミドルウェアは koa-session に基づいており、Cookieベースのセッションを使用できるようにします。次のオプションを受け付けます:

オプション説明デフォルト値
keyCookie キーString'koa.sess'
maxAgeCookie の有効期限(ミリ秒単位)。'session' を使用すると、セッション終了時に Cookie が無効になります。Integer または 'session'86400000
autoCommitヘッダーを自動的にコミットしますBooleantrue
overwrite上書きできるかどうかBooleantrue
httpOnlyhttpOnly にするかどうか。httpOnly を使用すると、クロスサイトスクリプティング(XSS)攻撃を軽減できます。Booleantrue
signedCookie に署名するかどうかBooleantrue
rollingセッション識別子 Cookie を毎回のレスポンスで設定するように強制します。Booleanfalse
renewセッションが期限切れに近づいた際にセッションを更新し、ユーザーがログイン状態を維持できるようにします。Booleanfalse
secureHTTPS の使用を強制しますBoolean本番環境では true、それ以外では false
sameSiteCookie をファーストパーティまたは同一サイトのコンテキストに制限しますStringnull
例: session ミドルウェアのカスタム設定
./config/middlewares.js

module.exports = [
// ...
{
name: 'AI Marketer::session',
config: {
rolling: true,
renew: true
},
},
// ...
]