(и чтобы никто не украл)
🗳 Публичные файлы (аватарка, превью новости)
Любой может посмотреть. Просто ссылка:
https://cdn.myapp.com/assets/12345/avatar.jpg🗳 Приватные файлы (паспорт, налоговая, личный документ)
Только владелец или кто с правом.
💔 Как не надо делать
Запрос к API:
GET /api/get-file?id=123, сервер читает файл с диска и отдает байты.Почему плохо: Сервер тратит CPU и память, передавая гигабайты файлов. При 1000 пользователей сервер ляжет.
💚 Как надо делать
Предподписанные ссылки (Pre-signed URLs) - это ссылка, которая:
🔸Работает ограниченное время (например, 1 час)
🔸Содержит подпись (шифр), что файл можно забрать
Как работает:
1. Фронтенд просит бэкенд: "Дай ссылку на файл 123"
2. Бэкенд проверяет права пользователя
3. Бэкенд генерирует специальную ссылку на S3 вида:
https://s3.amazonaws.com/bucket/123?signature=abc...&expires=36004. Бэкенд отдает ссылку фронтенду
5. Фронтенд идет напрямую в S3 по этой ссылке
Итог:
Сервер не передает файл, а только дает одноразовую ссылку.