Хорошая архитектура безопасности и, вероятно, это то, что реализовано в ActiveStorage:
1 - запрашивается страница с формой загрузки.
2 - запись блоба будет создана на стороне сервера и сохранена в базе данных (даже до того, как произойдет какая-либо загрузка). https://github.com/rails/rails/blob/0718c75bc2a7378d30e729a3c1d25ceb99400b7b/activestorage/app/models/active_storage/blob.rb#L70
3- Сервер вызывает стороннюю облачную службу (AWS S3 для примера) в бэкэнде и выдает предварительно назначенный URL-адрес, используя учетные данные AWS (секретные учетные данные и не должны быть доступны для общественности), которые будут использоваться для загрузки. https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/service/s3_service.rb#L87
https://www.rubydoc.info/github/aws/aws-sdk-ruby/Aws%2FS3%2FObject:presigned_url
4 - Сервер отображает страницу с формой и встроенным presigned_url.
5- На этом этапе перед интерфейсом presigned_url будет сгенерирован сервер и выведен в форму.
6- Javascript будет захватывать этот presigned_url из HTML DOM и использовать его для загрузки.
7- После загрузки javascript будет иметь signed_id
, который будет опубликован в форме на серверной стороне, чтобы обновить запись BLOB-объекта и пометить ее как загруженную (ту, которая была создана в шаге 1).
За :
1 - Вам не нужно проходить через сервер для загрузки какого-либо файла, а это означает, что вы не блокируете никакие процессы во время загрузки и используете вычислительные мощности клиента для выполнения такой простой задачи.
2 - Вы можете загрузить, даже если сервер не работает.
3 - Ускоренный пользовательский опыт (меньше поездок в оба конца).
Против
1- временный токен может использовать любой, кто имеет к нему доступ для загрузки.
2- presigned_url имеет период действия (expires_at), и если браузер некоторое время простаивал перед выполнением фактической загрузки, браузер, вероятно, получит ошибку аутентификации. Может потребоваться выдать новый временный токен с сервера!?
Примечание:
- Сгенерированный presigned_url может иметь ограниченный доступ к определенной папке / области действия в зависимости от пользователя, прошедшего проверку подлинности, или им может быть предоставлен доступ к целой корзине / области отсутствия, если загруженные большие двоичные объекты являются общедоступными в соответствии с требованиями бизнеса.
Вот как signed uploads
работает :) 1048 *