Chaque export PDF passe par nginx → app → S3 → app → client. Facture compute grimpe, timeouts multiplient. Vous générez une URL pré-signée 15 minutes : le client tire directement depuis le bucket. CPU tombe, mais l'URL circule dans Slack.
Pré-signé = capability temporaire signée HMAC. Puissant, sensible.
Quand utiliser
Gros downloads/uploads, mobile apps, partenaires temporaires. Évitez proxy streaming maison.
Pas pour auth session longue — utilisez IAM role app-side.
Génération sécurisée
Backend avec credentials minimaux s3:GetObject sur prefix user/{id}/. Jamais clés root. Expiration courte.
Option : condition Content-Disposition filename, SSE-KMS headers.
Upload direct navigateur
Flow : backend crée presigned PUT → client upload → backend valide etag/size → move tag « clean ».
Limite taille via policy condition content-length-range.
Risques
| Risque | Mitigation |
|---|---|
| URL partagée | TTL court, one-time token metadata |
| Enumération | UUID keys, pas sequential |
| Replay upload | checksum + virus scan async |
| IAM trop large | prefix strict |
Observabilité
Log génération URL (user, object, expiry). Alert download volume anomaly. CloudTrail S3 data events si budget.
Sécurité URL
TTL minimal métier. Objet key UUID. Scope IAM prefix strict. Log génération. Révocation = rotate IAM + invalider URLs restantes par expiry courte anyway.
Ne logguez pas query string signée en clair dans access logs publics.
Test fuite : partager URL expirée doit 403.
Patterns UX
Download : presigned GET 5–15 min. Upload gros fichier : multipart presigned + progress client.
Ne pas presign list bucket — scope objet unique.
Audit : qui a généré URL pour quel userId — trace abuse.
Mobile apps embedding presigned in deep links : expiry must match UX session — deep link replay risk.
Multipart upload presigned : abort incomplete MPU lifecycle saves inode and cost.
Compliance
Presigned URL PII export : log accès + expiry court + audit qui a demandé export RGPD.
Ne pas envoyer presigned par SMS non chiffré — même TTL court, interception risk.
Rotation clés IAM liée rotation presigned secret app layer.
Synthèse opérationnelle
Presigned délègue bande passante et accès temporaire — IAM minimal, TTL court, keys UUID, audit génération. CORS bucket distinct API CORS.
Fuite URL = fuite data jusqu'à expiry — rotation secrets si grave.
Architecture decision record
Quand presigned vs proxy app vs CDN signed cookies — document tradeoff latence, coût egress, audit, UX mobile. Revoyez ADR annuellement ou si x2 trafic download.
Mobile deep link
TTL presigned = copy UX « lien expire 15 min » — littéral.
Revue sécurité
Audit trimestriel logs génération presigned : TTL distribution, anomalies TTL max.
Content-Disposition attachment sur presigned download — moins XSS open browser tab.
Condition IAM SecureTransport true bucket — HTTPS only presigned.
Suivi opérationnel
Revue trimestrielle IAM presigned scope — creep permissions. TTL moyen audit log. Pen test presigned URL tamper signature — must fail closed. Documentez les écarts entre promesse hébergeur et mesure terrain dans la revue trimestrielle.
Poursuite trimestrielle
Revue trimestrielle IAM presigned scope — creep permissions. TTL moyen audit log. Pen test presigned URL tamper signature — must fail closed. Documentez les écarts entre promesse hébergeur et mesure terrain dans la revue trimestrielle.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
ADR presigned
vs proxy vs CDN cookies. TTL = copy UX littérale. IAM rotate révocation.
Décider et avancer sans angle mort
- IAM minimal sur prefix —
s3:GetObjectou Put limité àuser/{id}/, jamais clés root. - TTL minimal métier — minutes à heures ; copy UX « lien expire 15 min » littérale.
- Clés objet UUID — pas de séquential enumeration ; log génération sans query signée en clair.
- Flow upload PUT — backend valide etag/size, scan async, tag clean.
- ADR annuel — presigned vs proxy app vs CDN signed cookies selon egress et audit.
Stockage objet et egress : comparateur, annuaire, guides.
Questions fréquentes
GET vs PUT pré-signé ?
GET = download temporaire client. PUT = upload direct navigateur/app vers bucket sans passer par votre serveur.
Durée max recommandée ?
Minutes à heures pour download user. Upload multipart : durée couvrant session + marge, jamais jours sans rotation.
Fuite URL = fuite données ?
Oui jusqu'à expiration. Limitez objet scope, Content-Type, checksum, et révoquez via rotation clés IAM si fuite grave.
Alternative CDN ?
Signed cookies CloudFront pour contenu public cacheable ; presigned S3 pour accès privé one-off.
Réduisez le TTL avant d'optimiser le chunk size — la fuite coûte plus que la latence.
