【问题标题】:Ways to show protected image on UI在 UI 上显示受保护图像的方法
【发布时间】:2021-06-23 03:24:57
【问题描述】:

我很想知道,如何显示存储在私有 S3 存储桶中的任何图像或文档,我需要在 UI 上向一些授权用户显示它。就像 facebook 和 instagram 一样,以保护他们的图像。我不能将图像放在公共存储桶上,否则任何人都可以查看和下载它并且它不安全。我在考虑一些解决方案,但每个解决方案都有自己的优点和缺点。我考虑以下解决方案:

解决方案 1:
我可以将所有图像放在私有 S3 存储桶中,并且身份验证令牌可以与图像 url 作为查询参数相关联。此图像 url 将被传递到图像服务器,图像服务器将验证身份验证令牌。如果它是有效的,那么图像将从私有 S3 存储桶中提取到图像服务器并以字节数组的形式下载到客户端。

这种方法有多个缺点,例如:

  1. 图像必须从 S3 存储桶传输到图像服务器,然后再从图像服务器传输到客户端设备。它会增加更多的延迟,并且会随着图像的大小而增加。
  2. 此方法不可扩展。如果我认为一秒钟内有 100 个图像读取请求,并且每个图像的大小为 5MB,那么每次内存中都会出现大约 500MB 的内容。当流量达到高峰时,服务器就会停机。
  3. 我可以考虑缓存图像以获得更快的响应,但图像缓存会占用大量空间,并且对于每个服务器的请求都会出现上述问题。

解决方案 2
我们可以考虑绕过图像服务器并尝试将图像从 S3 存储桶直接下载到客户端设备。如果用户已登录,则客户端可以使用私有存储桶的密钥下载图像。同样,这种方法也有一些优点:

  1. 我们必须在 Android、IOS、Web 等客户端设备中配置私有存储桶的密钥。从前端资源中泄露密钥的可能性很大。
  2. 将来如果我想复制图像内容以便在不同地理位置提供更快的服务,那么很难为每个存储桶维护不同的密钥。

除了可以达到我们目的的其他解决方案之外?

【问题讨论】:

    标签: java image security amazon-s3 microservices


    【解决方案1】:

    解决方案 1 不错,但您不需要服务器……Amazon S3 可以为您完成。

    当您的应用程序想要提供指向私有对象的链接时,它可以生成一个Amazon S3 pre-signed URLs,这是一个提供对私有对象的访问的有时间限制的 URL。它可以包含在您的 HTML 页面中(例如 <img src="...">),甚至可以作为直接 URL。

    这种方法的美妙之处在于,您的应用程序可以在几行代码中生成一个预签名的 URL(无需调用 AWS),然后 Amazon S3 将为您完成所有服务。这意味着您的应用服务器上的负载更少,并且具有高度可扩展性。

    【讨论】:

    • 但在这种情况下,我们必须为每个用户创建新的预签名 url。假设我们一次有 5 亿活跃用户。那么,创建那么多预签名的 url 是不是一件好事?
    • 预签名 URL 不在任何地方“存在”。它们只是一个计算出的校验和,上面写着“允许在此时间之前访问此对象”。 Amazon S3 将在收到预签名 URL 时对其进行验证。您可以根据需要创建任意数量。您不会“为每个用户创建一个预签名的 url”。相反,当您想要提供一个引用私有对象的页面时,您的应用程序将验证用户是否有权访问该内容,如果是,将在那时创建预签名的 URL,在接下来的 5 分钟内有效(例如)。
    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 2020-03-31
    • 2016-02-19
    • 1970-01-01
    • 2015-12-20
    • 2011-10-26
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多