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年は本格導入のタイミング。
参考文献
お気軽にご相談ください
お問い合わせ