Supabaseとは?機能・料金・RLS(行単位のアクセス制御)の仕組みとFirebaseとの違い【2026年】

Supabase(スーパベース)とは、アプリのバックエンド(データベース、ログイン機能、ファイル置き場など)をまとめて用意してくれるサービスです。中心にあるのは本物のPostgreSQLで、テーブルを作るだけで、ブラウザやスマホアプリから読み書きできるAPIが自動で使えるようになります。オープンソースで、Firebaseの代わりとしてよく比べられます。

便利な一方で、Supabaseには「行単位のアクセス制御(RLS)」を正しく設定しないと、データが誰にでも見えてしまうという落とし穴があります。この記事では、Supabaseでできること、2026年10月時点の料金、Firebaseとの違い、始め方に加えて、RLSがどう働くかを、手元のPostgreSQLで実際に動かして確かめた結果で解説します。

この記事の確認方法(2026年10月6日時点)

  • 料金、機能、APIキーの変更は、Supabaseの公式サイト(料金ページ・ドキュメント)で確認しました。料金は米ドルです
  • RLSの動作は、Supabaseのアカウントは使わず、手元のPostgreSQL 17.11にSupabaseと同じ仕組み(役割と auth.uid())を再現して確かめました。SQLと結果はそのまま載せています

Supabaseとは?機能・料金・RLSの仕組みとFirebaseとの違い

Supabaseとは

アプリを作るには、画面(フロントエンド)のほかに、データを保存するデータベース、ログインの仕組み、画像などのファイル置き場、それらを外から使うためのAPIが必要です。これらをまとめて提供するサービスをBaaS(Backend as a Service)と呼びます。Supabaseはその1つで、サーバーを自分で用意しなくても、アプリの裏側をすぐに用意できます。

Supabaseの特徴は、データベースがPostgreSQLそのものであることです。SQLがそのまま使え、テーブルの結合や集計、拡張機能など、PostgreSQLの機能をすべて活かせます。ソースコードは公開されていて、自分のサーバーで動かすこともできます。

Supabaseでできること

機能 できること
Database プロジェクトごとにPostgreSQLを1つ用意。バックアップ、拡張機能も使える
Auth メールとパスワード、パスワードなしのログイン、Google・GitHubなどのOAuth、スマホアプリのログイン
Storage 画像や動画などの大きなファイルを保存・変換・配信。データベースと同じRLSで権限を決められる
Realtime データベースの変更をすぐに画面へ通知する。チャットや共同編集などに使う
Edge Functions 世界中に分散したサーバーでプログラム(TypeScript)を動かす。決済や外部APIとの連携に使う
データベースの拡張 AI向けのベクトル検索(AI & Vectors)、定期実行(Cron)、キュー(Queues)
API テーブルを作ると、REST APIとGraphQL APIが自動で使えるようになる

公式のクライアントライブラリは、JavaScript(React、Next.js、Vueなど)、Flutter、Swift、Kotlin、Pythonなどに対応しています。

Supabaseの料金(2026年10月時点)

プラン 月額 主な内容
Free 0ドル 月間アクティブユーザー5万人、データベース500MB、ファイル1GB、転送量5GB。1週間使わないと一時停止、動かせるプロジェクトは2つまで
Pro 25ドルから 月間アクティブユーザー10万人、データベース8GB、ファイル100GB、転送量250GB。超えた分は従量課金。毎日のバックアップ(7日分)、メールサポート。2つ目以降のプロジェクトは月10ドルから
Team 599ドルから Proの内容に加えて、SOC2・ISO 27001、管理画面のSSO、優先サポート、14日分のバックアップ
Enterprise 個別見積もり 専任のサポート担当、稼働率の保証など

個人の学習や試作ならFreeプランで十分ですが、1週間使わないとプロジェクトが一時停止するので、公開して使い続けるアプリには向きません。人に使ってもらうアプリを公開するなら、Proプランが現実的です。最新の料金は公式の料金ページで確認してください。

Supabaseの安全のかなめ「RLS」

Supabaseでは、ブラウザやスマホアプリがデータベースに直接問い合わせます。間にサーバーのプログラムがないので、「この人はこのデータを見てよいか」の判断を、データベース自身にさせる必要があります。それがPostgreSQLの行単位のアクセス制御(Row Level Security、RLS)です。

Supabaseでは、ログインしていない人は anon、ログインした人は authenticated という役割でデータベースにつながります。また、auth.uid() という関数で、今ログインしている人のIDがわかります。RLSのポリシー(規則)にこれを使うと、「自分の行だけ見られる」といった制御ができます。

手元のPostgreSQLで確かめてみた

Supabaseと同じ形(anon と authenticated の役割、ログイン情報からIDを読む auth.uid())を手元のPostgreSQL 17.11に作り、ToDoのテーブルでRLSを試しました。まず準備のSQLです。

-- Supabase と同じ形を手元の PostgreSQL で再現する(Supabase そのものではない)
-- Supabase では、ログインしていない人は anon、ログインした人は authenticated という役割でデータベースに入る
create role anon nologin;
create role authenticated nologin;

-- auth.uid():ログイン中のユーザーのIDを返す関数。
-- Supabase ではログイン時に発行される JWT の中身(request.jwt.claims)の sub を読む
create schema auth;
create function auth.uid() returns uuid language sql stable as $$
  select (nullif(current_setting('request.jwt.claims', true), '')::jsonb ->> 'sub')::uuid
$$;
grant usage on schema auth to anon, authenticated;

-- ToDo のテーブル。user_id には作った人のIDが自動で入る
create table public.todos (
  id      bigint generated always as identity primary key,
  user_id uuid not null default auth.uid(),
  title   text not null
);
grant select, insert, update, delete on public.todos to anon, authenticated;

-- 行単位のアクセス制御(RLS)を有効にして、ポリシーを作る
alter table public.todos enable row level security;

create policy "自分のToDoだけ見られる" on public.todos
  for select to authenticated
  using ((select auth.uid()) = user_id);

create policy "自分のToDoだけ追加できる" on public.todos
  for insert to authenticated
  with check ((select auth.uid()) = user_id);

-- テスト用のデータ(管理者として入れる。管理者は RLS の影響を受けない)
insert into public.todos (user_id, title) values
  ('11111111-1111-1111-1111-111111111111', 'Aさん:牛乳を買う'),
  ('11111111-1111-1111-1111-111111111111', 'Aさん:レポートを出す'),
  ('22222222-2222-2222-2222-222222222222', 'Bさん:歯医者の予約');

次に、立場を変えながらToDoを読み書きしてみます。set role で役割を切り替え、request.jwt.claims にログイン情報(誰としてログインしているか)を入れています。Supabaseでは、ここをログイン時に発行されるトークンから自動で設定してくれます。

\echo '--- 1. 管理者(RLSの影響を受けない)'
select title from public.todos order by id;

\echo '--- 2. ログインしていない人(anon)'
set role anon;
select title from public.todos order by id;
reset role;

\echo '--- 3. Aさんとしてログイン'
set role authenticated;
set request.jwt.claims = '{"sub": "11111111-1111-1111-1111-111111111111"}';
select title from public.todos order by id;

\echo '--- 4. Aさんが、Bさんのふりをして追加しようとする'
insert into public.todos (user_id, title)
  values ('22222222-2222-2222-2222-222222222222', 'いたずら');

\echo '--- 5. Aさんが自分のToDoを追加する(user_id は自動で入る)'
insert into public.todos (title) values ('Aさん:ジムに行く');
select title from public.todos order by id;

\echo '--- 6. Bさんとしてログイン'
set request.jwt.claims = '{"sub": "22222222-2222-2222-2222-222222222222"}';
select title from public.todos order by id;

実行結果です。

--- 1. 管理者(RLSの影響を受けない)
         title         
-----------------------
 Aさん:牛乳を買う
 Aさん:レポートを出す
 Bさん:歯医者の予約
(3 行)

--- 2. ログインしていない人(anon)
SET
 title 
-------
(0 行)

RESET
--- 3. Aさんとしてログイン
SET
SET
         title         
-----------------------
 Aさん:牛乳を買う
 Aさん:レポートを出す
(2 行)

--- 4. Aさんが、Bさんのふりをして追加しようとする
psql:02_demo.sql:16: ERROR:  new row violates row-level security policy for table "todos"
--- 5. Aさんが自分のToDoを追加する(user_id は自動で入る)
INSERT 0 1
         title         
-----------------------
 Aさん:牛乳を買う
 Aさん:レポートを出す
 Aさん:ジムに行く
(3 行)

--- 6. Bさんとしてログイン
SET
        title        
---------------------
 Bさん:歯医者の予約
(1 行)

同じ select 文なのに、立場によって返ってくる行が変わりました。

  • ログインしていない人には1件も見えない(anon 向けのポリシーがないため)
  • Aさんには自分の2件だけ、Bさんには自分の1件だけが見える
  • AさんがBさんのIDでToDoを追加しようとすると、new row violates row-level security policy(新しい行がRLSのポリシーに違反)というエラーで止められる
  • 自分のToDoを追加するときは、user_id にAさんのIDが自動で入る

アプリの側で「自分のデータだけを取る」という条件を書かなくても、データベースが絞り込んでくれる。これがSupabaseの安全の仕組みです。

RLSを有効にし忘れると全部見える

では、RLSを無効にしてしまうとどうなるでしょうか。

\echo '--- RLS を無効にしてしまった場合'
alter table public.todos disable row level security;
set role anon;
select title from public.todos order by id;
reset role;
alter table public.todos enable row level security;
--- RLS を無効にしてしまった場合
ALTER TABLE
SET
         title         
-----------------------
 Aさん:牛乳を買う
 Aさん:レポートを出す
 Bさん:歯医者の予約
 Aさん:ジムに行く
(4 行)

RESET
ALTER TABLE

ログインしていない人に、全員のToDoが見えてしまいました。Supabaseでは、ブラウザに置くAPIキーは誰でも読めるものなので、RLSのないテーブルは、事実上インターネットに公開されているのと同じです。Supabaseの管理画面のTable EditorでテーブルをRLSなしのまま使い続けたり、SQLでテーブルを作ってRLSを有効にし忘れたりしないよう注意してください。

2026年のAPIキーの変更

Supabaseは、これまでの anon キーと service_role キーを2026年末までに廃止すると公式ドキュメントで告知しています。代わりに使うのが次の2つです。

キー 形 使う場所 注意
publishable key sb_publishable_… ブラウザ、スマホアプリなど、利用者の手元で動くもの 誰でも読めるので、RLSで許した範囲にしか届かない
secret key sb_secret_… 自分のサーバー、Edge Functions、定期実行の処理 RLSを素通りするので、絶対に外に出さない

古い解説記事に出てくる anon キーと service_role キーは、それぞれpublishable keyとsecret keyに置き換わると考えてください。

Supabaseの始め方

  1. Supabaseの公式サイトでアカウントを作り、新しいプロジェクトを作る(データベースのパスワードと、サーバーの地域を選ぶ。日本向けなら東京)
  2. Table EditorかSQL Editorでテーブルを作り、RLSを有効にしてポリシーを書く
  3. プロジェクトの「Connect」の画面から、URLとpublishable keyを取得する
  4. アプリにクライアントライブラリを入れて、データを読み書きする

JavaScriptから読む例です(公式のクライアントライブラリ @supabase/supabase-js)。

import { createClient } from '@supabase/supabase-js'

// プロジェクトのURLと、公開してよい「publishable key」を使う
const supabase = createClient(
  'https://<プロジェクトID>.supabase.co',
  'sb_publishable_xxxxxxxx'
)

// ログインしている人のToDoだけが返ってくる(RLSで絞り込まれる)
const { data, error } = await supabase.from('todos').select('*')

Pythonから読む例です(公式のクライアントライブラリ supabase)。

from supabase import create_client

supabase = create_client("https://<プロジェクトID>.supabase.co", "sb_publishable_xxxxxxxx")
response = supabase.table("todos").select("*").execute()
print(response.data)

Supabaseの公式ドキュメントでは、Supabase CLIを使ってローカルで開発する方法や、AIのコーディングエージェントにセットアップを任せるための手順も案内されています。

Firebaseとの違い

Supabase Firebase
提供元 Supabase社。オープンソース Google
主なデータベース PostgreSQL(リレーショナル、SQL) Cloud Firestore(ドキュメント型、NoSQL)
権限の決め方 PostgreSQLのRLS(SQLで書く) セキュリティルール(独自の書き方)
自分のサーバーで動かす できる できない
得意なこと 表の結合や集計が多い業務アプリ、SQLに慣れたチーム スマホアプリ、Googleのサービスとの連携

なお、FirebaseにもCloud SQL for PostgreSQLを使うリレーショナルデータベースの機能があります(以前の名前はData Connect、現在はFirebase SQL Connect)。「SQLを使いたいからSupabase」という単純な比較ではなくなってきているので、使い慣れた道具や、作りたいアプリとの相性で選びましょう。

Supabaseが向いている人・向いていない人

向いている

  • SQLやPostgreSQLの知識を活かしたい人
  • 個人開発や試作で、バックエンドを素早く用意したい人
  • Next.jsなどのフロントエンドと組み合わせて、ログイン付きのWebアプリを作りたい人

向いていない・注意が必要

  • RLSを理解しないまま使う場合。データが丸見えになる危険がある
  • 常に動かし続けたいアプリを無料で公開したい場合(Freeプランは1週間で一時停止)
  • データベースに複雑な処理をたくさん書くことに抵抗がある場合

よくある質問

Q.Supabaseは無料で使えますか?

Freeプランは無料で、2つまでのプロジェクトを動かせます。ただし、1週間使わないと一時停止します。学習や試作には十分です。

Q.SQLを知らなくても使えますか?

Table Editorで表計算ソフトのようにテーブルを作れるので、最初はSQLなしでも始められます。ただ、RLSのポリシーはSQLの考え方で書くので、基本的なSQLは学んでおいたほうが安全です。

Q.APIキーをブラウザのコードに書いても大丈夫ですか?

publishable key(古い呼び方では anon キー)なら大丈夫です。もともと誰でも読める前提のキーで、RLSで許した範囲しか読み書きできません。secret key(古い呼び方では service_role キー)は、RLSを素通りするので、絶対にブラウザに置いてはいけません。

Q.Supabaseをやめたくなったらどうなりますか?

データベースは普通のPostgreSQLなので、データをそのまま取り出して、ほかのPostgreSQLに移せます。特定の会社の独自形式に閉じ込められにくいのは、Supabaseの利点の1つです。

まとめ

  • Supabaseは、PostgreSQLを中心に、ログイン、ファイル置き場、リアルタイム通知、サーバーレス関数をまとめて用意できるオープンソースのBaaS
  • 料金はFreeが0ドル(1週間で一時停止・2プロジェクトまで)、Proが月25ドルから
  • 安全のかなめはRLS。手元の検証では、同じSQLでも立場によって見える行が変わり、他人になりすました追加は止められた。RLSを有効にし忘れると、ログインしていない人に全部見える
  • 2026年末までに、APIキーは publishable key と secret key に切り替わる

Supabaseを使いこなすには、SQLとWebアプリの基本が欠かせません。テックジムの無料Python入門講座でプログラミングの基礎から始めて、AI駆動開発コースでAIと一緒にアプリを作るところまで進んでみてください。

関連記事


参考情報

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら