2

在我们的项目中,我们决定使用预签名的 url 作为基本的身份验证机制。

精简我们的设置涉及

  • 存储服务器
  • api服务器
  • 客户端(在浏览器中运行的角度 SPA)

我们使用预签名的 url 将文件从客户端直接上传和下载到存储服务器。

上传流程(简化):

  • 客户端发送api:嘿,我想上传那个
  • api 进行授权和验证,做一些数据库工作并返回一个预签名的 url
  • 客户端直接上传到存储服务器

到目前为止,一切都很好。最大的问题是“下载”流程。

  • 客户问api:嘿,给我看看你有什么的清单
  • api 进行授权、验证并返回一个 json 对象列表,这些对象还包含用于显示文件(图像)的预签名获取 url
  • 客户端显示对象数据列表并使用预签名的 url 嵌入直接从存储服务器下载的图像

这很好用,但会将浏览器缓存增加到数 GB 的 RAM。

发生这种情况是因为在多次调用中生成的预签名 url 不一样,并且在每个请求的授权部分(例如,保持新的生命周期)不同。当用户在分页列表中向前和向后单击时,客户端将收到不同的 url,并且浏览器缓存将它们视为不同的图像。


到目前为止,这似乎是浏览器端的正确行为(不同的 url 等于不同的图像)。

到目前为止,这似乎是 api 方面的正确行为(新调用将返回新的生命周期)。


有没有任何预期的方法来处理这个问题?

流程本身是错误的吗?

除了在运行多个 api 实例时实现集中的预签名 url 缓存之外,还有什么方法可以解决这个问题?


希望有人也可以为我可以使用的有意义的标签提供建议。

4

2 回答 2

1

另一种解决方案是使用来自https://docs.minio.io/docs/javascript-client-api-reference.html#presignedUrlpresignedurl的APIminio-js

请查看https://github.com/minio/minio-js/issues/724https://github.com/minio/minio-js/pull/728了解更多信息。

于 2019-02-25T18:42:57.797 回答
1

当前流程中对预签名资源的每个请求都会让浏览器/客户端向 S3 发出新请求。

因此,浏览器缓存的好处并没有得到享受,并且可以通过在生成预签名 URL 时指定额外的响应标头来控制客户端中的缓存策略来实现。Cache-Control响应头可以在预签名请求的响应头中设置no-cache1

我建议的一个更好的流程是让预签名 URL 在5to15分钟之间有一个到期时间,并Cache-Control在预签名 URL 的响应的响应标头中设置为max-age:<expire-time-in-secs>.

使用这个新流程,您需要通过保留服务器端缓存来确保 API 服务器仅在过期时间后返回新的预签名 URL 列表。您可以从 API 服务器的响应时间中获得收益,并且还可以避免从浏览器为缓存资源提供不必要的请求。

于 2019-02-24T00:31:00.253 回答