1
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?

はじめに

「認証を JWT(トークン方式) にするか、クッキー(セッションID方式) にするか」は、アーキテクチャ選定における非常に重要な分岐点です。

今回はモダンなウェブ開発(特に Next.js 15 + Vercel + Neon の構成)を想定して、それぞれの認証の違いとどちらを選ぶべきかを考えていきます。結論から言うと、Next.js 15 + BetterAuth + Neon を採用するなら、「クッキーベース(セッションID方式)」が圧倒的な最適解になります。その理由を技術的な背景とともに解説します。

なぜ「クッキーベース(BetterAuth 方式)」が良いのか?

1.「強制ログアウト」やセッション制御が容易(高いセキュリティ)
JWT の最大の弱点は、「一度発行したトークンをサーバー側から個別に無効化(キャンセル)できない」ことにあります。
もしユーザーのデバイスが盗まれたり、管理者が特定のユーザーを強制BANしたくても、JWT 方式では有効期限(Exp)が切れるまでアクセスを許してしまいます。

それに対してセッション方式であれば、データベース(Neon)の sessions テーブルから該当する1行を削除するだけで、即座にログアウト(アクセス拒否)させることが可能です。

2. Next.js 15 (App Router) の恩恵をフルに受けられる
Next.js 15 では、サーバー側でクッキーを読み取る cookies() 関数のパフォーマンスやキャッシュ戦略が最適化されています。

「サーバーサイドで毎回 DB(Neon)にセッションを確認しに行くと遅くなるのでは?」という懸念もありますが、Neon(PostgreSQL)を Vercel と同じリージョン(例: us-east-1 や ap-northeast-1)に配置していれば、その通信コストは極めて低く、実用上全く問題になりません。

3. BetterAuth が面倒な裏方をすべて解決してくれる
本来、DB を使ったセッション管理を自前で実装しようとすると、「古いセッションのクリーンアップ」や「有効期限の厳密なチェック」など、泥臭い実装が必要になります。

しかし、BetterAuth を導入すれば、これらのセッション管理ロジックをすべて自動化してくれます。JWT の署名検証やリフレッシュトークンの管理を自前でハックするよりも、結果としてコードが劇的に綺麗になります。

⚠️ 逆に「JWT」を選ぶべき唯一のケースとは?

クッキーベースが優れているなら、なぜ JWT がここまで普及しているのでしょうか?それは以下のような特定のユースケースがあるからです。

マルチドメイン / マイクロサービス構成

「フロントエンドは Next.js、APIサーバーは Go や Rust で別ドメインで動いている」かつ「APIサーバー側が高負荷すぎて、認証のために毎回 DB にアクセスさせたくない」というケース。

裏を返せば、Next.js 15 + Neon という単一の「Vercel エコシステム(モノリス、または密結合な構成)」にいるのであれば、DB 照会型のクッキー方式の方が圧倒的に安全で開発しやすい環境が作れます。

今後の拡張性とアドバイス(キャッシュ戦略)

もし将来的に、サービスが急成長して「セッションの頻繁な読み取りによる DB(Neon)の負荷やコネクション数が心配だな…」となった場合の回避策もシンプルです。

上記のように、セッションの保存・参照先として Redis (Upstash など) をキャッシュ層として後から1枚差し込むだけで、データベースへの直接アクセスを劇的に減らし、さらなる超高速化を実現できます。

1
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
1
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?