1. 位置づけと登録タイミング
| ルート定義ファイル | 自動読み込み場所(RouteServiceProvider) |
主な用途 |
|---|---|---|
routes/web.php |
boot() 内の routes() メソッド(web ミドルウェアグループを付与) |
セッションを伴うブラウザ向けページ、フォーム送信、Blade ビュー |
routes/api.php |
同上(api ミドルウェアグループを付与、URL 先頭に api/ プレフィックス) |
モバイル/SPA などが呼び出す JSON API、トークン認証前提のエンドポイント |
2. 付与される既定ミドルウェアの違い
| ミドルウェアグループ | 主なミドルウェア | 目的 |
|---|---|---|
| web | StartSession, ShareErrorsFromSession, VerifyCsrfToken, SubstituteBindings など |
セッション状態の保持、CSRF 保護、エラーのセッション共有 |
| api | Throttle:api(レート制限), SubstituteBindings, (Laravel 11 以降は) EnsureFrontendRequestsAreStateful(Sanctum 使用時) |
ステートレス運用、DoS 対策、API 認証トークン専用のハンドリング |
要点
web ルートは「状態あり」。ブラウザ Cookie を用いたログインセッションや CSRF トークンを前提にする。
api ルートは「状態なし」。基本は Cookie を送らず、CSRF チェックも無効。トークンやヘッダーに認証情報を載せる。
3. URL/名前付きルートのプレフィックス
-
api.phpは自動的に/apiで始まる。
例:Route::get('/users', ...)→ 実際のエンドポイント/api/users -
web.phpにはプレフィックスが付かない(必要なら開発者がRoute::prefix()で任意に付与)。
4. レート制限とセキュリティ
-
api ルートには
Throttle:apiがデフォルトで適用され、.envのAPI_RATE_LIMIT(Laravel 11)やRateLimiterクラスで制御可能。 -
web ルートはレート制限が無効(必要なら個別に
throttleミドルウェアを割り当てる)。 -
どちらのファイルでも追加のミドルウェアをチェーンできるが、意図せず CSRF やセッションを有効/無効にしないよう注意。
5. 認証ガードとの組み合わせ
| シナリオ | 推奨ガード | 説明 |
|---|---|---|
| ブラウザ UI(従来型) | web |
セッション/Cookie ベース認証 |
| Single-Page Application(SPA) + Cookie | sanctum(EnsureFrontendRequestsAreStateful) |
同一ドメイン SPA で CSRF を防ぎつつ API 利用 |
| モバイルアプリ/外部サービス | api(Passport、Sanctum Token) |
パーソナルアクセストークンや OAuth2 |
6. テスト戦略の差異
-
Feature テスト
-
web.php:actingAs($user)->get('/')などセッションを張ったブラウザインタラクションを模倣。 -
api.php:withHeaders(['Authorization'=>'Bearer …'])->json('GET', '/api/users')のようにステートレス呼び出し。
-
-
API リソースクラスは
api.phpルートで使うとシリアライズ済みの JSON が自動生成され、web.php側の Blade とは責務が分離される。
7. 実運用におけるベストプラクティス
-
用途ごとに責務を分離
-
画面表示やフォーム送信は
web.php。 -
データ提供(JSON/XML 等)は
api.php。
-
-
CSRF を二重にかけない
-
api.phpに CSRF ミドルウェアを追加するとモバイルアプリからの呼び出しが失敗しやすい。
-
-
バージョニング戦略
-
API は長寿命を想定し
Route::prefix('v1')->group(function () { … });のようにapi.php側でバージョンを切る。 -
web.php側は UI の変更に合わせて都度ルートが変わってもよい。
-
-
ドメイン境界の明確化
-
多言語サイトやサブドメイン切替えは
web.phpにRoute::domain()。 -
API 用に
api.example.comを用意する場合はRouteServiceProviderでmapApiRoutes()を拡張し、api.phpを該当ドメインにバインド。
-
8. まとめ
-
web.phpはセッション/CSRF を前提とした「人間のブラウザ」向けルート。 -
api.phpはステートレスでレート制限付き「機械(アプリ/他サービス)」向けルート。 -
ミドルウェア、URL プレフィックス、認証方式が初期設定で分かれており、責務とセキュリティモデルの混線を防ぐことが最大の目的。
この切り分けを踏まえ、開発初期に「どのルートファイルに何を置くか」を合意しておくと、後々の保守性とセキュリティが大幅に向上します。
ChatGPT4o 生成日:2025/06/23