【发布时间】:2021-06-23 03:24:57
【问题描述】:
我很想知道,如何显示存储在私有 S3 存储桶中的任何图像或文档,我需要在 UI 上向一些授权用户显示它。就像 facebook 和 instagram 一样,以保护他们的图像。我不能将图像放在公共存储桶上,否则任何人都可以查看和下载它并且它不安全。我在考虑一些解决方案,但每个解决方案都有自己的优点和缺点。我考虑以下解决方案:
解决方案 1:
我可以将所有图像放在私有 S3 存储桶中,并且身份验证令牌可以与图像 url 作为查询参数相关联。此图像 url 将被传递到图像服务器,图像服务器将验证身份验证令牌。如果它是有效的,那么图像将从私有 S3 存储桶中提取到图像服务器并以字节数组的形式下载到客户端。
这种方法有多个缺点,例如:
- 图像必须从 S3 存储桶传输到图像服务器,然后再从图像服务器传输到客户端设备。它会增加更多的延迟,并且会随着图像的大小而增加。
- 此方法不可扩展。如果我认为一秒钟内有 100 个图像读取请求,并且每个图像的大小为 5MB,那么每次内存中都会出现大约 500MB 的内容。当流量达到高峰时,服务器就会停机。
- 我可以考虑缓存图像以获得更快的响应,但图像缓存会占用大量空间,并且对于每个服务器的请求都会出现上述问题。
解决方案 2
我们可以考虑绕过图像服务器并尝试将图像从 S3 存储桶直接下载到客户端设备。如果用户已登录,则客户端可以使用私有存储桶的密钥下载图像。同样,这种方法也有一些优点:
- 我们必须在 Android、IOS、Web 等客户端设备中配置私有存储桶的密钥。从前端资源中泄露密钥的可能性很大。
- 将来如果我想复制图像内容以便在不同地理位置提供更快的服务,那么很难为每个存储桶维护不同的密钥。
除了可以达到我们目的的其他解决方案之外?
【问题讨论】:
标签: java image security amazon-s3 microservices