Laravel BreezeとJetstreamの違いを整理する:認証スキャフォールドの選び方
概要
Laravel で新規プロジェクトを立ち上げるとき、認証まわりをどう用意するかは最初に決めるべき設計事項のひとつです。かつてはここで Breeze と Jetstream のどちらを使うかを迷うのが定番でした。
ただし Laravel 12(2025年3月)以降、この前提は変わりました。現在、新規 Laravel プロジェクトで認証を用意する 第一の選択肢は公式スターターキット(React / Vue / Livewire) です。これに伴い、Breeze と Jetstream は新機能の更新を終了し、新規プロジェクトの推奨出発点ではなくなっています(既存アプリでは引き続き動作し、保守も継続されます)。
この記事では、まず現在の第一選択である公式スターターキットの位置づけを押さえたうえで、レガシー構成として、あるいは公式スターターキットが要件に合わない場合の選択肢として Breeze と Jetstream の違いを整理します。両者の比較内容そのもの(生成されるもの・前提スタック・拡張のしやすさ)は今も正確なので、判断軸として引き続き使えます。
なお、バージョンによって対応スタックや前提要件は変わります。実際の採否を決める際は、各パッケージの公式ドキュメントで最新情報を必ず確認してください。
現在の第一選択:公式スターターキット
Laravel 12 で、公式の アプリケーションスターターキット が導入されました。新規プロジェクトで認証一式を用意するなら、まずこれを検討するのが現在の標準です。
- React / Vue — Inertia 2 + TypeScript + Tailwind 4 + shadcn/ui(React は React 19、Vue は Composition API + shadcn-vue)
- Livewire — Tailwind ベースの Flux UI コンポーネントライブラリ + Laravel Volt
いずれも、認証一式・プロフィール管理・ダークモード・レイアウトなどを備え、バックエンド/フロントエンドのコードがすべてアプリ側に展開される(フルカスタマイズ可能)設計です。
さらに、各スターターキットには WorkOS AuthKit 版 が用意されています。こちらを選ぶと、ソーシャルログイン(Google / Microsoft / GitHub / Apple)、パスキー認証、メールベースの「Magic Auth」、SSO といった機能が利用できます。
導入は、現行の Laravel インストーラでプロジェクトを作成する際にスターターキットを選択する形が基本です。
laravel new my-app # 対話的に React / Vue / Livewire(および WorkOS AuthKit 版の有無)を選択
Breeze / Jetstream の現在の位置づけ
公式スターターキットの導入に伴い、Breeze と Jetstream は新機能の更新を終了しました。公式が新規プロジェクトに推奨するのは、上記のスターターキットです。
ただし、これは「使えなくなった」という意味ではありません。両パッケージは引き続き動作し、既存アプリで利用していても問題ありません。以下のようなケースでは、今でも選択肢になり得ます。
- 既存プロジェクトで Breeze / Jetstream を使い続けている、あるいは踏襲したい
- 公式スターターキットの前提スタック(Inertia / Flux UI など)が要件に合わない
- Jetstream が提供する 2FA・チーム機能といった「出来合いのアプリ機能」にそのまま乗りたい
以降は、この文脈で両者の違いを整理します。
前提:そもそも「認証スキャフォールド」とは何か
Laravel 本体には認証の 土台 が入っています。Auth ファサード、Authenticatable コントラクト、セッションガード、ハッシュ化などです。しかし「ログイン画面」「登録フォーム」「パスワードリセットのフロー」といった 画面とルートの実体 は本体には含まれません。
この「土台の上に乗せる、すぐ動く認証一式」を自動生成してくれるのが、公式スターターキットであり、Breeze や Jetstream です。いずれも内部的には既存の Auth 機能や laravel/fortify(Jetstream の場合)を使っており、ゼロから認証を再発明しているわけではありません。
なお、認証の構成要素として Fortify(ヘッドレスな認証バックエンド)と Sanctum(API トークン)は現行でも継続提供されています。スターターキットを使うか Breeze/Jetstream を使うかにかかわらず、これらは認証の下回りとして変わらず利用できます。
Breeze:薄くて読める最小構成
何が生成されるか
Breeze は「最小限で、全部自分のコードになる」のが特徴です。インストールすると以下が生成されます。
- ログイン / 登録 / パスワードリセット / パスワード確認 / メール認証のルートとコントローラ
- それらに対応するビュー
- プロフィール編集画面(名前・メール・パスワード変更、アカウント削除)
重要なのは、生成されたコントローラやルートが すべてアプリ側のコードとして吐き出される 点です。app/Http/Controllers/Auth/ に実ファイルが置かれ、ベンダー内に隠れません。挙動を変えたければそのファイルを直接編集します。
選べるフロントエンドスタック
composer require laravel/breeze --dev php artisan breeze:install
対話的に以下のようなスタックを選択します。
- Blade + Alpine.js — サーバサイドレンダリング中心のシンプル構成
- Livewire — Blade のまま動的な UI を書きたい場合
- React (Inertia) — SPA 風だがルーティングは Laravel 側
- Vue (Inertia) — 同上、Vue 版
- API — 画面を持たず、SPA / モバイル向けに認証エンドポイントだけ用意
この「スタックを選べる」点が後述の判断に効いてきます。
生成後のイメージ
// app/Http/Controllers/Auth/AuthenticatedSessionController.php
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
return redirect()->intended(route('dashboard', absolute: false));
}
LoginRequest のバリデーションもアプリ側に生成されるので、ログイン条件を変えたいときは FormRequest を直接いじれます。「何が起きているか追える」のが Breeze の最大の価値です。
Jetstream:機能盛り込み型のアプリ基盤
何が生成されるか
Jetstream は Breeze より大きく踏み込みます。ログイン一式に加えて、以下のような アプリケーション機能 が最初から入ります。
- プロフィール管理
- 二要素認証(2FA)
- ブラウザセッション管理(他端末のログアウト)
- APIトークン管理(Laravel Sanctum ベース)
- チーム機能(インストール時にオプションで有効化)
これらは laravel/fortify(バックエンドの認証ロジック)と組み合わさって動きます。Fortify が「ヘッドレスな認証バックエンド」を担い、Jetstream が「画面と機能」を担う分担です。
選べるのは2スタック
composer require laravel/jetstream php artisan jetstream:install livewire # または php artisan jetstream:install inertia
- Livewire + Blade
- Inertia + Vue
Breeze のように React や「APIのみ」を選ぶ自由度はありません。
コードの所有権が違う
Jetstream で重要なのは、ロジックの多くがベンダーパッケージ内に留まる 点です。Breeze が「自分のコードを吐き出す」のに対し、Jetstream は「設定とアクションクラスで振る舞いを差し替える」設計です。
// app/Actions/Fortify/CreateNewUser.php
public function create(array $input): User
{
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => $this->passwordRules(),
])->validate();
return User::create([
'name' => $input['name'],
'email' => $input['email'],
'password' => Hash::make($input['password']),
]);
}
ビューは vendor:publish で公開して編集できますが、2FA やチーム機能のコアロジックは基本的にパッケージに委ねることになります。
比較表(レガシー構成としての Breeze と Jetstream)
公式スターターキットが要件に合わない場合に、両者を比較する際の判断材料です。
| 観点 | Breeze | Jetstream |
|---|---|---|
| 思想 | 最小・全部自分のコード | 多機能・フレームワークに乗る |
| フロント選択肢 | Blade / Livewire / React / Vue / API | Livewire / Inertia(Vue) |
| 2FA | なし(自前) | あり |
| セッション管理UI | なし | あり |
| APIトークン管理 | なし(API モードは別物) | あり(Sanctum) |
| チーム機能 | なし | あり(オプション) |
| コードの所有 | アプリ側に生成 | ベンダー+アクションクラス |
| 学習コスト | 低い | やや高い |
| カスタマイズ自由度 | 高い(直接編集) | 機能内なら容易/外れると重い |
| 更新状況 | 新機能更新は終了(保守は継続) | 新機能更新は終了(保守は継続) |
選び方の判断軸
前提として、新規プロジェクトではまず公式スターターキット(React / Vue / Livewire)を検討してください。 以下は、スターターキットが要件に合わない場合や、既存プロジェクトの踏襲として Breeze / Jetstream を選ぶときの判断軸です。
Breeze を選ぶべきケース
- 認証の挙動を自分で握りたい とき。独自のログイン条件やユーザーモデル設計がある場合、生成コードを直接編集できる Breeze が素直です。
- フロントスタックが Breeze の選択肢に合っている とき。特に「APIのみ」でモバイル/SPA のバックエンドにしたい場合などに向きます。
- 小〜中規模で、2FA やチームが要件に無い とき。後から必要になった機能だけ足す方が、使わない機能を抱えるより軽くなります。
- 学習・検証目的で「認証が内部でどう動くか読みたい」とき。
Jetstream を選ぶべきケース
- 2FA・セッション管理・APIトークン管理が最初から要件にある とき。自前実装は地味に工数がかかるため、出来合いの実装に乗れるメリットが大きいです。
- チーム(組織)単位の権限が要件にある とき。チーム機能は後付けが大変なので、最初から入れておく価値があります。
- フロントが Livewire か Inertia(Vue) で確定していて、提供される UI の範囲で足りるとき。
迷ったときの原則
新規なら、まず公式スターターキットで要件を満たせないか確認します。そのうえで、要件が Jetstream の提供機能とほぼ一致するなら Jetstream、認証やスタックの自由度が欲しいなら Breeze、という順で検討すると整理しやすいです。Jetstream は便利ですが、提供機能の外へ踏み出すカスタマイズが増えると、かえってパッケージ構造と戦うことになります。逆に Breeze は、必要機能を自分で積み上げる手間と引き換えに、全体の見通しを自分の手に残せます。
確認方法
採否を決める前に、空のプロジェクトで実際にインストールして生成物を見比べるのが確実です。新規なら、まず公式スターターキットを試すところから始めます。
# 公式スターターキットを試す(現行の第一選択) laravel new starterkit-demo # 対話的に React / Vue / Livewire(WorkOS AuthKit 版の有無)を選択 cd starterkit-demo php artisan migrate # Breeze を試す(レガシー構成) laravel new breeze-demo cd breeze-demo composer require laravel/breeze --dev php artisan breeze:install blade php artisan migrate # Jetstream を試す(別プロジェクトで) laravel new jetstream-demo cd jetstream-demo composer require laravel/jetstream php artisan jetstream:install livewire php artisan migrate
生成された app/Http/Controllers/(Breeze)と app/Actions/Fortify/(Jetstream)を開き、「自分がいじりたい部分がどこに置かれるか」を目で確認すると、判断がはっきりします。
注意点
- 新規プロジェクトでは、まず公式スターターキットで要件を満たせるかを確認してください。Breeze / Jetstream は新機能の更新を終了しているため、新規採用は「レガシー構成として意図的に選ぶ」位置づけになります(既存アプリの利用・保守は継続されます)。
- バージョンによって対応スタックや前提(Node のバージョン、Pest/PHPUnit の扱いなど)が変わります。導入時は各公式ドキュメントで最新情報を確認してください。
- 「後から Breeze → Jetstream へ乗り換え」は不可能ではありませんが、生成物の思想が違うため実質は作り直しに近くなります。最初の選択を重めに考える価値があります。
- Jetstream のチーム機能は、途中有効化より初期有効化のほうが安全です。
まとめ
- 新規 Laravel プロジェクトの認証スキャフォールドは、まず公式スターターキット(React / Vue / Livewire)が第一選択 です。各キットには WorkOS AuthKit 版もあります。
- Breeze と Jetstream は 新機能更新を終了し、新規の推奨出発点ではなくなりました(ただし動作・保守は継続。既存アプリは問題なし)。レガシー構成として、またはスターターキットが合わない場合の選択肢です。
- 両者の違いは今も有効で、Breeze は 薄く、全部自分のコード、スタック自由、Jetstream は 多機能、フレームワークに乗る、スタック限定。選択の鍵は「要件が Jetstream の提供機能と一致するか」と「フロントスタックの自由度をどこまで求めるか」。
- 迷ったら空プロジェクトで実際に生成し、"自分がいじる場所" がどこに吐き出されるかを目で確かめるのが最短です。
