0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelでlogin / logoutをweb.phpへ書く理由を整理する

0
Last updated at Posted at 2025-07-16

1.はじめに

Laravelでログインやログアウトのルーティングを 「api.php に書いても動くけど、それでいいの?」 と悩んだことはありませんか?

この記事では、login / logout はなぜ web.php に書くのが原則なのか を整理して解説します。

Laravel × React でポートフォリオを開発する中でこの点に迷ったので、同じように悩む方の参考になればと思い、まとめました。

急いでいる人のために

先に結論

✅ これだけは覚えて
• Cookieセッション使うなら → web.php
• トークン認証なら → api.php

2.web.phpとapi.phpの違い

✔️ web.php

webミドルウェアグループ

・セッション管理

・CSRF保護

・クッキー暗号化

フォーム認証やセッション管理が必要な処理は、web.php に書くのが原則です。

✔️ api.php

apiミドルウェアグループ

・ステートレス

・セッションを使わない

・CSRF保護なし

トークン認証などの API ルートは基本的に api.php に書きます。

3.login / logoutがweb.php推奨の理由

1️⃣ セッションを使うから
・Laravelのデフォルト認証(Cookieセッションベース)はログイン状態をサーバー側で管理します。

・ログイン後にセッションIDがCookieとしてクライアントに送信されます。

・ログアウトはセッションを破棄する処理です。

👉 このセッション機能は web ミドルウェアで提供されているため、web.php に書く必要があります。

2️⃣ CSRF保護が必要だから
・フォームPOSTにはCSRFトークンが必要です。

・Laravelの webミドルウェアはCSRFを自動で検証してくれます。

👉 一方、api.php ではCSRF保護が無効なため、フォーム送信では危険です。

4.逆にapi.phpに書くパターン

・モバイルアプリや SPA でトークン認証(例:JWT、SanctumのAPIトークン)を使う場合

・サーバー側でセッションを持たず、ステートレスで運用したいとき

✅ このような場合は api.php へのルーティングが適しています。

5.まとめ

・フォームログイン・セッション管理あり → web.php

・トークンベース・ステートレスAPI → api.php

✅ Cookieセッション認証 → web.php
✅ トークン認証 → api.php

6.個人的運用

私も現在、Laravel Sanctumを使ってポートフォリオ開発を行っていますが、ログインやログアウトのルートは web.php に記述しています。

Sanctumはトークン認証にも対応していますが、SPA向けのCookieセッション認証モードでは、セッション管理やCSRF保護が必要です。

そのため、私のプロジェクトでは web.php を使用する方針としています。

7.終わりに

以上、Laravelのルーティング設計で迷いがちな「web.php と api.php の使い分け」。

login / logoutは、Cookieセッションを活用してCSRF保護するためにweb.phpに書くのが原則です。

どなたかの参考になれば幸いです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?