LaravelのCSRF保護の除外設定

Laravelのバージョンは9です。

CSRFトークンの有効期限切れ

POSTメソッドで検索パラメータを渡す画面があり、CSRF保護の影響で長時間放置すると419 PAGE EXPIREDエラーになってしまうので対策。

expire_on_closeをtrueにしてSESSION_LIFETIMEを大きい値にするという手もありますが、今回はSESSION_LIFETIMEを変えずにCSRF保護を部分的に除外する方法をとったときの設定です。

公式ドキュメントの日本語訳であるCSRF保護を参考にしました。

ミドルウェアの設定

app/Http/Kernel.phpで\App\Http\Middleware\VerificationCsrfTokenの設定がされています。

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

これを削除する手もありますが、すべてのCSRF保護がなくなってしまうためここの設定は変更しません。

特定のURIを除外する

app/Http/Middleware/VerifyCsrfToken.phpで除外設定できます。

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}

$exceptに除外するURIを設定すればOKです。