开发中的 App 使用七牛保存用户上传的图片,为了保证用户图片的隐私和安全,将用户上传的图片保存在 private bucket 中。为方便用户查看,减少加载时间和节省流量,每一张原始图片会生成缩略图(Thumb)、放大图(Zoom)和原始图(Original),将 Original 保存在七牛,Thumb 和 Zoom 使用图片处理 API 动态生成。
图片上传时使用 Call Back 机制向业务服务写入文件元数据,当用户查看图片时再根据 bucket 和 key 生成 download url。由于使用了 private bucket,导致每次生成的 download url 是不同的。而且,如果用户在一段时间内没有查看 Zoom 图片,只能重新生成 download url 或者延长 expire 时间。
我们使用的策略是:
- 业务服务同时返回 thumb url、zoom url 和 original url。
- 由 App 根据页面的业务决定使用 thumb/zoom/original。
- 延长 expire 尽量避免出现链接不可用的情况。
- 修改 App 的图片缓存策略(不能直接使用 download url 缓存)
原计划在 App 端生成 upload token 和 download url,减少与业务服务的交互。可是,刚刚看官方文档,因为安全的原因不推荐这样,建议每次都从服务端取 token。
我的问题是:
- 生成 thumb/zoom/original url 导致业务服务返回的 JSON 过大,每个 download url 至少有 170+ 个字符。
- 延长 expire 可能会降低图片的私密性。
- App 持有 Access Key 和 Secret Key 的安全隐患太大。
大家是怎么「平衡」这个问题的?