图像存储在S3中并安全地提供服务

时间:2013-06-14 09:18:30

标签: django amazon-s3 amazon-cloudfront fileserver

我正在建立一个照片网站,用户可以上传照片并稍后使用它查看。这些照片不是公开的和私人的。我正在S3中存储照片和缩略图。目前我所遵循的实现是,当用户访问页面时,我提供缩略图的签名网址并从S3加载(尽管我也在考虑使用来自cloudfront的签名网址)。

现在的问题是:

  • 在每个请求中,为每个缩略图提供不同的URL,因此无法使用浏览器缓存。这使得浏览器在用户刷新站点时再次加载每个图像。它使我们的页面变慢。
  • 这也造成了另一个问题,如果有人窥探了源代码,他可以找到照片的签名网址并将其分发给其他人进行查看(尽管签名网址只有10分钟)。我最喜欢的是我的应用程序传递了url,以便我可以决定是否允许用户。

请帮助我采取我应该采取的方法,我希望页面加载时间快,并且还有安全问题。我还想知道,即使对于不同的签名网址,云端服务也会比浏览器缓存(我已经在某处读取)更快。 在答案中随意描述。

1 个答案:

答案 0 :(得分:1)

我认为对你想要的东西没有一个完美的答案。一些随机的想法/权衡:

1)切换到HTTPS。这样你可以忽略人们嗅探URL。但是HTTPS项目无法在浏览器中缓存很长时间。

2)如果您要发出签名的网址,请不要设置expires =“time + 10m”,而是“时间+ 20m并且舍入到最接近的10m”。这样,URL将保持不变至少10米,浏览器可以缓存它们。 (确保还在S3中的文件上设置expires:headers,以便浏览器知道它们可以被缓存。)

3)您可以代理所有网址。让浏览器从您的服务器请求照片,然后编写Web代理以将请求代理到S3中的照片。在此过程中,您可以检查用户身份验证,为S3生成签名URL,甚至在本地缓存照片。)这对您来说似乎“效率低下”,但它允许浏览器根据需要缓存您的URL。这对您的用户来说也很方便,因为他们可以为照片网址添加书签,而且它始终有效。即使他们移动到另一台计算机,他们也会点击你的服务器,可以让他们在显示照片之前登录。

确保使用像Python Twisted或Node.js这样的“公平”服务器。这样,您可以同时代理数千张照片,而无需在服务器上使用大量内存/ CPU。 (您将使用大量带宽,因为所有数据都通过您的服务器。但您可以通过运行多个服务器轻松“扩展”。)

4)Cloudfront是一个缓存。第一次从CF服务器请求资源时,速度会慢一些(几百毫秒)。但是不要指望第二个请求被缓存!每个CF位置有大约20个不同的服务器,每次你都会随机点击一个。因此,请求10次照片可能会产生10次缓存未命中,并且您仍有50%的机会在下次请求时获得缓存命中。 CF仅适用于要求数百次的流行内容。 CF对外国用户有一定用处,因为私有CF-to-S3连接可能比普通互联网更好。

我不确定您将如何让CF为您进行安全检查。但是如果你通过S3 auth(不是默认值),那么你可以使用“mod 10分钟”技巧来制作可以缓存10分钟的URL。

CF不可能“比浏览器缓存更快”。但如果您不使用浏览器缓存,CF可能比S3快,但主要是在国外。

看看其他人做了什么(我认为smugmug使用S3。)