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とは
アプリを作るには、画面(フロントエンド)のほかに、データを保存するデータベース、ログインの仕組み、画像などのファイル置き場、それらを外から使うための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の始め方
- Supabaseの公式サイトでアカウントを作り、新しいプロジェクトを作る(データベースのパスワードと、サーバーの地域を選ぶ。日本向けなら東京)
- Table EditorかSQL Editorでテーブルを作り、RLSを有効にしてポリシーを書く
- プロジェクトの「Connect」の画面から、URLとpublishable keyを取得する
- アプリにクライアントライブラリを入れて、データを読み書きする
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社。オープンソース | |
| 主なデータベース | 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と一緒にアプリを作るところまで進んでみてください。
関連記事
- CloudflareとVercelを徹底比較|違い・料金・機能・使い分けをわかりやすく解説
- Cloudflareとは?わかりやすく解説|できること・無料プランの範囲・料金・使い方【2026年】
- Flaskとは?PythonでWebアプリを作る入門|インストール・ルーティング・フォーム・API・公開まで【Flask 3.1対応】
- Renderとは?料金・無料プランの制限・Pythonアプリの公開手順とつまずきやすいPORT設定【2026年】







