TL;DR
En offentlig bucket leverer hver fil i den til alle, der har URL’en, uden nøgle og uden login: dine storage-policies bliver ikke spurgt ved downloads. På min lokale stack returnerede den samme testfil 200 med indhold fra en offentlig bucket og 400 fra en privat. Upload, sletning og flytning går stadig gennem policies. Brug offentlige buckets til filer, der er offentlige af natur, som avatarer og artikelbilleder, og private buckets med signerede URL’er til alt andet.
Mit gratis Supabase-sikkerhedstjek har to regler om buckets: “Offentlige storage-buckets” lister dem, så du kan bekræfte, at hver enkelt skal være offentlig, og “Offentlige buckets uden upload-grænser” flagger offentlige buckets uden grænse for størrelse eller filtype. Her er, hvad det offentlige flag faktisk ændrer.
Hvad betyder en offentlig bucket i Supabase?
Supabases guide til buckets definerer to adgangsmodeller. I en privat bucket går hver handling, downloads inklusive, gennem RLS-policies på storage.objects; en fil læses med brugerens token eller en signeret URL, der udløber. I en offentlig bucket omgår hentning og levering af filer adgangskontrollen, så alle med URL’en kan læse filen. Adgangskontrollen gælder stadig for upload, sletning, flytning og kopiering.
Buckets er private som standard. En bucket bliver offentlig, når nogen sætter hak i Dashboard eller opretter den med public: true, hvilket er en almindelig genvej, når et billede ikke vil indlæses.
Hvad returnerede hver bucket i min test?
På en lokal Supabase-stack (CLI 2.109.1) oprettede jeg én offentlig og én privat bucket, uploadede den samme lille tekstfil til begge med secret key og hentede den derefter uden nogen nøgle, som en fremmed med linket ville gøre:
Anmodning om 2026/invoice-001.txt |
Offentlig bucket | Privat bucket |
|---|---|---|
/storage/v1/object/public/…, ingen nøgle |
200, filindhold |
400, “Bucket not found” |
/storage/v1/object/authenticated/…, kun publishable key |
200 |
400 |
Den private bucket svarer, som om den ikke fandtes, og det er det, du vil have. Den offentlige udleverer filen til alle, der kan gætte eller finde stien.
Hvorfor betyder URL’en så meget?
En offentlig fil er kun så hemmelig som sin sti. Stier er ofte forudsigelige: et bruger-id, en dato, et fakturanummer. De lækker også gennem sidens kildekode, delte links, browserhistorik og logs. En faktura, et passcan eller en underskrevet kontrakt i en offentlig bucket er reelt offentliggjort.
Hvordan vælger og retter du det?
- Offentlig bucket: filer til alle, som avatarer, produktfotos og blogbilleder. Sæt en grænse for filstørrelse og tilladte MIME-typer på bucketen, så den offentlige upload-sti, som dine policies tillader, ikke kan bruges til at hoste andet.
- Privat bucket: dokumenter, eksporter, fakturaer, alt personligt. Download med brugerens session, eller opret en signeret URL, der udløber.
Sådan ser du dine buckets og deres grænser:
select id, public, file_size_limit, allowed_mime_types
from storage.buckets
order by public desc, id;
En privat bucket kræver også policies på storage.objects, som regel med et tjek af, at stiens første mappe er brugerens eller virksomhedens id. Tæl de policies efter en projektflytning: i én app fejlede hver upload, fordi policy-migreringen aldrig blev kørt, hvilket jeg skrev om i min sikkerhedstjekliste til Lovable-apps. Hvad ellers publishable key kan nå, står i Supabase anon key vs service role key.