Nous travaillons sur une application web, où (entre autres fonctionnalités) nos utilisateurs peuvent télécharger leurs fichiers. Cependant, nous ne pouvons pas stocker ces fichiers sur notre VPS car l'espace de stockage est limité, nous avons donc décidé d'utiliser S3.
Le principal problème est que nous devons nous assurer que les utilisateurs ne peuvent accéder qu'à leurs propres données. Nous gardons donc la liste des fichiers dans notre base de données, ainsi que la liste des utilisateurs y ayant accès. Notre serveur peut facilement décider si un utilisateur a accès ou non à un fichier. Mais comment réellement servir les fichiers aux utilisateurs?
J'ai déjà envisagé certaines possibilités, mais aucune d'entre elles ne semble être la meilleure.
1. Générer (expirer) des URL signées avec PHP
C'est une approche vraiment simple, elle est aussi rapide mais se traduit par des URL très très laides et longues.
2. URLs obscurcies
Cela signifie que nous gardons les dossiers publics pour lire sur S3, mais tous les fichiers sont stockés dans difficile à deviner dossiers nommés comme: 24fa0b8ef0ebb6e99c64be8092d3ede20000
. Cependant, ce n'est peut-être pas la voie la plus sûre. Même si vous ne pouvez jamais deviner le nom d'un dossier, après l'avoir connu (parce que vous y avez réellement accès), vous pouvez partager ce lien avec n'importe qui (avec toute personne non autorisée).
3. Téléchargez les fichiers via notre serveur
Cela signifie que les fichiers ne sont pas servis directement par S3, mais d'abord notre serveur les lit en toute sécurité et les sert. Nous ne voulons vraiment pas ça :)
4. Vérification du référent
La solution des URL obscurcies peut être améliorée en "s'assurant" que la demande provient de notre serveur (vous pouvez configurer S3 pour vérifier le référent). Cependant, ce serait une solution très peu fiable, car tous les navigateurs n'envoient pas les données du référent, et elles peuvent également être truquées.
Quelle est la bonne façon de servir des fichiers d'Amazon S3 en toute sécurité pour différents clients?