こんにちは、かつコーチです。
システムやアプリ作成時にセキュリティ面ではMiddlewareを扱うことが多いです。
Middlewareはいわゆる門番=玄関なので、鍵がかかっているか、正しい鍵なのかどうかを示します。
そこで、今回は、LaravelにおけるMiddlewareについて解説します。
LaravelのMiddlewareとは?
Laravelのミドルウェア(Middleware)は、
HTTPリクエストとレスポンスの間に挟まる「フィルター」のような役割を持ちます。
すべてのリクエストは、コントローラーやルートに到達する前にミドルウェアを通過し、
これによりリクエストを検証したり、特定の処理を実行したりすることができます。
例えば、ユーザーの認証、リクエストのログ記録、
CSRFトークンのチェックなどが一般的な使用例です。
ミドルウェアの基本概念
- HTTPリクエストとレスポンスの処理: リクエストがコントローラーに到達する前、またはレスポンスがクライアントに返される前に特定の処理を行う。
- 複数のミドルウェアをチェーンのように繋げられる: 1つのリクエストに対して複数のミドルウェアを適用でき、各ミドルウェアは次のミドルウェアに制御を渡す。
- 認証、ログ、キャッシュ、CSRF保護などが主な役割。
ミドルウェアは app/Http/Middleware
フォルダに保存され、kernel.php
に登録されて適用されます。
ミドルウェアの使用例
- 認証: ユーザーが認証されているかをチェック
- 権限管理: ユーザーが特定のアクションを行う権限があるかを確認
- CSRF保護: フォーム送信の際にCSRFトークンが正しいかを検証
- ログ: リクエストの履歴を記録
- CORS(クロスオリジンリソース共有)対応: 特定のドメインからのリクエストのみを許可
例えば、認証済みユーザーだけに特定のルートを許可したい場合には以下のように書けます:
Route::get('dashboard', function () {
// ダッシュボードの内容
})->middleware('auth');
この例では、auth
ミドルウェアが適用されており、ユーザーが認証されていなければリクエストは拒否されます。
Laravelの9つの主要なミドルウェアクラス
Laravelには、デフォルトでいくつかのミドルウェアが用意されており、よく使われるものがapp/Http/Middleware
に存在しています。代表的なものを9つ紹介します。
- Authenticate (
app/Http/Middleware/Authenticate.php
)- 概要: このミドルウェアは、リクエストされたルートが認証済みのユーザーのみにアクセス可能かどうかを確認します。未認証のユーザーがアクセスした場合、ログインページにリダイレクトされます。
- 用途: 認証が必要なページやAPIルートへのアクセス制限。
- EncryptCookies (
app/Http/Middleware/EncryptCookies.php
)- 概要: このミドルウェアは、クッキーを暗号化し、レスポンスに追加する前に解読する役割を持ちます。
- 用途: クッキーのデータを保護し、不正なアクセスを防ぐ。
- RedirectIfAuthenticated (
app/Http/Middleware/RedirectIfAuthenticated.php
)- 概要: 既に認証済みのユーザーがアクセスできないページ(例: ログインページ)にアクセスしようとした場合、別の場所にリダイレクトします。
- 用途: ログイン済みのユーザーが再度ログインページにアクセスできないように制御する。
- TrimStrings (
app/Http/Middleware/TrimStrings.php
)- 概要: このミドルウェアは、リクエスト入力の全ての文字列から余計な空白(ホワイトスペース)をトリム(削除)します。
- 用途: フォームデータなどで不要な空白を削除して整形する。
- VerifyCsrfToken (
app/Http/Middleware/VerifyCsrfToken.php
)- 概要: このミドルウェアは、リクエストに含まれるCSRFトークンが正しいかどうかを検証します。CSRF(Cross-Site Request Forgery)は、不正なサイトが他のサイトのフォームを送信する攻撃手法です。Laravelはこれを防ぐためにフォームの送信時にトークンをチェックします。
- 用途: セキュリティ上重要で、特にフォーム送信やAPIエンドポイントで利用される。
- CheckForMaintenanceMode (
app/Http/Middleware/CheckForMaintenanceMode.php
)- 概要: このミドルウェアは、アプリケーションがメンテナンスモードにあるかどうかを確認し、メンテナンス中であればすべてのリクエストを遮断します。メンテナンスモード中は、ユーザーに特別なページ(メンテナンス中のページ)を表示できます。
- 用途: システムのメンテナンスを行うときに、一般ユーザーのアクセスを制限。
- SubstituteBindings (
app/Http/Middleware/SubstituteBindings.php
)- 概要: ルートモデルバインディングを使用するためのミドルウェアです。ルートに設定されたモデルのIDなどを自動的にモデルにバインド(結びつけ)します。
- 用途: コントローラーにモデルインスタンスを自動で渡すために使用される。
- ThrottleRequests (
app/Http/Middleware/ThrottleRequests.php
)- 概要: このミドルウェアは、APIリクエストの頻度を制限します。一定期間内に特定のIPアドレスからのリクエストが許容量を超えた場合、429 Too Many Requestsのエラーを返します。
- 用途: APIへのリクエスト回数制限を設定して、DoS攻撃などの防止に役立つ。
- ValidateSignature (
app/Http/Middleware/ValidateSignature.php
)- 概要: 署名付きURLの有効性を検証するミドルウェアです。署名付きURLとは、リンクに特定のトークンを含めて、そのリンクが改ざんされていないことを確認するためのものです。
- 用途: 特定のURLが改ざんされていないことを確認したい場合に使用される(例: メールでのパスワードリセットリンクなど)。
VerifyCsrfTokenの詳細
VerifyCsrfToken
は、CSRF(Cross-Site Request Forgery)攻撃から保護するために使用されるミドルウェアです。
- CSRFトークンとは: CSRFトークンは、フォームやリンクが不正に操作されないようにするための一種のセキュリティキーです。ユーザーのフォーム送信が正当であることを確認するため、トークンが埋め込まれ、送信されたリクエストにこのトークンが含まれているかを検証します。これにより、他のサイトからの悪意のあるフォーム送信を防ぐことができます。
通常、フォームを送信するとき、@csrf
ディレクティブをBladeテンプレート内に含めることで、このトークンを自動で埋め込むことができます。
<form method="POST" action="/example">
@csrf
<!-- フォームの内容 -->
</form>
VerifyCsrfToken
ミドルウェアは、リクエストに含まれるこのトークンが有効かどうかを確認し、
無効であればリクエストを拒否します。
これにより、外部の悪意あるサイトがユーザーを偽装してリクエストを送信することを防ぎます。
まとめ
Laravelのミドルウェアは、リクエストとレスポンスの間に挟まって、
認証、セキュリティ、入力データの整形など、さまざまな役割を果たします。
9つの主要なミドルウェアはそれぞれ異なる目的を持っており、
特定の要件に応じて適用されます。
VerifyCsrfToken
はCSRF攻撃を防ぐ重要なミドルウェアであり、
セキュリティ面で大きな役割を果たしています。
プロジェクトの要件に応じて、カスタムミドルウェアを作成し、
さらに高度な処理を加えることもできます。