DeskRex.ai

open α

テーマ

データベース

自動化

発見

サインイン

リサーチの結果の保存、レポートの作成、共有が行えます。

サインイン

レポートの一覧に戻る

Multiple GoTrueClient警告の原因と対策:Supabase認証の最新知見

🗓 Created on 6/11/2025

  • 📜要約
  • 📊ビジュアライズ
  • 🖼関連する画像
  • 🔍詳細
    • 🏷Multiple GoTrueClient警告とは何か
    • 🏷警告が発生する具体的な状況と影響
    • 🏷推奨されるSupabaseクライアントの設計と管理方法
    • 🏷Vercelプレビュー環境でのセッション問題事例
    • 🏷認証トークン管理とセキュリティのポイント
  • 🖍考察
  • 📚参考文献
    • 📖利用された参考文献
    • 📖未使用の参考文献
    • 📊ドメイン統計

📜 要約

主題と目的

Supabaseの認証ライブラリGoTrueClientを用いたアプリケーションで表示される
「Multiple GoTrueClient instances detected in the same browser context.」という警告が何を意味し、どのような影響を及ぼし、どのように対策すべきかを明確に解説する。これにより、同一ブラウザコンテキスト内で複数インスタンスが生成されることによる未定義動作やセッション不整合を防ぎ、安定した認証環境を実現することを目的とする。

回答

1. 警告の概要

  • 内容
    「同じブラウザコンテキスト内でGoTrueClient(Supabaseクライアント)が複数インスタンス生成されました」という情報メッセージで、動作を停止させるエラーではない。
  • 意味
    同一のストレージキー(CookieやlocalStorage)を複数クライアントが並行利用すると、トークン更新やセッション取得時に競合し、未定義の動作を招く可能性がある
    reddit.com
    , 2。

2. 発生しやすい状況

  • フレームワークでのフック重複
    Nuxt.jsの
    useSupabaseClient()
    やReact/Next.jsのカスタムフックを異なるコンポーネントで呼び出すと、意図せず複数生成されやすい
    reddit.com
    。
  • Vercelプレビュー環境
    v0プレビューでログイン直後のセッションが即削除され、ログインページにリダイレクトされる事例。プレビューと本番で挙動差があり、同一コードでも発生
    vercel.com
    。
  • SSR/CSRの境界
    Next.js App Routerでサーバーコンポーネントとクライアントコンポーネントを混在利用する際、初期化関数を正しく使い分けないと重複する。

3. 潜在的な影響

  • 未定義動作(Undefined Behavior)
    セッション取得・更新が競合し、一方のクライアントが更新したトークンを他方が認識せず、リクエスト失敗やセッション破棄に繋がる。
  • 認証の不安定化
    JWTアクセストークン/リフレッシュトークンの整合性が崩れ、ログイン状態が途切れたり、無限リダイレクトが発生したりする。
  • デバッグ困難化
    本番とプレビュー環境で再現性が異なるため、原因追究に時間を要する。

4. 対策とベストプラクティス

  1. クライアント生成の一元化(シングルトン)
    全アプリでGoTrueClientインスタンスを一度だけ生成し、共有する。
  2. 公式ライブラリ
    @supabase/ssr
    の採用

    Next.js向けにクライアントを以下の2関数に集約し、SSR/CSRごとに明確に使い分ける
    zenn.dev
    。
    旧ライブラリ (
    @supabase/auth-helpers-nextjs
    )
    @supabase/ssr
    用途
    createClientComponentClientcreateBrowserClientクライアントコンポーネント
    createServerComponentClient<br>createServerActionClient<br>createRouteHandlerClient<br>createMiddlewareClientcreateServerClientサーバーコンポーネント・API・ミドルウェア
  3. ミドルウェアでのセッションリフレッシュ
    Next.js Middlewareを利用し、サーバーコンポーネント読み込み前に
    supabase.auth.getSession()
    を実行して常に最新化する。
  4. Cookieセキュリティ設定
    • 本番環境では
      secure: true
      を指定しHTTPS限定送信
    • sameSite: 'lax'
      ,
      httpOnly: false
      はSupabase公式推奨のまま利用可能
  5. PKCEフローの理解と活用
    OAuth2.0拡張仕様のPKCEを利用して
    signInWithOAuth
    などを実装し、安全性を確保する。

5. 実装サンプル

// utils/supabaseClient.js
import { createBrowserClient, createServerClient } from '@supabase/ssr'
import { cookies } from 'next/headers'

// CSR用
export const getBrowserClient = () =>
  createBrowserClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
  )

// SSR用
export const getServerClient = (cookieStore) =>
  createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
    {
      cookies: {
        get: (name) => cookieStore.get(name)?.value,
        set: (name, value, opts) => cookieStore.set({ name, value, ...opts }),
        remove: (name, opts) => cookieStore.set({ name, value: '', ...opts })
      }
    }
  )

結果と結論

「Multiple GoTrueClient instances detected…」はエラーではなく警告だが、同一ストレージキーで複数クライアントを動作させると未定義動作やセッション不整合を招く。特にNext.jsやNuxt.js、Vercelプレビュー環境で顕在化しやすいため、以下を徹底することで安定した認証を実現できる。
  • @supabase/ssr
    導入によるクライアント生成の明確化
  • シングルトンパターンでのインスタンス管理
  • Middlewareによるセッションの最新化
  • 本番環境でのCookieセキュリティ設定
    これらを実践すれば、警告を解消しつつ堅牢なSupabase Auth環境を構築できる。

コード実行

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Multiple GoTrueClient Instances 警告の原因と対策</title>
<script src="https://unpkg.com/mermaid@11.4.0/dist/mermaid.min.js"></script>
<script>mermaid.initialize({ startOnLoad: true });</script>
<style>
  body { font-family: Arial, sans-serif; margin: 20px; }
  h1 { color: #2c3e50; }
  .section { margin-bottom: 40px; }
  .source-link { font-size: 0.9em; }
</style>
</head>
<body>
  <h1>Multiple GoTrueClient Instances 警告の原因と対策</h1>

  <div class="section">
    <h2>原因の概要</h2>
    <div class="mermaid">
      graph TD
        A[同じブラウザコンテキスト内で複数のGoTrueClientインスタンスが生成される]
        B[同じストレージキーを共有]
        C[未定義の動作やセッション管理の問題発生]
        A --> B --> C
    </div>
    <p class="source-link">出典: <a href="https://github.com/supabase/supabase-js/issues/1394" target="_blank" rel="noopener noreferrer" class="text-blue-500 underline hover:text-blue-700">supabase-js GitHub Issue #1394</a></p>
  </div>

  <div class="section">
    <h2>発生状況の例</h2>
    <div class="mermaid">
      graph LR
        D[複数のコンポーネントやフックでcreateClientやuseSupabaseClientを複数回呼び出す]
        E[複数のGoTrueClientインスタンスが生成]
        F[警告メッセージ表示]
        D --> E --> F
    </div>
    <p class="source-link">出典: <a href="https://www.reddit.com/r/Nuxt/comments/15f5wzo/error_multiple_gotrueclient_instances_detected_in/" target="_blank" rel="noopener noreferrer" class="text-blue-500 underline hover:text-blue-700">Reddit Nuxt Supabase 議論</a></p>
  </div>

  <div class="section">
    <h2>推奨される対策</h2>
    <div class="mermaid">
      graph TD
        G[Supabaseクライアントのインスタンスをアプリ全体で1つに統一]
        H[クライアントの再利用]
        I[同じストレージキーの競合回避]
        J[安定したセッション管理]
        G --> H --> I --> J
    </div>
    <p class="source-link">出典: <a href="https://supabase.com/docs/guides/auth/server-side/creating-a-client?environment=client-component" target="_blank" rel="noopener noreferrer" class="text-blue-500 underline hover:text-blue-700">Supabase公式ドキュメント</a></p>
  </div>

  <div class="section">
    <h2>補足情報</h2>
    <ul>
      <li>この警告はエラーではなく、未定義の動作を避けるための注意喚起です。</li>
      <li>特にNext.jsやNuxt.jsなどのフレームワークで複数のコンポーネントが独立してクライアントを作成しないように注意。</li>
      <li>クライアントの生成はアプリケーションのエントリーポイントやコンテキストで一元管理することが望ましい。</li>
    </ul>
  </div>

</body>
</html>

🖼 関連する画像

Image for cmbqkipsp000e8dozd34hjfwj
Image for cmbqkipsp000f8doz8rajv7n0
Image for cmbqkipsp000g8dozjz6vafsb
Image for cmbqkipsp000h8doznyng5nni
Image for cmbqkipsr000y8dozo2nxpt0v
Image for cmbqkipsp000j8dozmavp5qcc
Image for cmbqkipsp000k8dozu8tvm9po
Image for cmbqkipsp000l8doztj3wakdd
Image for cmbqkipsq000m8dozoroeqg2u
Image for cmbqkipsq000n8dozltg5gah8
Image for cmbqkipsr00178dozwlahpzct
Image for cmbqkipsr00158dozfl6hzfnv
Image for cmbqkipsr00168dozbfoi5j2z
Image for cmbqkipsr00138dozma283ozy
Image for cmbqkipsr00198doz6lzx8akd
Image for cmbqkipsr00118dozxam2eci7
Image for cmbqkipsr00188doz6h3yi2g3
Image for cmbqkipsq000x8dozs839ea24
Image for cmbqkipsr000z8doz8mpbp496
Image for cmbqkipsr00108dozzhjo52gr
Image for cmbqkipsr00128doz1a4gby9a
Image for cmbqkipsr00148doz1s4m3esq

🔍 詳細

🏷Multiple GoTrueClient警告とは何か


Multiple GoTrueClient警告とは何か

「Multiple GoTrueClient instances detected in the same browser context.」というメッセージは、Supabaseを利用したアプリケーション開発において頻繁に遭遇する可能性のある警告です。このメッセージはエラーとしてアプリケーションの動作を停止させるものではありませんが、同一のブラウザコンテキスト内で複数のGoTrueClient(Supabaseクライアントインスタンス)が検出されたことを示しています
reddit.com
, 9。この状態が続くと同じストレージキーの下でクライアントが同時に使用されると、予期せぬ未定義の動作を引き起こす可能性があるため、解決が推奨されています
reddit.com
,
vercel.com
,
github.com
,
stackoverflow.com
。
この警告は、特にNuxt.jsのようなモダンなJavaScriptフレームワークでSupabaseを利用している場合に多く報告されており
reddit.com
,
github.com
,
reddit.com
,
answeroverflow.com
、ユーザーが
useSupabaseUser
と
useSupabaseClient
のようなフックを同時に使用した際に発生した事例も報告されています6。これは、コンポーネントやレイアウトの異なる箇所で独立してSupabaseクライアントが初期化されている可能性を示唆しており、アプリケーションの規模が大きくなるにつれて発生しやすくなる傾向にあります。

検出される状況と具体的な影響

この警告メッセージは、「"Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined behavior when used concurrently under the same storage key."」という具体的な形で表示されます
reddit.com
。あるユーザーの報告では、Nuxt3とSupabaseの古いバージョンでは問題なく動作していたコードが、バージョンアップ後にこの警告が表示されるようになったとされており、
@nuxtjs/supabase
のバージョンアップに伴い、Supabaseクライアントのインスタンス管理に関する挙動に変更があった可能性が考えられます
reddit.com
。このユーザーが使用していたコードでは、
<script setup>
内で
useSupabaseClient()
フックを直接使用していました
reddit.com
。
具体的な影響としては、Vercelのv0プレビュー環境で、Supabaseを利用したマルチテナントSaaSプラットフォーム開発において、ログイン後にセッションが作成された直後に削除され、ログインページにリダイレクトされてしまう問題が報告されています
vercel.com
,
vercel.com
。この問題は、同じコードでも本番環境では発生しないことから、プレビュー環境と本番環境でのセッション管理の挙動に違いがある可能性を示唆しています
vercel.com
。これは、複数のGoTrueClientインスタンスがセッション管理の整合性を損ない、予期せぬセッションの破棄につながっている可能性が考えられます。

Supabaseクライアントの統合と推奨されるライブラリ

Supabaseは、特にNext.jsのようなサーバーサイドレンダリング(SSR)やサーバーコンポーネントを扱うフレームワークでの利用において、クライアントのインスタンス管理を最適化するために
@supabase/ssr
というライブラリを推奨しています
zenn.dev
。このライブラリは現在ベータ版ですが、SupabaseクライアントをCookieを使用するように自動的に構成し、ユーザーセッションがNext.jsのスタック全体(クライアント、サーバー、App Router、Pages Router)でシームレスに利用可能になるよう簡素化します
zenn.dev
,
zenn.dev
,
zenn.dev
。
以前の
@supabase/auth-helpers-nextjs
では、クライアントの用途に応じて5つの異なるクライアント(
createClientComponentClient
,
createServerComponentClient
,
createServerActionClient
,
createRouteHandlerClient
,
createMiddlewareClient
)が提供されていました
zenn.dev
,
zenn.dev
。しかし、
@supabase/ssr
では、以下の2つのクライアントに集約され、より見通しが良くなっています
zenn.dev
,
zenn.dev
,
zenn.dev
。
以前のクライアント (
@supabase/auth-helpers-nextjs
)
現在のクライアント (
@supabase/ssr
)
用途
createClientComponentClient
createBrowserClient
クライアントコンポーネント用
createServerComponentClient
createServerClient
サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
createServerActionClient
createServerClient
サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
createRouteHandlerClient
createServerClient
サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
createMiddlewareClient
createServerClient
サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
この集約は、開発者がSupabaseクライアントを扱う際の複雑さを軽減し、複数のインスタンスが意図せず生成されるリスクを低減することを目的としていると考えられます。特に、Next.jsのようなハイブリッドレンダリング環境では、クライアントサイドとサーバーサイドの両方でセッション管理を適切に行う必要があり、
@supabase/ssr
はこれを効率的に実現するための重要なツールとなります。

セッション管理とセキュリティの観点からの考察

Supabase Authで認証が行われると、主にJWT形式のアクセストークンとリフレッシュトークンが発行されます
zenn.dev
,
zenn.dev
。アクセストークンは有効期間が短く設計されており、
header
、
payload
、
署名
の3つの部分で構成されます
zenn.dev
,
zenn.dev
。一方、リフレッシュトークンは期限切れになることはなく、一度しか使用できませんが、これを用いて新しいアクセストークンとリフレッシュトークンのペアを取得することが可能です
zenn.dev
,
zenn.dev
。これらのトークンはブラウザ側のCookieに保存され、Supabaseクライアントは、このCookieと
anon_key
を組み合わせてSupabase APIにアクセスするように構成されています
zenn.dev
,
zenn.dev
,
zenn.dev
,
zenn.dev
。
「Multiple GoTrueClient instances detected...」警告がセッションの未定義動作につながる可能性があるのは、複数のクライアントがそれぞれのストレージキーの下で独立してトークンを管理しようとするためだと考えられます。これにより、セッション情報の読み書きに競合が発生し、一方のクライアントが更新したセッションを他方のクライアントが認識せず、古いセッション情報に基づいてリクエストを送信したり、セッションが誤って破棄されたりする可能性が生じます。
Supabase Authは、認可コードフローとしてOAuth 2.0の拡張仕様であるPKCE(Proof Key for Code Exchange)を推奨しており、
signInWithOtp
、
signInWithOAuth
、
signUp
、
resetPasswordForEmail
などのメソッドでサポートされています
zenn.dev
,
zenn.dev
,
zenn.dev
,
zenn.dev
。PKCEは、認可コードが横取りされた場合でも安全性を保つための重要な仕組みであり
zenn.dev
,
zenn.dev
,
zenn.dev
、複数のGoTrueClientインスタンスがセッション管理に混乱をもたらすことは、PKCEのようなセキュリティ強化策の効果を損なうリスクもはらんでいます。

対策と実践的な洞察

この警告に対処するための最も効果的な方法は、アプリケーション全体でSupabaseクライアントのインスタンスをシングルトンパターンで管理し、複数のインスタンスが生成されないようにすることです。特にNext.jsやNuxt.jsのようなフレームワークを使用している場合、公式が推奨する
@supabase/ssr
のようなヘルパーライブラリを活用し、クライアントの初期化を一元化することが重要です
zenn.dev
。
例えば、Next.jsのApp RouterでSupabaseを使用する場合、以下のような構造でクライアントを生成することが推奨されています
zenn.dev
,
zenn.dev
。
// Server Component用
import { createServerClient, type CookieOptions } from '@supabase/ssr'
import { cookies } from 'next/headers'

export const createClient = (cookieStore: ReturnType<typeof cookies>) => {
  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        get(name: string) {
          return cookieStore.get(name)?.value
        },
        set(name: string, value: string, options: CookieOptions) {
          try {
            cookieStore.set({ name, value, ...options })
          } catch (error) {
            // The `set` method was called from a Server Component.
            // This can be ignored if you have middleware refreshing
            // user sessions.
          }
        },
        remove(name: string, options: CookieOptions) {
          try {
            cookieStore.set({ name, value: '', ...options })
          } catch (error) {
            // The `delete` method was called from a Server Component.
          }
        },
      },
    }
  )
}

// Client Component用
import { createBrowserClient } from '@supabase/ssr'

export const createClient = () =>
  createBrowserClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
  )
このように、用途に応じて単一のエントリポイントからクライアントを生成することで、複数のGoTrueClientインスタンスが意図せず作成されるのを防ぐことができます。また、Middlewareを利用してサーバーコンポーネントが読み込まれる前にトークンのリフレッシュを行うことも、セッション管理の安定化に寄与します
zenn.dev
。
もしAIコーディングアプリ「Lovable」のユーザーのように
reddit.com
、この警告に起因する認証問題に直面している場合、まず上記の推奨されるクライアント作成方法を適用し、Supabaseの公式ドキュメント18を参照して最新のベストプラクティスに従うことが重要です。特に、古いバージョンのライブラリを使用している場合は、最新の
@supabase/ssr
への移行を検討することで、インスタンス管理の改善とそれに伴う問題の解決が期待できます。
copy url
source logoreddit.com

調査のまとめ

回答

「Multiple GoTrueClient instances detected in the same browser context.」というメッセージは、アプリケーション内で...

🏷警告が発生する具体的な状況と影響

画像 1

Multiple GoTrueClient警告の原因と対策:Supabase認証の最新知見

警告が発生する具体的な状況と影響

「Multiple GoTrueClient instances detected in the same browser context.」という警告は、Supabaseの認証ライブラリであるGoTrueClientのインスタンスが、同じブラウザコンテキスト内で複数回初期化されていることを示しています
vercel.com
,
reddit.com
. このメッセージ自体はエラーではありませんが、同じストレージキーを同時に使用すると、未定義の動作(undefined behavior)を引き起こす可能性があるため、避けるべきであると警告されています
vercel.com
,
reddit.com
.
この警告が発生する具体的な状況としては、主に以下のようなケースが報告されています。

1. 開発環境と本番環境の挙動の差異

Vercelのv0プレビュー環境でSupabaseを使用したマルチテナントSaaSプラットフォームを開発している際に、この警告とともにセッションハンドリングの問題が発生した事例があります
vercel.com
. ログインを試みるとセッションが作成された直後に削除され、ログインページにリダイレクトされてしまうという挙動が確認されています
vercel.com
. 興味深いのは、同じコードを使用してもVercelにデプロイされた本番環境では問題なくログインでき、セッションが維持される点です
vercel.com
. これは、プレビュー環境と本番環境での環境設定や内部的なセッション管理の仕組みに差異がある可能性を示唆しています。ログにはログイン試行とその応答(アクセストークン、リフレッシュトークン、有効期限などを含む)が詳細に記録されていますが、ログイン応答の直後に「Multiple GoTrueClient instances detected...」の警告が複数回表示されています
vercel.com
,
vercel.com
,
vercel.com
. ユーザーはログイン後にダッシュボードへリダイレクトされ、セッションが維持されることを期待しており、本番環境での成功からプレビュー環境でも同様の挙動を望んでいます
vercel.com
.

2. Nuxt.js環境でのGoTrueClientの初期化

Nuxt3とSupabaseの組み合わせで開発しているユーザーからも同様の警告が報告されています
reddit.com
. 以前のバージョンのNuxt3/Supabaseでは問題なく動作していたコードが、バージョンアップ後にこの警告を出すようになったとのことです
reddit.com
. 提示されたコードスニペットを見る限り、
useSupabaseClient()
フックがVueファイル内で直接使用されており、これが複数回呼び出されることで警告が発生している可能性が考えられます
reddit.com
.
Supabaseクライアントの初期化方法については、Next.jsのApp RouterでSupabase Authを使用する際、
@supabase/ssr
パッケージの
createBrowserClient
(クライアントコンポーネント用)と
createServerClient
(サーバーコンポーネント、サーバーアクション、ルートハンドラ、ミドルウェア用)の2つのクライアントにまとめられており、これらが推奨されています
zenn.dev
,
zenn.dev
.
@supabase/ssr
を使用すると、Cookieを使ってユーザーセッションがNext.jsスタック全体で利用できるように自動的に構成されます
zenn.dev
,
zenn.dev
.

3. AIコーディングアプリにおける認証問題

AIコーディングアプリ「Lovable」を利用しているユーザーも、SupabaseのGoTrueClientインスタンスに関連する認証問題に直面していることが示唆されています
reddit.com
,
reddit.com
. このユーザーは、AIが自身の認証問題を解決することを期待していましたが、現状では期待に応えられていないと感じています
reddit.com
. これは、GoTrueClientのインスタンス管理が適切に行われていないことが、アプリケーション全体の認証フローに影響を与え、ユーザー体験を損なう可能性があることを示しています
reddit.com
.

警告がもたらす潜在的な影響

「Multiple GoTrueClient instances detected...」の警告は、単なる情報メッセージにとどまらず、アプリケーションの動作に深刻な影響を与える可能性があります。
  • 未定義の動作(Undefined Behavior): 最も直接的な影響は、同じストレージキーで複数のGoTrueClientインスタンスが同時に使用された場合に発生する可能性のある未定義の動作です
    vercel.com
    ,
    reddit.com
    . これは予測不能な挙動を引き起こし、デバッグを困難にするだけでなく、ユーザーのセッションが予期せず失われたり、認証状態が不安定になったりする原因となり得ます。Vercelのプレビュー環境でのセッションの即時削除とリダイレクトは、この未定義の動作の一例と考えられます
    vercel.com
    .
  • 認証の不安定性: 複数のクライアントインスタンスが同時にセッションを管理しようとすると、Cookieやローカルストレージに保存されているJWTアクセストークンやリフレッシュトークン
    zenn.dev
    の整合性が失われる可能性があります。Supabase AuthはGoTrueを基盤としており19, 18, JWT形式のアクセストークンとリフレッシュトークンを発行し、これらをブラウザのCookieに保存しています
    zenn.dev
    ,
    zenn.dev
    . 認証サーバーの障害がアプリケーション全体に影響を与える可能性があることを考えると
    reddit.com
    ,
    zenn.dev
    , クライアント側での認証状態の不安定性は、UXの低下やセキュリティリスクに直結します。
  • 開発・デバッグの困難さ: 警告自体はエラーではないものの、それが未定義の動作に繋がるため、開発者はその原因特定と解決に多くの時間を費やすことになります。特に、本番環境とプレビュー環境で挙動が異なる場合、問題の再現やデバッグがさらに複雑になります
    vercel.com
    .

対策と推奨事項

この警告を解決し、安定した認証を実現するためには、Supabaseクライアントインスタンスの管理を徹底することが不可欠です。
  1. クライアントインスタンスの一元化: GoTrueClientインスタンスは、アプリケーション内でシングルトンパターンを用いて一つだけ存在するように徹底すべきです。Next.jsなどのフレームワークを使用している場合は、
    @supabase/ssr
    の
    createBrowserClient
    や
    createServerClient
    といった推奨されるクライアント作成関数を使用して、適切なコンポーネントまたはファイルで一度だけインスタンスを生成し、それをアプリケーション全体で共有するように構造化します
    zenn.dev
    ,
    zenn.dev
    , 10.
    // createClient.js (例: クライアントコンポーネント用)
    import { createBrowserClient } from '@supabase/ssr'
    export const createClient = () =>
      createBrowserClient(
        process.env.NEXT_PUBLIC_SUPABASE_URL!,
        process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
      )
    
    この
    createClient
    関数を、Supabaseクライアントが必要な場所で呼び出すことで、毎回新しいインスタンスが生成されるのを防ぐことができます。
  2. サーバーサイドレンダリング(SSR)環境でのCookie管理の理解: Supabase Authは、認証にJWT(JSON Web Token)とリフレッシュトークンを使用し、これらをCookieに保存します
    zenn.dev
    , 7. 特にNext.jsのようなSSR環境では、サーバーとクライアントの両方でセッションが利用可能であることが重要であり、
    @supabase/ssr
    パッケージがこのCookieベースのセッション管理を自動的に構成してくれます
    zenn.dev
    , 13. ミドルウェアを使ってサーバーコンポーネントが読み込まれる前にトークンをリフレッシュするような実装は、セッション管理を堅牢にする上で有効です14.
  3. 開発環境の設定確認: Vercelのプレビュー環境と本番環境での挙動の違いは、環境変数、セキュリティ設定(例:Cookieの
    Secure
    属性1, 5)、またはVercelが内部的にセッションを処理する方法の違いに起因する可能性があります。開発中は
    Secure
    属性を
    false
    に設定し、本番環境では
    true
    にすることが推奨されます5. 環境ごとの挙動を比較し、Vercelコミュニティの議論
    vercel.com
    などを参考にしながら、適切な設定を行うことが重要です。
  4. Supabase Authのフローの理解: Supabase Authは、OAuth2.0の拡張仕様であるPKCE(Proof Key for Code Exchange)を含む認可コードフローを推奨しています14, 16.
    signInWithOtp
    、
    signInWithOAuth
    、
    signUp
    、
    resetPasswordForEmail
    などのメソッドでPKCEがサポートされており18,
    signUp
    関数内でも
    flowType === 'pkce'
    でPKCEフローの処理が追加されています19. これらの認証フローを正しく理解し、アプリケーションに適切に組み込むことで、セッションの安定性とセキュリティを確保できます。
これらの対策を講じることで、「Multiple GoTrueClient instances detected...」という警告を解消し、より安定したSupabase認証を実現できるでしょう。
copy url
source logovercel.com
copy url
source logoreddit.com

🏷推奨されるSupabaseクライアントの設計と管理方法

画像 1

推奨されるSupabaseクライアントの設計と管理方法

「Multiple GoTrueClient instances detected in the same browser context.」というエラーメッセージは、Supabaseの認証ライブラリであるGoTrueClientが、同一ブラウザコンテキスト内で複数回初期化されていることを示唆しています。このメッセージ自体はエラーではなく警告であり、「未定義の動作を引き起こす可能性があるため避けるべきである」と述べられています
reddit.com
。この警告は、特にNuxt.jsのようなフレームワークで、
useSupabaseClient()
のようなフックがVueファイル内で使用された際に確認されています
reddit.com
。これは、開発者が意識せずに複数のクライアントインスタンスを作成してしまう状況で発生しやすいと言えるでしょう。
この問題の根本的な原因は、Supabaseクライアントの不適切な初期化と管理にあります。Supabaseは、Next.jsのようなサーバーサイドレンダリング(SSR)を行うフレームワークでの認証をサポートするために、特定のクライアントライブラリを提供しています。以前は
@supabase/auth-helpers-nextjs
というライブラリが使用されており、これにはクライアントコンポーネント用、サーバーコンポーネント用、サーバーアクション用、ルートハンドラー用、ミドルウェア用と、5つの異なるクライアント作成関数が提供されていました
zenn.dev
zenn.dev
。この多様性が、開発者が意図せず重複してクライアントを初期化してしまう一因となっていた可能性があります。
現在、SupabaseはNext.jsでの使用に関して、
@supabase/ssr
ライブラリを公式に推奨しています
zenn.dev
zenn.dev
。このライブラリは現在ベータ版ではありますが、APIがより整理されており、クライアント作成関数が以下の2つに集約されています
zenn.dev
zenn.dev
。
  • createBrowserClient
    : クライアントコンポーネント用
  • createServerClient
    : サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
この集約により、クライアントの使い分けが明確になり、誤って複数のインスタンスを作成するリスクが低減されると考えられます
zenn.dev
zenn.dev
。
@supabase/ssr
を使用してクライアントを作成すると、ユーザーセッションの保存にCookieが自動的に使用されるように構成され、Next.jsスタック全体(クライアント、サーバー、App Router、Pages Router)でセッションが利用可能になります
zenn.dev
zenn.dev
zenn.dev
。これにより、セッション管理の一貫性が保たれ、意図しないクライアントの再初期化を防ぐ効果が期待できます。

推奨されるクライアントの設計と管理戦略

この警告を回避し、堅牢なSupabase認証システムを構築するためには、以下の設計と管理戦略を考慮することが重要です。

1.
@supabase/ssr
の採用とクライアントの一元化

最も重要なのは、Supabaseが推奨する
@supabase/ssr
ライブラリを使用することです
zenn.dev
。このライブラリを使用することで、クライアントの作成が一元化され、各環境(クライアント、サーバー、ミドルウェアなど)で適切なクライアントが単一の場所から供給されるようになります。
// クライアントコンポーネント用
import { createBrowserClient } from '@supabase/ssr'
export const createClient = () =>
  createBrowserClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
  )

// サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
import { createServerClient, type CookieOptions } from '@supabase/ssr'
import { cookies } from 'next/headers'
export const createClient = (cookieStore: ReturnType<typeof cookies>) => {
  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        get(name: string) {
          return cookieStore.get(name)?.value
        },
        set(name: string, value: string, options: CookieOptions) {
          try {
            cookieStore.set({ name, value, ...options })
          } catch (error) {
            // The `set` method was called from a Server Component.
            // This can be ignored if you have middleware refreshing
            // user sessions.
          }
        },
        remove(name: string, options: CookieOptions) {
          try {
            cookieStore.set({ name, value: '', ...options })
          } catch (error) {
            // The `delete` method was called from a Server Component.
          }
        },
      },
    }
  )
}
上記の例のように、
createClient
関数をユーティリティファイルとして定義し、必要な場所でインポートして使用することで、クライアントインスタンスの重複作成を防ぐことができます
zenn.dev
zenn.dev
。

2. ミドルウェアを活用したセッション管理

Next.jsのミドルウェアは、サーバーコンポーネントが読み込まれる前にトークンのリフレッシュを行うために重要な役割を果たします
zenn.dev
zenn.dev
zenn.dev
。これにより、セッションの有効期限切れによる認証エラーを防ぎ、ユーザー体験を向上させることができます。
import { type NextRequest } from 'next/server'
import { createClient } from '@/utils/supabase/middleware'

export async function middleware(request: NextRequest) {
  const { supabase, response } = createClient(request)
  // Refresh session if expired - required for Server Components
  // https://supabase.com/docs/guides/auth/auth-helpers/nextjs#managing-session-with-middleware
  await supabase.auth.getSession()
  return response
}

export const config = {
  matcher: [
    /*
     * Match all request paths except for the ones starting with:
     * - _next/static (static files)
     * - _next/image (image optimization files)
     * - favicon.ico (favicon file)
     * Feel free to modify this pattern to include more paths.
     */
    '/((?!_next/static|_next/image|favicon.ico).*)',
  ],
}
このミドルウェアは、リクエストごとにSupabaseクライアントを作成し、セッションをリフレッシュする処理を実行します
zenn.dev
zenn.dev
。これにより、サーバー側で常に最新のセッション情報が利用可能となり、クライアント側での認証状態の不整合を防ぐことができます。

3. Cookieのセキュリティ設定の最適化

Supabase認証で使用されるJWT形式のアクセストークンやリフレッシュトークンは、ブラウザのCookieに保存されます
zenn.dev
zenn.dev
。デフォルトのCookie設定では
httpOnly
が
false
となっていますが、Supabase公式は
httpOnly
を
true
にする必要はないと示しています
zenn.dev
zenn.dev
。しかし、本番環境では
Secure
属性を
true
に設定することが推奨されます
zenn.dev
zenn.dev
。これにより、CookieがHTTPS経由でのみ送信されるようになり、セキュリティが向上します。
const DEFAULT_COOKIE_OPTIONS = {
  path: "/",
  sameSite: "lax",
  httpOnly: false,
  maxAge: 60 * 60 * 24 * 365 * 1e3
};

// クライアント初期化時のSecure設定例
{
  secure: process.env.NODE_ENV === 'production',
  // ...その他のオプション
}
この設定は、開発環境(localhost)での利便性を損なうことなく、本番環境での安全性を確保するために重要です
zenn.dev
zenn.dev
。

4. PKCEフローの理解と活用

Supabase Authは、OAuth 2.0の拡張仕様であるPKCE(Proof Key for Code Exchange)を含む認可コードフローを推奨しています
zenn.dev
zenn.dev
。PKCEは、認可コードが横取りされた場合でも安全性を保つための仕組みであり、「認可コードのリクエスト主と、アクセストークンのリクエスト主が同じであること」を検証します
zenn.dev
zenn.dev
。
signInWithOtp
、
signInWithOAuth
、
signUp
、
resetPasswordForEmail
などのSupabase AuthメソッドはPKCEをサポートしており
zenn.dev
zenn.dev
、これらのメソッドを利用する際には、内部で
code_verifier
と
code_challenge
が生成され、Supabaseの
auth
スキーマの
flow_states
テーブルに保存されます
zenn.dev
zenn.dev
zenn.dev
。これにより、特にモバイルアプリケーションやシングルページアプリケーションなど、クライアントシークレットを安全に保存できない環境での認証フローのセキュリティが大幅に強化されます。

まとめ

「Multiple GoTrueClient instances detected in the same browser context.」という警告は、Supabase認証ライブラリのインスタンスが重複して作成されていることを示しており、未定義の動作を引き起こす可能性があります
reddit.com
。この問題を解決し、堅牢なSupabase認証を実装するためには、公式に推奨されている
@supabase/ssr
ライブラリを採用し、クライアントの作成と管理を一元化することが鍵となります
zenn.dev
zenn.dev
。特にNext.jsのようなフレームワークでは、クライアント、サーバー、ミドルウェアといった異なる実行コンテキストでSupabaseクライアントを適切に初期化し、Cookieベースのセッション管理とミドルウェアによるトークンリフレッシュを組み合わせることで、シームレスで安全な認証体験を提供できます。また、PKCEフローの理解と適切な実装は、認証のセキュリティをさらに高める上で不可欠です
zenn.dev
zenn.dev
。これらの推奨事項を遵守することで、開発者はSupabase認証をより効果的かつ安全にアプリケーションに統合することが可能になるでしょう。
copy url
source logozenn.dev
kutakutat
https://supabase.com/docs/guides/auth
kutakutat
https://github.com/vercel/next.js/tree/canary/examples/with-supabase
kutakutat
kutakutat
kutakutat
kutakutat
https://supabase.com/docs/guides/auth/auth-helpers/nextjs#creating-a-supabase-client
kutakutat
https://supabase.com/docs/guides/auth/server-side/creating-a-client?environment=client-component
kutakutat
kutakutat
kutakutat
https://supabase.com/docs/learn/auth-deep-dive/auth-deep-dive-jwts
kutakutat
kutakutat
kutakutat
kutakutat
kutakutat
kutakutat
kutakutat
https://supabase.com/docs/guides/auth/server-side-rendering#how-do-i-make-the-cookies-httponly-
kutakutat
kutakutat
kutakutat
kutakutat
kutakutat
kutakutat
https://supabase.com/docs/guides/getting-started/architecture
kutakutat
https://zenn.dev/zaki_yama/articles/oauth2-authorization-code-grant-and-pkce
kutakutat
kutakutat
kutakutat
kutakutat

🏷Vercelプレビュー環境でのセッション問題事例

画像 1

Vercelプレビュー環境でのセッション問題事例

「
Multiple GoTrueClient instances detected in the same browser context.
」という警告メッセージは、Supabase Authを利用したアプリケーション開発において遭遇する可能性のある重要なシグナルです。これは直接的なエラーではありませんが、同じブラウザコンテキスト内で複数のGoTrueClientインスタンスが動作しており、同じストレージキーを同時に使用すると予期せぬ動作(未定義の動作)を引き起こす可能性があるため、注意が必要であるとされています
vercel.com
。
特にVercelのプレビュー環境では、この警告がセッションハンドリングの問題と密接に関連している事例が報告されています。具体的には、Supabaseで認証を実装したマルチテナントSaaSプラットフォームをVercelのv0プレビュー環境にデプロイした際、ユーザーがログインを試みると、セッションが作成された直後に削除され、ログインページにリダイレクトされてしまうという現象が発生しています
vercel.com
、
vercel.com
。
この問題の興味深い点は、全く同じコードベースを使用しているにもかかわらず、本番環境では問題なくログインでき、セッションが維持されるという点です
vercel.com
。これは、Vercelのプレビュー環境と本番環境におけるセッション管理やブラウザコンテキストの扱いに何らかの差異があることを強く示唆しています。ログを見ると、ログイン試行後にユーザー情報とセッション情報を含む詳細なJSONレスポンスが正常に記録されているにもかかわらず、その直後に前述の
Multiple GoTrueClient instances detected...
という警告が複数回表示されていることが確認できます
vercel.com
、
vercel.com
、
vercel.com
。
Supabase Authでは、認証にJWT(JSON Web Token)形式のアクセストークンとリフレッシュトークンを使用し、これらはブラウザのCookieに保存されます
zenn.dev
。Cookieはデフォルトで
path: "/"
,
sameSite: "lax"
,
httpOnly: false
,
maxAge: 60 * 60 * 24 * 365 * 1e3
のようなオプションが渡されています
zenn.dev
。また、Supabaseクライアント(
@supabase/ssr
パッケージの
createBrowserClient
や
createServerClient
など)は、このCookieを使用してユーザーセッションをNext.jsスタック全体で利用できるように自動的に構成されます
zenn.dev
、
zenn.dev
、
zenn.dev
。
この「Multiple GoTrueClient instances detected」警告が発生する背景には、おそらく以下のようなシナリオが考えられます。
  • 異なるクライアントの初期化: Next.jsのApp Routerを使用している場合、クライアントコンポーネント用には
    createBrowserClient
    、サーバーコンポーネントやAPIルート用には
    createServerClient
    を適切に使い分ける必要があります
    zenn.dev
    。これらのクライアントが、意図せず同じブラウザコンテキスト(例えば、ブラウザタブ内)で複数回初期化されている可能性があります。
  • サーバーサイドレンダリング (SSR) とクライアントサイドレンダリング (CSR) の境界: Vercelのプレビュー環境では、ビルドプロセスやランタイム環境が本番と微妙に異なることがあり、SSRとCSRの切り替わり時にGoTrueClientのインスタンスが重複して作成されてしまう、あるいはセッションCookieのハンドリングに差異が生じる可能性が考えられます。特に、Next.jsのMiddlewareでセッションをリフレッシュするような実装をしている場合
    zenn.dev
    、その処理がプレビュー環境の特殊な挙動と衝突することも考えられます。
  • キャッシュや最適化: Vercelがプレビュー環境で行う特定の最適化やキャッシュ戦略が、Supabaseのセッション管理メカニズムと予期せぬ相互作用を起こしている可能性も排除できません。
この問題の解決策としては、まずSupabaseクライアントの初期化がアプリケーション内で一貫して、かつ意図した箇所でのみ行われているかを確認することが重要です。特にNext.jsやNuxt.jsのようなフレームワークでは、サーバーサイドとクライアントサイドでのクライアントの作成方法が異なるため、公式ドキュメント
zenn.dev
に沿って適切なクライアントヘルパー(
@supabase/ssr
など)を使用しているか、そしてその初期化が重複していないかを検証する必要があります。
また、Cookieの
Secure
属性は本番環境ではHTTPS経由でのみ送信されるように設定することが推奨されますが、開発環境ではlocalhostでの問題が発生する可能性があるため、
process.env.NODE_ENV === 'production'
のような条件分岐で対応することも考慮に入れると良いでしょう
zenn.dev
、
zenn.dev
。
この問題は、AIコーディングツール(例: Lovable
reddit.com
)が生成したコードにも潜んでいる可能性があり、一見問題なく動作するように見えても、特定の環境下で予期せぬセッション挙動を引き起こすことがあります
reddit.com
。したがって、本番環境とプレビュー環境での挙動の違いを詳細に分析し、クライアントの初期化ロジック、Cookieの設定、およびVercelのデプロイ設定を再確認することが、この問題解決への鍵となるでしょう。
copy url
source logovercel.com

🏷認証トークン管理とセキュリティのポイント


認証トークン管理とセキュリティのポイント

「Multiple GoTrueClient instances detected in the same browser context.」という警告は、Supabase Authを利用したアプリケーション開発において頻繁に遭遇する可能性のあるメッセージです。このメッセージは、ブラウザの同じコンテキスト内で複数のGoTrueClientインスタンスが検出されたことを示唆しています
unpkg.com
, 9。これは厳密にはエラーではなく警告ではありますが、同じストレージキーを複数のインスタンスが同時に使用すると、予期せぬ動作を引き起こす可能性があるため、開発者はこの警告を無視すべきではありません
reddit.com
,
vercel.com
,
github.com
,
stackoverflow.com
。
この警告は、特にNuxt.jsなどのモダンなJavaScriptフレームワークでSupabaseを利用している場合に多く報告されています
reddit.com
,
github.com
,
reddit.com
,
answeroverflow.com
。具体的には、
useSupabaseUser
と
useSupabaseClient
のような関連するフックを同時に使用した際にこの問題が発生した事例も報告されており、これはクライアントインスタンスの適切な管理が不可欠であることを強く示唆しています
reddit.com
。

認証トークンとその管理の重要性

Supabase Authにおいて、ユーザー認証が成功すると主にJWT(JSON Web Token)形式のアクセストークンとリフレッシュトークンが発行されます
zenn.dev
。これらのトークンは、認証状態の維持とAPIへの安全なアクセスを可能にする上で極めて重要な役割を担います。
  • アクセストークン: 有効期間が短く設計されており、
    header
    、
    payload
    、
    署名
    の3つの部分で構成されます
    zenn.dev
    。この設計は、トークンが不正に取得された場合のリスクを最小限に抑えるためのセキュリティ上の配慮です。例えば、PayloadにはユーザーIDやメールアドレス、役割などの情報が格納されることがあります
    zenn.dev
    。
  • リフレッシュトークン: 期限切れになることはなく、一度しか使用できません。これを利用して新しいアクセストークンとリフレッシュトークンのペアを取得し、セッションを継続することができます
    zenn.dev
    ,
    zenn.dev
    。
これらのトークンはブラウザ側ではCookieに保存されます
zenn.dev
,
zenn.dev
。Supabaseクライアントは、これらのCookieに保存された情報とアプリケーションの
anon_key
を組み合わせてSupabase APIへのリクエストを認証します
zenn.dev
,
zenn.dev
。

統合されたクライアントの利用とセキュリティ対策

SupabaseはNext.jsのようなサーバーサイドレンダリング(SSR)をサポートするフレームワークでの利用を簡素化するため、現在ベータ版の
@supabase/ssr
ライブラリを推奨しています
zenn.dev
,
zenn.dev
。このライブラリは、SupabaseクライアントをCookieを使用するように自動的に設定し、ユーザーセッションがNext.jsスタック全体(クライアント、サーバー、App Router、Pages Router)でシームレスに利用可能になるようにします
zenn.dev
,
zenn.dev
,
zenn.dev
。
以前の
@supabase/auth-helpers-nextjs
では、クライアントコンポーネント用、サーバーコンポーネント用など、用途別に5種類のクライアントが提供されていましたが、
@supabase/ssr
では以下の2つに集約され、よりシンプルで一貫性のあるクライアント管理が可能になりました
zenn.dev
,
zenn.dev
,
zenn.dev
。
以前のクライアント (
@supabase/auth-helpers-nextjs
)
現在のクライアント (
@supabase/ssr
)
用途
createClientComponentClient
createBrowserClient
クライアントコンポーネント用
createServerComponentClient
createServerClient
サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
createServerActionClient
createServerClient
サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
createRouteHandlerClient
createServerClient
サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
createMiddlewareClient
createServerClient
サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用
この集約は、「Multiple GoTrueClient instances detected...」警告を回避し、アプリケーションの安定性を高める上で非常に重要です。開発者は、各クライアントの役割を理解し、適切な場所で適切なクライアントを使用することで、複数のインスタンスが誤って生成されるのを防ぐことができます
zenn.dev
,
zenn.dev
。

セキュリティプロトコルとセッションの堅牢性

Supabase Authは、OAuth 2.0の拡張仕様であるPKCE(Proof Key for Code Exchange)を認可コードフローに採用しており、
signInWithOtp
、
signInWithOAuth
、
signUp
、
resetPasswordForEmail
などの主要な認証メソッドでサポートしています
zenn.dev
,
zenn.dev
,
zenn.dev
。PKCEは、認可コードが第三者に横取りされた場合でも、その認可コードをアクセストークンに交換されることを防ぐための重要なセキュリティメカニズムです
zenn.dev
,
zenn.dev
,
zenn.dev
。このプロトコルは、特にモバイルアプリケーションやシングルページアプリケーション(SPA)など、クライアントサイドでのセキュリティ対策が難しい環境での認証フローを強化します。
PKCEの基本的なアイデアは、認可コードをリクエストする際にクライアントが一時的な秘密鍵(
code_verifier
)を生成し、そのハッシュ値(
code_challenge
)を認可サーバーに送信します
zenn.dev
,
zenn.dev
。その後、アクセストークンを要求する際には、元の
code_verifier
も送信し、サーバー側で
code_challenge
との整合性を検証するというものです
zenn.dev
。これにより、途中で認可コードが漏洩しても、正しい
code_verifier
を持たない攻撃者はアクセストークンを取得できず、セッションハイジャックのリスクが大幅に軽減されます。

Vercelプレビュー環境と認証の課題

Vercelのv0プレビュー環境で、ログイン後にセッションが直ちに削除され、
/login
ページにリダイレクトされてしまう問題が報告されています
vercel.com
,
vercel.com
,
vercel.com
。この問題は、「Multiple GoTrueClient instances detected...」警告と同時に発生しており、本番環境では問題なく動作することから、プレビュー環境特有のセッション管理の挙動やCookieの取り扱い方に違いがある可能性を示唆しています
vercel.com
。
このような環境固有の問題は、開発プロセスにおいて非常に困難を伴うことがあります。AIコーディングアプリ「Lovable」のユーザーが、認証問題の解決にAIが期待に応えられず不満を抱いている事例も報告されており、この中にGoTrueClientの警告が含まれている可能性も示唆されています
reddit.com
,
reddit.com
。これは、Supabase Authのような複雑な認証システムを扱う際には、単にコードを記述するだけでなく、フレームワークの挙動、デプロイ環境、そして認証プロトコルの詳細な理解が不可欠であることを示しています。
結局のところ、「Multiple GoTrueClient instances detected in the same browser context.」という警告は、アプリケーションの認証システムが不安定な状態にあることのサインであり、未定義の動作やセッション関連の問題を引き起こす可能性を秘めています。この警告に真摯に向き合い、最新の
@supabase/ssr
ライブラリの利用、適切なクライアントの初期化、そしてCookieのセキュリティ設定(例:開発環境での
Secure
属性の考慮
zenn.dev
)を徹底することで、より堅牢で信頼性の高い認証システムを構築し、ユーザー体験を向上させることが期待されます。

調査のまとめ

回答

「Multiple GoTrueClient instances detected in the same browser context.」というメッセージは、アプリケーション内で...

🖍 考察

調査の本質

ユーザーが遭遇した「Multiple GoTrueClient instances detected in the same browser context.」という警告メッセージは、Supabase Auth(GoTrueClient)が同一ブラウザコンテキスト内で複数回初期化され、同じストレージキーを同時に操作しようとしていることを示しています
reddit.com
。
真のニーズは、認証セッションの安定性を確保し、予期せぬ未定義動作(セッションの即時破棄やリダイレクトなど)を防ぐことです。多くの開発時間を無駄にせず、堅牢なユーザー体験を提供するために、クライアントインスタンスの適切な管理と一元化が求められています。

分析と発見事項

  1. フレームワーク依存:
    • Next.js(App Router)/Nuxt.js などのモダンJSフレームワークでは、
      useSupabaseClient()
      や
      createClient
      を複数箇所で呼び出すと警告が発生しやすい
      reddit.com
      。
  2. バージョンとライブラリの変化:
    • 以前は
      @supabase/auth-helpers-nextjs
      が5種類のクライアント生成関数を提供していたが、最新版のβ版
      @supabase/ssr
      では「2種類」に集約され、重複生成リスクを軽減している
      zenn.dev
      。
  3. 環境差異:
    • Vercelのプレビュー環境では、ログイン直後にセッションが削除されリダイレクトされる事象が報告されているが、本番環境では正常動作する
      vercel.com
      。これはプレビュー/本番でのCookie設定や内部最適化の差異を示唆する。
  4. セッション管理の相関:
    • 複数インスタンスがCookieやローカルストレージのJWTアクセストークン/リフレッシュトークンを同時に読書きしようとすると、競合により認証状態が不安定化する。

より深い分析と解釈

  1. なぜ複数インスタンスが生成されるか?
    • 各コンポーネント/ルートで
      createClient
      やフックを直書きし、中央管理されていないため。
  2. なぜ中央管理がされていないか?
    • 旧ライブラリ時代のサンプルコードに倣い、場当たり的な初期化を行っている。新ライブラリへの移行が追いついていない。
  3. なぜ移行が進まないか?
    • @supabase/ssr
      がβ版であることへの抵抗感や、既存コードの改修コストを懸念しているため。
代替解釈として、Vercelプレビュー固有のキャッシュ・最適化処理がSSR/CSRの切り替えと衝突している可能性も考えられます。また、
Secure
属性や
sameSite
などCookieの細かな設定差異がセッション継続に影響しているケースも否定できません。

戦略的示唆

短期的対応
  1. クライアント生成をユーティリティモジュールに集約し、シングルトンパターンを徹底する。
  2. Next.jsであれば
    @supabase/ssr
    の
    createBrowserClient
    /
    createServerClient
    を1箇所に定義しインポートして利用する
    zenn.dev
    。
  3. Vercelプレビュー環境では、Cookieの
    secure
    属性を開発用に
    false
    、本番用に
    true
    で切り替える設定を追加する
    zenn.dev
    。
中長期的戦略
  • 全プロジェクトで
    @supabase/ssr
    への移行を完了し、旧
    auth-helpers-nextjs
    を廃止。
  • Nuxt3では専用プラグインを作成し、
    useSupabaseClient
    をラップして単一インスタンスを提供。
  • 認証ミドルウェアを導入し、リクエストごとにセッションをリフレッシュして安定化させる。
リスク管理とモニタリング
  • 「Multiple GoTrueClient」警告をログ集約ツールで検出し、アラートを設定。
  • 定期的にSupabaseライブラリの更新情報をレビューし、クライアント生成ロジックを見直す。

今後の調査の提案

  • Next.js + Supabase SSR移行のベストプラクティス検証
  • Nuxt3環境におけるSupabaseクライアント一元管理プラグインの設計
  • Vercelプレビュー環境と本番環境のCookie/セッション管理差異の詳細調査
  • Supabase Auth のCookie属性(sameSite, secure, httpOnly)最適設定ガイドライン策定
  • PKCEフロー実装の安全性および脆弱性検証
  • AIコーディングツール(Lovable等)生成コードに潜む認証脆弱性の分析
  • 継続的モニタリング:警告検出→自動アラートシステム開発

📖 レポートに利用された参考文献

検索結果: 4件追加のソース: 0件チャット: 1件

42件の参考文献から5件の情報を精査し、約25,000語の情報を整理しました。あなたは約3時間の調査時間を削減したことになります🎉

調査された文献
42件
精査された情報
5件
整理された情報量
約25,000語
削減された時間
約3時間

🏷 Multiple GoTrueClient警告とは何か

Multiple GoTrueClient instances detected in the same browser context
this happens because you have multiple supabase client instances throughout your application. it could be in one of your components or layouts ...
reddit.comreddit.com
調査のまとめ
#### 回答 「Multiple GoTrueClient instances detected in the same browser context.」というメッセージは、アプリケーション内で...

🏷 警告が発生する具体的な状況と影響

Session handling in v0 Previews - Vercel Community
Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined ...
vercel.comvercel.com
Lovableにめっちゃイライラしてる - Reddit
認証問題を解決するために、Supabaseクライアントインスタンスを統合して、集中的な修正を実装します。 ... それから、解決策を Lovable にコピペすると、 ...
reddit.comreddit.com

🏷 推奨されるSupabaseクライアントの設計と管理方法

Supabase Auth を Next.js の App router で使用する
#### Supabase Auth を Next.js の App router で使用する この要約では、Next.js の App Router で Supabase Auth を使用する方法について詳しく説明します。使用されたライブラリのバージョンは以下の通りです。 - next: 14.0.4 - @supabase/ssr: 0.0.10 - @supabase/supabase-js: 2.39.0 Supabase Auth の公式ドキュメントは [https://supabase.com/docs/guides/auth](https://supabase.com/docs/guides/auth) で参照できます。 Next.js App Router で Supabase Auth を使用したサンプルリポジトリは、[https://github.com/vercel/next.js/tree/canary/examples/with-supabase](https://github.com/vercel/next.js/tree/canary/examples/with-supabase) にあります。 #### 推奨されるライブラリとクライアントの作成 Supabase が Next.js で使用するために提供するライブラリは2つあり、公式には `@supabase/ssr` が推奨されています。サーバー側の言語やフレームワークで Supabase を使用する場合、ユーザーセッションの保存に Cookie を使用するように Supabase クライアントを構成することが重要であり、`@supabase/ssr` パッケージがこのプロセスを簡素化します。このパッケージは現在ベータ版であり、API はまだ不安定な可能性があります。 `@supabase/ssr` をインストールするには、`npm install @supabase/ssr` を実行します。このライブラリを使用して Supabase クライアントを作成すると、Cookie を使用するように自動的に構成され、ユーザーセッションが Next.js スタック全体(クライアント、サーバー、App Router、Pages Router)で利用可能になります。 以前の `@supabase/auth-helpers-nextjs` では、以下のような5つのクライアントが提供されていました。 - `createClientComponentClient`: クライアントコンポーネント用 - `createServerComponentClient`: サーバーコンポーネント用 - `createServerActionClient`: サーバーアクション用 - `createRouteHandlerClient`: ルートハンドラー用 - `createMiddlewareClient`: ミドルウェア用 これに対して、`@supabase/ssr` では以下の2つにまとめられ、見通しが改善されています。 - `createBrowserClient`: クライアントコンポーネント用 - `createServerClient`: サーバーコンポーネント、サーバーアクション、ルートハンドラー、ミドルウェア用 詳細については、[https://supabase.com/docs/guides/auth/server-side/creating-a-client?environment=client-component](https://supabase.com/docs/guides/auth/server-side/creating-a-client?environment=client-component) を参照してください。 #### アクセストークンとリフレッシュトークン Supabase Auth で認証すると、主に以下の2つが発行されます。 - JWT 形式のアクセストークン - リフレッシュトークン アクセストークンは `header`, `payload`, `署名` の3つの部分から構成されるJWT形式です。アクセストークンの有効期間は短く設計されており、リフレッシュトークンは期限切れになることはなく、一度しか使用できません。リフレッシュトークンを交換することで、新しいアクセストークンとリフレッシュトークンのペアを取得できます。 得られたアクセストークンと、クライアント側から Supabase API ゲートウェイをパスするために使用されるJWTである `anon key` を組み合わせて、Supabase の API にアクセスできます。このあたりの情報は [https://supabase.com/docs/learn/auth-deep-dive/auth-deep-dive-jwts](https://supabase.com/docs/learn/auth-deep-dive/auth-deep-dive-jwts) にまとめられています。 アクセストークンの Payload には、ユーザーID (`sub`)、メールアドレス (`email`)、ロール (`role`)、セッションID (`session_id`) などのデータが格納されています。 発行された JWT やリフレッシュトークンは、ブラウザ側では Cookie に保存されます。Supabase クライアントを使用する際には、この Cookie と `anon_key` を合わせて送信するように構成されています。 #### Cookieのデフォルト設定とセキュリティ Cookie のデフォルトオプションは以下の通りです。 ```javascript const DEFAULT_COOKIE_OPTIONS = { path: "/", sameSite: "lax", httpOnly: false, maxAge: 60 * 60 * 24 * 365 * 1e3 }; ``` Supabase 公式では、`HttpOnly` を `true` にする必要はないと示しています [https://supabase.com/docs/guides/auth/server-side-rendering#how-do-i-make-the-cookies-httponly-](https://supabase.com/docs/guides/auth/server-side-rendering#how-do-i-make-the-cookies-httponly-)。しかし、`Secure` 属性は設定したいと考えるでしょう。クライアントの初期化時に、プロダクション環境でのみ `secure: true` となるように設定することが可能です。 #### クライアントユーティリティとミドルウェア Quick Start ガイドでは、以下のようにクライアントユーティリティが整備されています。 - サーバーコンポーネント用の `createServerClient` (cookies を使用) - ミドルウェア用の `createServerClient` (request を使用) - ブラウザコンポーネント用の `createBrowserClient` ミドルウェアは、サーバーコンポーネントが読み込まれる前にトークンのリフレッシュを行うために利用されます。これは、セッション管理において重要な役割を果たします。ミドルウェアの実装例は以下の通りです。 ```javascript import { type NextRequest } from 'next/server' import { createClient } from '@/utils/supabase/middleware' export async function middleware(request: NextRequest) { const { supabase, response } = createClient(request) // Refresh session if expired - required for Server Components // https://supabase.com/docs/guides/auth/auth-helpers/nextjs#managing-session-with-middleware await supabase.auth.getSession() return response } export const config = { matcher: [ /* * Match all request paths except for the ones starting with: * - _next/static (static files) * - _next/image (image optimization files) * - favicon.ico (favicon file) * Feel free to modify this pattern to include more paths. */ '/((?!_next/static|_next/image|favicon.ico).*)', ], } ``` #### PKCE (Proof Key for Code Exchange) の導入 Supabase Auth では、認可コードフローとして OAuth 2.0 の拡張仕様である PKCE を含めた方法を推奨しています。PKCE をサポートしている Supabase Auth のメソッドは以下の通りです。 - `signInWithOtp` - `signInWithOAuth` - `signUp` - `resetPasswordForEmail` `signUp` 関数の実装は GoTrue の中にあり、`flowType === 'pkce'` の場合に PKCE のフローの処理が追加されます。Supabase Auth は GoTrue を使用して構築されています。 `signUp` メソッド内で `code_verifier` と `code_challenge` が作成され、これらは Supabase の `auth` スキーマの `flow_states` テーブルに保存されます。サインアップ時にはコールバックURLが渡され、ユーザーがリダイレクトされます。 コールバックURLにリダイレクトされると、クエリパラメータで渡される `code` を抽出し、必要な `code_verifier` などを添えてアクセストークンを要求するリクエストが出されます。これにより、Supabase Auth 側で検証がOKであればアクセストークン等が提供されます。 PKCE は、認可コードが横取りされてしまった場合でも安全性を保つために導入されており、「認可コードのリクエスト主と、アクセストークンのリクエスト主が同じであること」を、リクエスト主しか知りえない値で検証するというアイデアに基づいています。
zenn.devzenn.dev

🏷 Vercelプレビュー環境でのセッション問題事例

Session handling in v0 Previews - Vercel Community
Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined ...
vercel.comvercel.com

🏷 認証トークン管理とセキュリティのポイント

調査のまとめ
#### 回答 「Multiple GoTrueClient instances detected in the same browser context.」というメッセージは、アプリケーション内で...

📖 レポートに利用されていない参考文献

検索結果: 15件追加のソース: 0件チャット: 0件
supabase/gotrue-js - UNPKG
... GoTrueClient.nextInstanceID += 1 if (this.instanceID > 0 && isBrowser()) { console.warn( 'Multiple GoTrueClient instances detected in the same browser context.
unpkg.comunpkg.com
Multiple GoTrueClient instances detected in the same browser context
Welcome to Mixible, your go-to source for comprehensive and informative content covering a broad range of topics from Stack Exchange ...
youtube.comyoutube.com
Multiple GoTrueClient instances detected in the same browser context
It is not an error, but this should be avoided as it may produce undefined behavior when used concurrently under the same storage key. I can't ...
stackoverflow.comstackoverflow.com
Improve module supabaseClient/GoTrueClient handling, session ...
A warning message when using the nuxt supabase module: Multiple GoTrueClient instances detected in the same browser context. like mention in ...
github.comgithub.com
Multiple GoTrueClient instances detected in the same browser context
May ganitong error, ginamit ang useSupabaseUser at useSupabaseClient nang sabay. solusyon: inalis ang useSupabaseUser at kinuha ang user gamit ...
reddit.comreddit.com
createClient pattern lacks of extensibility with multi-schema usage ...
Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined behavior ...
github.comgithub.com
Multiple GoTrueClient instances detected in the same browser context.
I am getting this error log in the client (see screenshot) these frames point to the usesupabase composable file as well as the page component ...
answeroverflow.comansweroverflow.com
supabase - ERROR: Multiple GoTrueClient instances detected in the ...
에러 핸들링 · 문구를 해석해보자면 '에러는 아니지만 client instance가 여러 개가 감지되었고, 이는 가급적 지양해야 할 행동이다' 쯤으로 해석됨 · 쉽게 ...
velog.iovelog.io
Issue with nuxt.js auth example with gotrue-js regression · Issue ...
github.comgithub.com
Is there any way to go around cors? - Ask us anything - WeWeb ...
weweb.ioweweb.io
any idea how to fix these : r/Supabase
reddit.comreddit.com
Upstream regression? Issue with `useSupabaseUser` related to ...
github.comgithub.com
manner9945 (송현섭 ) / 작성글 - velog
velog.iovelog.io
Hono, TanStack Query練習 - Zenn
console.log が出ないのは、編集したファイルが実行時に反映されていないか、ログ設定の問題です。 LocalStorageに保存されないのは、認証がサーバーサイドで行われ、 ...
zenn.devzenn.dev
pythonで遺伝的アルゴリズム(GA)を実装して巡回セールスマン問題 ...
qiita.comqiita.com

📊 ドメイン統計

参照ドメイン数: 11引用済み: 3総文献数: 42
1
Favicon for https://reddit.comreddit.com
引用: 2件/ 総数: 4件
引用率: 50.0%
2
Favicon for https://zenn.devzenn.dev
引用: 1件/ 総数: 19件
引用率: 5.3%
3
Favicon for https://vercel.comvercel.com
引用: 1件/ 総数: 1件
引用率: 100.0%
4
Favicon for https://github.comgithub.com
引用: 0件/ 総数: 7件
引用率: 0.0%
5
Favicon for https://youtube.comyoutube.com
引用: 0件/ 総数: 3件
引用率: 0.0%
6
Favicon for https://velog.iovelog.io
引用: 0件/ 総数: 3件
引用率: 0.0%
7
Favicon for https://unpkg.comunpkg.com
引用: 0件/ 総数: 1件
引用率: 0.0%
8
Favicon for https://stackoverflow.comstackoverflow.com
引用: 0件/ 総数: 1件
引用率: 0.0%
9
Favicon for https://answeroverflow.comansweroverflow.com
引用: 0件/ 総数: 1件
引用率: 0.0%
10
Favicon for https://weweb.ioweweb.io
引用: 0件/ 総数: 1件
引用率: 0.0%
11
Favicon for https://qiita.comqiita.com
引用: 0件/ 総数: 1件
引用率: 0.0%

新しいテーマを調査する

運営会社サービス概要メディア
  • 📜要約
  • 📊ビジュアライズ
  • 🖼関連する画像
  • 🔍詳細
    • 🏷Multiple GoTrueClient警告とは何か
    • 🏷警告が発生する具体的な状況と影響
    • 🏷推奨されるSupabaseクライアントの設計と管理方法
    • 🏷Vercelプレビュー環境でのセッション問題事例
    • 🏷認証トークン管理とセキュリティのポイント
  • 🖍考察
  • 📚参考文献
    • 📖利用された参考文献
    • 📖未使用の参考文献
    • 📊ドメイン統計