Skip to content

[セキュリティ/改善] Supabase API キーを publishable key / secret key 形式へ移行する #59

Description

@otomatty

背景

#34.env.example の実 anon JWT を除去したが、Supabase は新しい API キー形式
(sb_publishable_* / sb_secret_*) を導入済みで、現行の anon / service_role
JWT は legacy 扱いになっている。新キー形式へ移行することで以下のメリットが得られる:

  • 不透明(opaque)な短い文字列 + チェックサム形式で、JWT 署名鍵から独立してローテーション可能
  • API キーのローテーションがユーザーセッション JWT を無効化しない(署名鍵は別レイヤ)
  • 公式 Next.js quickstart も NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY を既に採用

参考ドキュメント

対応スコープ

1. 環境変数の rename

NEXT_PUBLIC_SUPABASE_ANON_KEY NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
SUPABASE_SERVICE_ROLE_KEY SUPABASE_SECRET_KEY

Secret key は NEXT_PUBLIC_ プレフィックスを付けずサーバー専用とする(ブラウザに露出させない)。

2. コード変更対象(環境変数参照のみ差し替え)

@supabase/ssrcreateBrowserClient / createServerClient および
@supabase/supabase-jscreateClient の API 自体は不変。第二引数に渡す
環境変数名を差し替えるだけで動作する。

  • src/lib/supabase/config.ts
  • src/lib/supabase/client.ts
  • src/lib/supabase/server.ts
  • src/lib/supabase/middleware.ts
  • src/lib/supabase/db.ts
  • src/lib/supabase/admin.tsSUPABASE_SERVICE_ROLE_KEYSUPABASE_SECRET_KEY
  • src/types/env.d.ts
  • .env.example

3. OSS sync スクリプトの更新

  • scripts/oss-sync/prepare-oss-package.jsprepareEnvExample()
    (行 106-121 付近)にハードコードされている .env.example テンプレートを
    新キー名へ更新。

4. README.md の説明文更新

  • 行 62-63 の説明文「Supabase の Anonymous Key」を
    「Supabase の Publishable Key」に更新。
  • 新キーの取得手順(Project Settings → API Keys または Connect ダイアログ)
    へのリンクを追記。

移行手順

  1. Supabase ダッシュボード Project Settings → API Keys で Publishable / Secret
    キーを発行(または既存の値を取得)。
  2. 上記コード群を新環境変数名へ差し替え。
  3. 本番 / プレビュー環境(Vercel 等)の環境変数を新名へ更新。
  4. .env.example を新名へ更新(OSS sync テンプレートも合わせて更新)。
  5. README.md の手順を更新。
  6. 動作確認: ローカル bun dev でログイン、middleware、admin(Service Role 系)
    の各経路を通す。

後方互換性

Supabase 側で新旧キーは同時受け付け(Kong gateway 経由)のため段階移行可能。
ただし本リポジトリではコード上のキー名一本化が望ましいため、フラグデー方式で
一括切り替えを推奨。

参照

優先度

Medium — 即時の漏洩リスクは #34 で除去済み。legacy key が正式に廃止される前に
マイグレーションを完了させる。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions