Hono + Inertia + React の認証完全ガイド
Better Auth / Lucia / セッション設計の選び方と実装パターン【2026年版】
Hono + Inertia + React で認証を「ちゃんと」設計するための完全ガイド。Better Auth / Lucia / 自前セッションの選び方、CookieベースとJWTの選択、Inertia の auth プロパティ共有、ロール・認可、OAuth(Google / GitHub / LINE)、パスワードリセットまで実装パターンを整理します。
認証は「自前」と「ライブラリ」の二択ではない
認証の実装は、毎回プロジェクトでハマる領域です。2026年時点での実用的な選択肢は3つに整理できます。
- Better Auth: TypeScript製のフルスタック認証ライブラリ。OAuth・メール認証・MFA・組織機能などが揃う。Hono アダプタもある
- Lucia: 軽量・最小限の認証「フレームワーク」。セッション管理の薄いラッパーで、自由度が高い
- DIY セッション: 自分でクッキー+セッションテーブルを書く方式。学習用としても本番用としても、要件が小さいなら現実的
「全部自前」と「Auth0 などフルマネージド」の中間に、こうしたOSSの選択肢が成熟したのが2026年の特徴です。
選び方マトリクス
| 観点 | Better Auth | Lucia | DIY セッション | フルマネージド(Auth0 等) |
|---|---|---|---|---|
| 機能網羅 | 広い(OAuth/MFA/組織/招待) | セッション中心 | 必要分のみ | 広い |
| 設定の重さ | 中 | 軽 | 軽 | 軽(管理画面) |
| カスタマイズ性 | 高 | 高 | 完全 | 限定的 |
| ロックイン度 | 低(OSS) | 低(OSS) | ゼロ | 高 |
| 月額コスト | サーバ+DB | サーバ+DB | サーバ+DB | 利用量課金 |
| Hono との相性 | 公式アダプタ | 良 | 自然 | API経由で良 |
業務系・社内ツール・中小SaaSでは Better Auth か Lucia、簡素なものは DIY、エンタープライズ要件で SLA が必要なら Auth0 / Clerk などのフルマネージドを使う、という大枠で考えると整理しやすいです。
Cookie ベース vs JWT — 2026年の主流は?
結論: SPA であっても、HttpOnly Cookie + サーバ側セッションを第一選択にするのが2026年の主流です。理由:
- XSS 経由でトークンが盗まれにくい(HttpOnly 属性)
- サーバ側で即時失効できる(JWT は本来失効しづらい)
- Inertia は内部的に通常のリクエストと同じ Cookie を使うので、相性が良い
JWT は「サーバを完全にステートレスに保ちたい」「マルチサービス間でトークン共有したい」など特定要件で使うのが妥当です。
実装パターン: ログインフロー
Inertia の共有プロパティに認証情報を載せる
ログイン中ユーザー情報は、Inertia の共有プロパティで全ページに渡しておくのが定石です。
1. Hono ミドルウェアでクッキーを見てセッションを解決
2. ユーザー情報(id、name、email、role など最小限)を共有プロパティ auth.user に載せる
3. React 側のどのページでも usePage().props.auth.user で参照可能
これで「ナビゲーションに表示するユーザー名」「権限ガード」「分析イベントへのユーザーID付与」が全画面で統一できます。
認可(Authorization)— ロールとガード
ロール(admin / editor / viewer 等)は次の2層でガードします:
- サーバ側ガード: Hono のミドルウェアで c.req.path とユーザーの role を突き合わせ、権限不足なら 403 を返す。これが最終防衛線
- クライアント側ガード: React 側で auth.user.role に応じてメニュー表示・ボタン非表示を制御。これは UX のため
クライアント側だけのガードは「見えないけど叩ける」状態を残してしまうため、必ずサーバ側でも止めます。
OAuth(Google / GitHub / LINE)
Better Auth は OAuth プロバイダの設定がシンプルです。Google / GitHub / Microsoft などはほぼ設定だけで動きます。LINE ログインは日本特有の要件として頻出ですが、汎用 OAuth プロバイダ設定として組み込めます(Better Auth の generic OAuth プラグイン or Lucia の OAuth ヘルパーを利用)。
コールバック URL の設定、prompt=consent の指定、初回サインイン時の userテーブル作成(onSignUp フック)など、ハマりやすいポイントは押さえておきましょう。
パスワードリセットと招待
パスワードリセットは「メール送信 + 一意トークン + 有効期限 + 一回限り」の4点セットで実装します。Better Auth はテンプレートとして実装が含まれているケースが多く、自前でやる場合も同パターンを踏襲します。
組織型のSaaS / 社内ツールでは、招待リンク(管理者がメールアドレス入力 → トークン付きURLを送付 → 受信者がパスワード設定)も頻出。共有プロパティでロール状態を渡す設計と組み合わせれば、UI実装はかなり省力化できます。
セキュリティ運用の最低ライン
- HTTPS のみ運用: Cookie に Secure 属性を付ける、HSTS を有効にする
- CSRF 対策: Inertia リクエストにCSRFトークンを付ける
- Rate limiting: ログイン・パスワードリセット・招待エンドポイントに必ず
- Audit log: ログイン履歴・権限変更・重要操作を残す
- MFA: 業務向けには TOTP の導入を推奨(Better Auth はサポートあり)
- セッション失効: パスワード変更時・ロール変更時に既存セッションを無効化
次回 — デプロイ・本番運用
次回は最終回 デプロイ完全ガイド で、Cloudflare Workers / Vercel / Bun サーバ / Node の選び方とCI/CDをまとめます。シリーズ全体は Part 1 を参照ください。
FAQ
Q1: Auth0 や Clerk を使うべきですか?
A: SLA・サポート・各種コンプライアンス要件が厳しい案件では選択肢になります。中小SaaSや業務ツールでは OSS 系(Better Auth / Lucia)で十分なケースが多いです。
Q2: Better Auth と Lucia、どちらを選ぶ?
A: 機能網羅と組織機能が必要なら Better Auth、最小限のセッション管理を自分で組みたいなら Lucia。
Q3: SSO(SAML)対応は?
A: Better Auth に SSO プラグインがあり、社内向けの Microsoft Entra ID / Okta との連携が比較的楽。要件が深い場合はフルマネージドが現実解です。
Q4: パスキー(WebAuthn)は使えますか?
A: Better Auth がパスキーをサポートしています。2026年は本格導入のタイミング。
参考文献
お気軽にご相談ください
お問い合わせ