နားလည်ထားရမယ့် အချက်
Supabase ရဲ့ ပုံသဏ္ဌာန်: အဓိကမှာ standard Postgres database ရှိပြီး Supabase က schema ကနေ တိုက်ရိုက် API generate လုပ်ပေးလို့ basic CRUD အတွက် backend layer ကိုယ်တိုင်ရေးစရာမလိုပါ။
- ပေါင်းစည်းထားသော service အနေနဲ့ Authentication
- Policy-based access ပါသော File storage
- Database change များကို Realtime subscription
- Custom logic အတွက် Serverless function
Architecture: Frontend/Backend -> Supabase, row-level security ပါသော Postgres database, Auth, Storage ဆီ ကွဲထွက်သွားပါတယ်။
Row-level security ဆိုတာ request တောင်းဆိုသူ ဘယ်သူလဲဆိုတာအပေါ်မူတည်ပြီး database ကိုယ်တိုင်က row ဘယ်တွေကို ကြည့်ခွင့်/ပြင်ခွင့်ရှိသလဲ enforce လုပ်ခြင်းဖြစ်ပြီး application code က ဘာပြမလဲ ဆုံးဖြတ်ခြင်း တစ်ခုတည်းမဟုတ်ပါ။
ဒါနှင့်အတူ တကယ့် critical ခွဲခြားချက်တစ်ခု ရှိပါတယ် -- client-accessible key တွေကို row-level security က ကန့်သတ်ထားပြီး server-only secret key တွေကတော့ ဒါကို လုံးဝ ကျော်လွှားနိုင်ပါတယ်။
- Row-Level Security
- Query တစ်ခုကို ဘယ်သူတောင်းဆိုသလဲဆိုတာအပေါ်မူတည်ပြီး row တစ်ခုချင်းစီအလိုက် access rule ကို database level မှာ enforce လုပ်ပေးတဲ့ security feature ဖြစ်ပြီး application code သာမက database ကိုယ်တိုင်က query တစ်ခုက ဘယ် row တွေကို မြင်နိုင်/ပြောင်းလဲနိုင်လဲဆိုတာကို ထိန်းချုပ်ပေးသည်။
SUPABASE ARCHITECTURE
---------------------
+----------------------------+
| Supabase |
Frontend / Backend ->| Postgres DB (Row-Level |
| Security) | Auth | Storage |
+----------------------------+လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Client-accessible key ကို frontend code ထဲ ထားလို့ ရတာက row-level security policy တွေက ဒါနဲ့ ကြည့်/ပြောင်းနိုင်တာကို ကန့်သတ်ပေးလို့ပါ -- policy မှန်ကန်စွာ configure ထားမှသာ ဖြစ်ပါတယ်။
Service-role (သို့) secret key ကတော့ policy အားလုံးကို လုံးဝကျော်လွှားပြီး authorization check ကိုယ်တိုင်လုပ်ပြီးသား trusted server-side code အတွက်သာ ရည်ရွယ်ပါတယ်။
ပိတ်ထားခြင်းဖြင့် စတင်ပါ
Table အသစ်တိုင်းရဲ့ default access ကို client-accessible key ဘယ်ဟာအတွက်မဆို ပိတ်ထားပါ။
တိကျသော policy ရေးပါ
ဘယ်သူက row ဘယ်ဟာတွေကို select/insert/update/delete လုပ်ခွင့်ရှိလဲ တိတိကျကျ ဖော်ပြတဲ့ row-level security policy ထည့်ပါ။
နယ်နိမိတ်ကို စမ်းသပ်ပါ
ဝင်ရောက်ခွင့်မရှိသင့်တဲ့ data ကို တမင်တကာ ဝင်ကြည့်ကြည့်ပြီး policy က တကယ်ပိတ်ပေးလားစစ်ပါ။
Dashboard specific တွေ ပြောင်းလဲနေတဲ့အတွက် ရေရှည်တည်တံ့မယ့် practice ကတော့ ဖွင့်ထားပြီး ဘာမှမပေါ်ပါစေနဲ့လို့ မျှော်လင့်တာအစား ပိတ်ထားခြင်းဖြင့် စပြီး တမင်တကာ ဖွင့်ခြင်းပါပဲ။
Client-accessible key တွေက server secret မဟုတ်ပါ
Browser အသုံးပြုရန် ရည်ရွယ်ထားသော key (row-level security ကဲ့သို့ security policy များဖြင့် ကန့်သတ်ထားသည်) နှင့် server-only secret key (ထိုကန့်သတ်ချက်များကို ကျော်လွှားနိုင်သည်) တို့သည် အပြန်အလှန် အစားထိုးလို့မရပါ။ Server-only secret ကို browser-exposed code ထဲတွင် အသုံးပြုခြင်းသည် တကယ့် security risk ကြီးတစ်ခု ဖြစ်ပြီး visitor မှန်သမျှကို database အပြည့်အဝ ဝင်ရောက်ခွင့် ပေးလိုက်နိုင်ပါတယ်။
အတူတူ စမ်းရေးကြည့်မယ်
function checkKeyUsage(usage) {
const { keyType, context } = usage;
const risky = keyType === "service-role" && context === "browser";
return risky ? "RISKY: service-role key exposed to browser" : "safe";
}
const scenarios = [
{ label: "anon key in frontend JS", keyType: "public-anon", context: "browser" },
{ label: "service-role key in frontend JS", keyType: "service-role", context: "browser" },
];
for (const s of scenarios) {
console.log(`${s.label} -> ${checkKeyUsage(s)}`);
}anon key in frontend JS -> safe
service-role key in frontend JS -> RISKY: service-role key exposed to browser
(anon key ကို row-level security က ကန့်သတ်ထားပြီး service-role key ကတော့ ကန့်သတ်ချက်အားလုံး ကျော်လွှားနိုင်တာကြောင့် risky ဖြစ်သည်။)၅ မိနစ် စမ်းကြည့်
Private user note များ သိမ်းထားတဲ့ table တစ်ခုအတွက် user တစ်ဦးက သူ့ note ကိုသာ မြင်နိုင်ဖို့ row-level security policy က ဘာပြောရမလဲ ရိုးရှင်းစွာ ဖော်ပြပါ။
သတိလေးတစ်ချက်
Table တစ်ခုရဲ့ row-level security ကို configure မလုပ်ဘဲ (သို့) disable လုပ်ထားပြီး client-accessible key ကို ဖွင့်ထားခြင်း -- visitor မှန်သမျှ row အားလုံးကို ဖတ်/ပြောင်းနိုင်စေခြင်း။
Service-role (သို့) secret key ကို frontend code ထဲ ထည့်ထားခြင်း -- row-level security protection အားလုံးကို လုံးဝ ကျော်လွှားစေခြင်း။
PostgreSQL Documentation: Row Security Policies — Cloud Providers & Platforms