---
title: "Supabase public bucket : qui peut lire vos fichiers"
description: "Ce que change un bucket Supabase Storage public, ce que mon test local a renvoyé pour un bucket public et un privé, et quand utiliser lequel."
url: "https://madsalt.tech/fr/notes/supabase-public-bucket/"
author: "Denys Zaichenko"
author_url: "https://madsalt.tech/fr/about/"
language: "fr"
published: 2026-11-04
---

# Supabase public bucket : qui peut lire vos fichiers

En bref

Un bucket public sert chaque fichier qu'il contient à quiconque a l'URL, sans clé ni connexion : vos politiques de storage ne sont pas consultées pour les téléchargements. Sur mon stack local, le même fichier de test a renvoyé `200` avec son contenu depuis un bucket public et `400` depuis un bucket privé. Les envois, suppressions et déplacements passent toujours par les politiques. Réservez les buckets publics aux fichiers publics par nature, comme les avatars et les images d'articles, et utilisez des buckets privés avec des signed URLs pour le reste.

Mon [audit de sécurité Supabase](https://madsalt.tech/fr/tools/supabase-security-check/) gratuit a deux règles sur les buckets : « Buckets de storage publics » les liste pour que vous confirmiez que chacun doit bien être public, et « Buckets publics sans limites d’upload » signale les buckets publics sans limite de taille ni de type de fichier. Voici ce que l'indicateur public change réellement.

## Que signifie un bucket public dans Supabase ?

Le [guide des buckets](https://supabase.com/docs/guides/storage/buckets/fundamentals) de Supabase définit deux modèles d'accès. Dans un bucket privé, chaque opération, téléchargements compris, passe par des politiques RLS sur `storage.objects` ; un fichier se lit avec le jeton de l'utilisateur ou une signed URL qui expire. Dans un bucket public, la récupération et la diffusion des fichiers contournent le contrôle d'accès : toute personne qui a l'URL peut lire le fichier. Le contrôle d'accès s'applique toujours à l'envoi, à la suppression, au déplacement et à la copie.

Les buckets sont privés par défaut. Un bucket devient public quand quelqu'un coche la case dans le Dashboard ou le crée avec `public: true`, un raccourci courant quand une image ne s'affiche pas.

## Que renvoyait chaque bucket dans mon test ?

Sur un stack Supabase local (CLI 2.109.1), j'ai créé un bucket public et un bucket privé, envoyé le même petit fichier texte dans les deux avec la secret key, puis demandé ce fichier sans aucune clé, comme le ferait un inconnu avec le lien :

![Le même fichier, demandé sans clé. Supabase Storage local, un bucket public et un bucket privé. Bucket public: Requête, sans clé → bucket public → 200, fichier servi; Bucket privé: Requête, sans clé → bucket privé → 400, introuvable.](https://madsalt.tech/charts/fr/supabase-public-bucket.svg)

*Ma reproduction sur un stack Supabase local, 23 octobre 2026.*

| Requête pour `2026/invoice-001.txt`                         | Bucket public             | Bucket privé                |
| ----------------------------------------------------------- | ------------------------- | --------------------------- |
| `/storage/v1/object/public/…`, sans clé                     | `200`, contenu du fichier | `400`, « Bucket not found » |
| `/storage/v1/object/authenticated/…`, publishable key seule | `200`                     | `400`                       |

Le bucket privé répond comme s'il n'existait pas, ce qui est voulu. Le public remet le fichier à quiconque devine ou trouve le chemin.

## Pourquoi l'URL compte-t-elle autant ?

Un fichier public n'est secret que dans la mesure où son chemin l'est. Les chemins sont souvent prévisibles : un identifiant d'utilisateur, une date, un numéro de facture. Ils fuient aussi par le code source des pages, les liens partagés, l'historique du navigateur et les logs. Une facture, un scan de passeport ou un contrat signé dans un bucket public est en pratique publié.

## Comment choisir et corriger ?

- **Bucket public :** les fichiers destinés à tout le monde, comme les avatars, les photos de produits et les images de blog. Définissez sur le bucket une limite de taille et les types MIME autorisés, pour que le chemin d'envoi public qu'ouvrent vos politiques ne serve pas à héberger autre chose.
- **Bucket privé :** documents, exports, factures, tout ce qui est personnel. Téléchargez avec la session de l'utilisateur, ou créez une signed URL qui expire.

Pour voir vos buckets et leurs limites :

```sql
select id, public, file_size_limit, allowed_mime_types
from storage.buckets
order by public desc, id;
```

Un bucket privé a aussi besoin de politiques sur `storage.objects`, qui vérifient en général que le premier dossier du chemin est l'identifiant de l'utilisateur ou de l'entreprise. Après avoir déplacé un projet, comptez ces politiques : sur une application, tous les envois échouaient parce que la migration des politiques n'avait jamais tourné, ce que j'ai raconté dans ma [checklist de sécurité d'une application Lovable](https://madsalt.tech/fr/blog/lovable-app-security-checklist/). Ce que la publishable key peut atteindre d'autre est dans [Supabase anon key vs service role key](https://madsalt.tech/fr/blog/supabase-anon-key-vs-service-role-key/).
