LaravelでWebアプリケーションやAPIを開発する際、避けて通れないのが「認証(ユーザー登録・ログイン・パスワード管理・API保護)」の実装です。
Laravelには非常に充実した認証エコシステムが用意されていますが、公式ドキュメントを開くと Laravel Breeze、Laravel Sanctum、Laravel Jetstream、Laravel Fortify、Laravel Passport と多数のツールやパッケージが登場するため、以下のような疑問や混乱を抱く方が少なくありません。
- 「BreezeとSanctumって何が違うの?どちらか一方を選ぶべき?」
- 「JetstreamとBreezeはどう使い分ければいい?」
- 「SPA(React/Vue/Next.js)やモバイルアプリの認証にはどれが最適?」
- 「自分のプロジェクトでは結局どれをインストールすればいいの?」
結論から言うと、これらは単純な二者択一ではなく、「フロントエンドUIを含むスターターキット」「ヘッドレスな認証バックエンド」「API・SPA専用の認証エンジン」「OAuth2サーバー」といった役割(レイヤー)の違いがあります。
この記事では、Laravelにおける主要な認証ツールの全体像と違い、BreezeとSanctumの本質的な関係、プロジェクト構成に応じたおすすめ選定フローチャート、具体的な導入手順と実装コード、現場でハマりがちなトラブル対処法まで、わかりやすく徹底解説します。
【早見表】Laravel認証ツールの全種類一覧・特徴比較
まずは、Laravelで利用できる主要な認証関連ツール・パッケージの役割と特徴を一覧表で比較します。
| ツール名 | 種別・役割 | フロントエンドUI | SPA / API認証 | 主な機能・特徴 | おすすめのプロジェクト |
|---|---|---|---|---|---|
| Laravel Breeze | 公式スターターキット (UI+コントローラー) |
Blade / Livewire Vue / React (Inertia) APIモード |
○(APIモードやInertiaでSanctum連携) | ログイン、ユーザー登録、パスワードリセット、メール認証、プロフィール編集。シンプルで極めてカスタマイズしやすい。 | ・標準的なWebサービス ・Inertia(Vue/React)モノリス ・Next.js等のバックエンドAPI |
| Laravel Sanctum | 認証パッケージ (認証エンジン・API) |
なし(バックエンドのみ) | ◎(SPA Cookie認証&APIトークン) | SPA向けのCookie/CSRF認証、モバイルや外部API用のPersonal Access Token(Bearerトークン)発行・管理。 | ・SPA(Vue/React/Next.js) ・モバイルアプリ用API ・外部連携用トークン発行 |
| Laravel Jetstream | 高機能スターターキット (UI+コントローラー) |
Livewire Vue (Inertia) |
◎(Sanctum内蔵) | Breezeの全機能に加え、二要素認証(2FA)、プロフィール写真、ブラウザセッション管理、チーム機能(招待・権限)。 | ・中〜大規模SaaS ・最初から2FAやチーム管理が必要なWebアプリ |
| Laravel Fortify | ヘッドレス認証バックエンド (UIなし) |
なし(フロントエンド完全自由) | ○(セッションベース認証) | 画面を持たず、認証処理(ログイン、登録、2FA、パスワード更新等)のエンドポイントとロジックのみを提供。 | ・完全独自デザインのUI ・Jetstreamを使わずに2FA等のバックエンド処理だけ使いたい場合 |
| Laravel Passport | OAuth2サーバー パッケージ |
なし(バックエンドのみ) | ◎(完全なOAuth2対応) | OAuth2仕様(認可コードグラント、クライアント認証、リフレッシュトークン等)に完全準拠したAPI認証。 | ・自社サービスをサードパーティ製アプリにAPI連携・OAuth認可させたい大規模PF |
BreezeとSanctumの違いとは?(二者択一ではない関係性)
Laravelの認証を学び始めた方が最も混乱しやすいのが、「BreezeとSanctumのどちらを使えばいいのか?」という比較です。
結論から言うと、BreezeとSanctumは競合するライバル関係ではなく、担当するレイヤー(役割)が全く異なります。
- Laravel Breeze = アプリケーションの「画面(UI)・ルーティング・コントローラー」を提供するスターターキット(テンプレート)
- Laravel Sanctum = SPAのステートフル認証やAPIトークン発行を行う認証エンジン(機能パッケージ)
1. Laravel Breezeの役割:認証の「足場(UI・コントローラー)」
Laravel Breezeは、ユーザーがブラウザで操作する「ログイン画面」「新規登録画面」「パスワードリセット画面」「プロフィール編集画面」といったフロントエンドのViewと、それらを処理するコントローラー・ルーティングを一括生成してくれるツールです。
Breezeをインストールすると、プロジェクト内に認証関連のPHPファイルやBlade/Vue/Reactファイルがそのまま展開されるため、コードを自由に修正・カスタマイズできます。
2. Laravel Sanctumの役割:APIやSPAの「認証エンジン」
Laravel Sanctumは、画面(UI)を一切提供しません。その代わり、「SPA(Single Page Application)から送信されるAPIリクエストを安全にセッション認証する仕組み」や、「モバイルアプリやCLIツール向けにAPIトークン(Bearer Token)を発行・検証する仕組み」を提供します。
詳細な仕組みやトークン発行手順は、Laravel Sanctumの使い方完全ガイドで詳しく解説しています。
3. BreezeとSanctumは「組み合わせて使う」のが標準パターン
「BreezeかSanctumか」で悩む必要はありません。実際の開発では、以下のように両者を連携させて使用するケースが非常に多いです。
- Next.js + Laravel API構成の場合:Laravel側で
Breeze (APIモード)を導入すると、裏側の認証エンジンとしてSanctumが自動的にセットアップされ、Next.jsフロントエンドとCookieベースの安全なSPA認証がすぐに行えます。 - Inertia.js構成の場合:BreezeでReactやVueのInertiaスタックを導入し、モバイルアプリ用APIも追加したくなった段階でSanctumのAPIトークン機能を追加で利用します。
Laravelの主要認証ツール・パッケージを徹底解説
ここからは、Laravelの代表的な4大認証ツール(Breeze / Sanctum / Jetstream / Fortify)と、関連するPassportについて詳しく見ていきましょう。
1. Laravel Breeze(初心者〜標準的Webアプリの決定版)
Laravel Breezeは、Laravel公式が提供する最もシンプルで軽量な認証スターターキットです。
- 特徴:
- 最小限かつクリーンなLaravel認証機能(ログイン、会員登録、パスワードリセット、メール確認、パスワード確認、プロフィール更新)を提供。
- Tailwind CSSで美しくスタイリングされたUI。
- コードがすべてプロジェクト配下の
app/Http/Controllers/Auth/やresources/views/に展開されるため、内部処理を完全に把握・カスタマイズ可能。
- 選択可能なフロントエンドスタック:
- Blade with Alpine.js(従来のMPA開発に最適)
- Livewire with Alpine.js(PHPだけでリアクティブなUIを構築したい場合)
- Inertia.js with Vue.js(VueでSPAのようなモダン開発を行いたい場合)
- Inertia.js with React(Reactでモダン開発を行いたい場合)
- API only(Next.jsなどの外部フロントエンドと連携する場合)
- メリット:余計な機能が入っておらずコードの見通しが良いため、初心者の学習用としても、実務のカスタム開発用としても最も扱いやすい。
2. Laravel Sanctum(SPA・モバイルアプリ・API認証の標準)
Laravel Sanctumは、Web APIおよびSPA(Single Page Application)のための軽量な認証システムです。
- 2大機能:
- SPA認証(Cookieベース・ステートフル認証):フロントエンド(Vue/React/Next.js等)とLaravelバックエンドが同一トップレベルドメインにある場合、通常のWebセッションCookieとCSRFトークンを活用して、安全かつ透過的にAPIを保護。
- APIトークン認証(Personal Access Tokens):モバイルアプリ、CLIツール、外部サードパーティ連携向けに、暗号化ハッシュ化された長寿命のBearerトークンを発行。トークンごとに実行可能な操作(Abilities/パーミッション)を制限可能。
- メリット:OAuth2の複雑な仕組み(Passport)を導入することなく、数ステップで安全なAPI認証基盤が完成する。
3. Laravel Jetstream(多機能・SaaS向けスターターキット)
Laravel Jetstreamは、Breezeを大幅に拡張し、商用SaaSやエンタープライズ向けに必要な高度な機能を最初からすべて盛り込んだ高機能スターターキットです。
- 主な標準機能:
- Breezeの全認証機能
- 二要素認証(2FA / TOTP):QRコードスキャンによるワンタイムパスワード対応
- プロフィール写真のアップロード
- ブラウザセッション管理:他端末のログインセッション一覧表示&ワンクリック強制ログアウト
- APIトークン管理画面:ユーザー自身がAPIトークンを発行・権限設定できる画面(Sanctumベース)
- チーム機能(オプション):チーム作成、メンバー招待、ロール(役割)・パーミッション割り当て
- 注意点:スタックが「Livewire」または「Vue + Inertia」の2択に限定され、多機能ゆえにコード量が多く、不要な機能を削るのに知識が必要。
- 詳しい実装例は、Laravel Jetstreamの導入・活用ガイドで解説しています。
4. Laravel Fortify(UIを持たないヘッドレスバックエンド)
Laravel Fortifyは、フロントエンドのビュー(画面)を一切持たず、認証に関するルーティング・コントローラーロジックのみを提供するヘッドレス認証パッケージです(実はJetstreamのバックエンドエンジンとしても使われています)。
- 特徴:
- ログイン、会員登録、パスワードリセット、メール認証、二要素認証、パスワード確認などのバックエンドエンドポイントを自動定義。
- 開発者は「どのBladeテンプレートを表示するか」をコールバック関数で指定するだけ。
- メリット:デザインシステムが既に決まっており、独自のHTML/CSS/JSをそのまま使いつつ、認証のセキュリティロジックだけLaravelに任せたい場合に最適。
- 詳細は、Laravel Fortifyの完全ガイドをご覧ください。
5. 【参考】Laravel Passportとの違い(OAuth2サーバーが必要な場合)
API認証の文脈でSanctumとしばしば比較されるのがLaravel Passportです。
- Sanctum:自社製のWeb SPAやモバイルアプリなど、「自社管理下のクライアント」との通信に最適化された軽量パッケージ。
- Passport:TwitterやGitHubのように、「第三者(サードパーティ)の開発者が作った外部アプリ」に対してOAuth2認可(アクセストークンの発行・認可コードグラント・リフレッシュトークン等)を提供したい場合に必要な本格派パッケージ。
自社サービス単体のSPAやアプリを作るだけであれば、Passportは過剰(オーバーキル)であり、Sanctumを選ぶのが現在のベストプラクティスです。OAuth2サーバー構築の詳細は、Laravel Passportを使ったOAuth2認証入門で確認できます。
【選定フローチャート】どれを使うべき?おすすめの選択基準
プロジェクトの要件や構成に応じたおすすめの選択基準をまとめました。
🎯 プロジェクト別・おすすめ選定フロー
- 一般的なWebサイト・Webアプリを素早く作りたい(Blade / Livewire)
👉 【結論】Laravel Breeze (Blade / Livewire)
迷ったらこれ。シンプルで無駄がなく、後からのカスタマイズも容易です。 - Vue.js や React を使って、SPAのような快適な操作性のWebアプリを作りたい
👉 【結論】Laravel Breeze (Inertia React / Vue)
Inertia.jsを使えば、APIエンドポイントを個別に作ることなくモノリス構成でReact/Vueが動かせます。 - フロントエンド(Next.js / Nuxt / モバイルアプリ)とLaravel APIを完全分離したい
👉 【結論】Laravel Breeze (APIモード) + Laravel Sanctum
Next.js向けのリポジトリテンプレートも用意されており、最もスムーズに分離アーキテクチャを構築できます。 - SaaSを開発予定で、二要素認証(2FA)やチーム機能・権限管理があらかじめ必須
👉 【結論】Laravel Jetstream
自作すると工数がかかる2FAやチーム招待・ロール管理が最初から完備されています。 - デザイナー作成の完全独自UIがあり、Laravelの認証ロジックだけをバックエンドで活用したい
👉 【結論】Laravel Fortify
HTML/CSSの制約を受けずに、安全な認証バックエンドを構築できます。 - 自社APIを外部の第三者開発者に公開し、OAuth2認証を行わせたい
👉 【結論】Laravel Passport
RFC 6749に準拠したOAuth2サーバーを構築できます。
実践:Laravel Breezeの導入手順とスタックの選択
ここからは、最も利用頻度の高い Laravel Breeze のインストール手順と、各スタックの導入コマンドを解説します。
1. Breezeのインストール手順
Laravelプロジェクトを作成後、ComposerでBreezeを開発依存パッケージとして追加します。
# Breezeパッケージのインストール
composer require laravel/breeze --dev
続いて、Artisanコマンドを実行して使用したいフロントエンドスタックを選択・インストールします。
# インタラクティブに対話形式でスタックを選択してインストール
php artisan breeze:install
# または引数を指定して直接インストール
# ① Bladeスタック(ダークモード・Pestテスト有効化の例)
php artisan breeze:install blade --dark --pest
# ② Livewireスタック
php artisan breeze:install livewire --pest
# ③ React + Inertiaスタック
php artisan breeze:install react --typescript --pest
# ④ Vue + Inertiaスタック
php artisan breeze:install vue --typescript --pest
# ⑤ API専用モード(Next.jsなどのフロント分離用)
php artisan breeze:install api
インストールが完了したら、マイグレーションを実行し、アセットをビルドします。
# データベースマイグレーション
php artisan migrate
# フロントエンドアセットのビルド(APIモード以外)
npm install
npm run dev
2. Breezeによって生成される主要ファイル
Breezeをインストールすると、プロジェクト内に以下のファイルが生成されます。
routes/auth.php:ログイン、ログアウト、パスワード再設定などの認証専用ルート定義app/Http/Controllers/Auth/:AuthenticatedSessionController.php(ログイン・ログアウト処理)RegisteredUserController.php(会員登録処理)PasswordResetLinkController.php(パスワードリセットメール送信)NewPasswordController.php(新しいパスワードの設定)VerifyEmailController.php(メールアドレス認証)
resources/views/auth/(Bladeの場合):各認証画面のBladeテンプレート
ルーティングの全体像やグループ化の基本については、Laravel Routeの使い方まとめもあわせて参考にしてください。
3. ログイン後のリダイレクト先カスタマイズ
Breezeでログインに成功した後のリダイレクト先は、デフォルトで /dashboard に設定されています。これを変更したい場合は、コントローラー内の redirect()->intended(...) の引数を修正します。
// app/Http/Controllers/Auth/AuthenticatedSessionController.php
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
// ログイン後のリダイレクト先を /home や /admin に変更
return redirect()->intended(route('home', absolute: false));
}
実践:Laravel Sanctumの導入と2つの認証モード
続いて、SPAやAPI構築に不可欠な Laravel Sanctum の導入と実装パターンを解説します(Laravel 11以降ではデフォルトで組み込まれている場合もあります)。
1. Sanctumのインストールと設定
# Sanctumのインストール(未導入の場合)
composer require laravel/sanctum
# 設定ファイルとマイグレーションの公開
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
# マイグレーションの実行(personal_access_tokensテーブルが作成される)
php artisan migrate
APIトークン機能を使用するため、User モデルに HasApiTokens トレイトを追加します。
// app/Models/User.php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens; // 追加
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
protected $fillable = [
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
}
2. パターンA:SPA認証(Cookieベース・CSRF保護)
Vue.jsやReactなどのSPAとLaravelを連携させる場合、トークンをローカルストレージに保存するのではなく、CookieベースのSPA認証を使うのが最も安全です。
① .env の設定
# SPAが動いているドメインとポートを指定(カンマ区切りで複数指定可)
SANCTUM_STATEFUL_DOMAINS=localhost:3000,127.0.0.1:3000
SESSION_DOMAIN=localhost
② SPAフロントエンドからの認証リクエストの流れ
- CSRFクッキーの取得:SPAの初期化時またはログイン直前に
GET /sanctum/csrf-cookieを叩き、CSRFトークンクッキーを取得。 - ログインリクエスト:
POST /loginにメールアドレスとパスワードを送信。認証が成功するとセッションCookieがブラウザにセットされる。 - 認証済みAPI呼び出し:以降のリクエストはブラウザが自動的にCookieを送信するため、
auth:sanctumミドルウェアで保護されたAPIにアクセス可能。
詳細なAPI設計やルーティング構成については、Laravel API作成完全ガイドも参考にしてください。
3. パターンB:APIトークン発行(モバイル・外部連携用)
モバイルアプリや外部システム向けには、Bearerトークンを発行するコントローラーを作成します。
// app/Http/Controllers/Api/AuthController.php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
class AuthController extends Controller
{
// APIトークン発行(ログイン)
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
'device_name' => 'required|string',
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['認証情報が正しくありません。'],
]);
}
// トークンを発行(権限Abilitiesの指定も可能)
$token = $user->createToken($request->device_name, ['post:create', 'post:read'])->plainTextToken;
return response()->json([
'token' => $token,
'user' => $user,
]);
}
// トークン失効(ログアウト)
public function logout(Request $request)
{
// 現在のリクエストで使用されたトークンを削除
$request->user()->currentAccessToken()->delete();
return response()->json(['message' => 'ログアウトしました']);
}
}
※Sanctumを使ったCookieベースのSPA認証やモバイル向けBearerトークン発行の詳しい構築手順は、Laravel Sanctum完全攻略|SPA認証(Cookie)とAPIトークン認証(Bearer)の実装手順で完全解説しています。
ルーティング側では、auth:sanctum ミドルウェアを使ってエンドポイントを保護します。
// routes/api.php
use App\Http\Controllers\Api\AuthController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
// 公開ルート
Route::post('/login', [AuthController::class, 'login']);
// 認証必須ルート
Route::middleware('auth:sanctum')->group(function () {
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::post('/logout', [AuthController::class, 'logout']);
});
Laravel認証でよくある落とし穴とトラブルシューティング
Laravelの認証を導入する際、開発現場で頻繁に発生するトラブルとその原因・解決策をまとめました。
1. SPA認証で「419 CSRF token mismatch」が発生する
SanctumのSPA認証を導入した際、最も多く遭遇するのが 419 Page Expired (CSRF token mismatch) エラーです。
- 原因①:ドメイン・ポートの不一致
フロントエンドがhttp://localhost:3000で動いている場合、.envのSANCTUM_STATEFUL_DOMAINSにポート番号(localhost:3000)まで正確に記載されているか確認してください。 - 原因②:Cookieの送信設定(CORS)
フロントエンドのAxiosなどのHTTPクライアントでwithCredentials: true(またはcredentials: 'include')が設定されていないと、Cookieがバックエンドに送信されずCSRF検証に失敗します。 - 原因③:
config/cors.phpの設定漏れ
config/cors.phpのsupports_credentialsをtrueに設定する必要があります。
419エラーのより詳しい原因究明と対策手順は、Laravel「419 Page Expired」エラーの原因と完全解決策で徹底解説しています。
2. 「認証(Authentication)」と「認可(Authorization)」の混同
BreezeやSanctumを導入すると「ユーザーが誰であるか(認証)」は解決しますが、「そのユーザーが特定の記事を編集・削除できるか(認可・権限管理)」は別の仕組みで制御する必要があります。
- 認証(Authentication):ログインして本人であることを証明する(Breeze / Sanctum / Jetstream が担当)
- 認可(Authorization):ログイン中ユーザーの権限(管理者か、投稿の所有者か等)を判定する(Gate / Policy が担当)
役割・権限に応じたアクセス制御を実装したい場合は、Laravel Gateの使い方ガイドや、Laravel Policyの使い方完全ガイドを組み合わせて活用しましょう。
3. Laravel 11 / 12 でのミドルウェア設定の変更点
Laravel 11以降では app/Http/Kernel.php が廃止され、ミドルウェアの設定はすべて bootstrap/app.php に集約されています。
SanctumのSPAステートフルミドルウェアを有効化する場合は、以下のように記述します。
// bootstrap/app.php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
// SanctumのSPAステートフル認証ミドルウェアを有効化
$middleware->statefulApi();
})
->withExceptions(function ($exceptions) {
//
})->create();
まとめ:プロジェクトに最適なLaravel認証を選ぼう
Laravelの認証エコシステムは、開発規模やフロントエンド構成に合わせて柔軟に選択できるよう設計されています。
- Breeze vs Sanctum:競合ではなく「UIスターターキット(Breeze)」と「API/SPA認証エンジン(Sanctum)」のレイヤーの違い。併用も標準的。
- 迷ったらまず Breeze:シンプル、学習コストが低く、Blade/Livewire/Vue/React/APIの全スタックに対応。
- SaaS・2FA・チーム機能なら Jetstream:最初から多機能な認証基盤が必要な場合に大きな時間短縮に。
- 独自UIなら Fortify:デザイン自由度を保ちながらセキュアなバックエンド認証を導入可能。
- 外部連携OAuth2なら Passport:自社APIを第三者に公開する場合のみ導入を検討。
それぞれのツールの特徴と違いを正しく理解し、プロジェクトの要件に最もマッチした認証方式を選択して、堅牢で使いやすいWebアプリケーションを構築していきましょう!

コメント