【发布时间】:2022-01-15 09:13:48
【问题描述】:
堆栈是:
- 角度
- Laravel
- S3
- nginx
我正在使用 S3 来存储我的用户的机密资源。存储桶访问权限设置为 private,这意味着我可以通过创建临时(签名、动态)链接或使用 Storage::disk('s3')->get('path/to/resource') 方法并返回实际文件作为响应来访问文件。
我正在寻找一种在用户浏览器中缓存资源的方法。我曾尝试直接在 AWS 上将缓存标头设置为资源响应,但由于我正在创建临时 url,它们是动态的,并且在这种情况下缓存不起作用。
非常感谢任何建议。
编辑:使整个问题更加复杂的一件事是资源的安全性应该完好无损。这意味着我需要一种缓存资源的方法,但同时我必须防止用户复制粘贴链接并在应用程序之外使用它们(通过直接链接与他人共享)。
就安全性而言,临时链接仍然不是一个理想的解决方案,因为它们可以在有效期限内(在我的情况下为 30 秒)内共享(并多次访问)。
【问题讨论】:
-
您可以采用第二种方法(即“代理”)并在其上设置相应的缓存标头。
-
@apokryfos 你能更具体一点吗?如果您认为我应该添加缓存头以响应我通过第二种方法返回的文件......我不能使用这种方法,因为我正在使用
<img src="path/to/resource">加载图像。我不知道我是否遗漏了一些东西,但我真的被困住了,找不到做这种事情并保持资源安全完整的好方法。所以,我基本上需要找到一种方法来返回非动态链接,并且只能由授权用户访问(他不应该只是复制该链接并在应用程序之外重用)。看起来不可能。 -
您的第二种方法类似于
return response(Storage::disk('s3')->get('path/to/resource'), 200, [ headers ]);,它可以使用缓存控制标头,如果要第一次检索图像(或何时检索),您还可以使用会话作为安全手段缓存过期)。 -
@apokryfos 感谢您的想法。我会尝试一些我可以实际使用该方法的特定情况。
标签: laravel security nginx amazon-s3 caching