MinIO | 文件存储签名 URL 有效期机制 | 学习文档

1956 字
10 分钟
MinIO | 文件存储签名 URL 有效期机制 | 学习文档

MinIO | 文件存储签名 URL 有效期机制 | 学习文档#

一、背景#

在文件存储(OSS / S3 / MinIO)中,文件默认是私有的——只有拥有 AccessKey 的用户才能访问。但在实际业务中,我们经常需要让前端或第三方临时访问某个文件,比如:

  • 用户在浏览器中预览上传的图片
  • 下载链接分享给外部用户
  • 前端直传文件到 MinIO

这就引出了签名 URL(Presigned URL) 的概念。


二、什么是签名 URL#

签名 URL 是服务端用 AccessKey 和 SecretKey 对一个 HTTP 请求进行签名后,将签名参数附加到 URL 查询字符串中生成的一个临时访问链接。

2.1 签名 URL 的格式#

以 S3 / MinIO 为例,签名 URL 的典型格式如下:

https://oss.example.com/bucket-name/object-name
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIA.../20260511/us-east-1/s3/aws4_request
&X-Amz-Date=20260511T080000Z
&X-Amz-Expires=604800
&X-Amz-SignedHeaders=host
&X-Amz-Signature=a1b2c3d4e5f6...

各参数含义:

参数含义
X-Amz-Algorithm签名算法,固定为 AWS4-HMAC-SHA256
X-Amz-Credential凭证范围,包含 AccessKey / 日期 / 区域 / 服务 / 请求类型
X-Amz-Date签名生成的 UTC 时间
X-Amz-Expires有效期,单位为秒,这是过期时间的核心参数
X-Amz-SignedHeaders参与签名的 HTTP 请求头
X-Amz-Signature签名值,由 SecretKey 对以上所有参数计算得出

2.2 签名 URL 的工作原理#

客户端携带签名 URL 请求 → OSS 服务端
1. 取出 X-Amz-Date(签名时间)+ X-Amz-Expires(有效期秒数)
2. 计算:签名时间 + 有效期 = 过期时刻
3. 判断当前时间是否超过过期时刻
├── 超过 → 返回 403 Access Denied: Request has expired
└── 未超过 → 验证签名是否被篡改
├── 篡改 → 返回 403 SignatureDoesNotMatch
└── 有效 → 返回文件内容

关键点:过期校验是服务端执行的,客户端无法通过修改本地时间绕过。


三、有效期限制#

3.1 各厂商的最大有效期#

存储服务最大有效期说明
AWS S37 天(604800 秒)S3 协议硬性限制
MinIO7 天(604800 秒)兼容 S3 协议,遵循相同限制
阿里云 OSS无硬性上限可设置任意长的有效期
腾讯云 COS无硬性上限可设置任意长的有效期

MinIO / S3 的 7 天上限是协议层面的约束,即使代码中传入更大的值,服务端也会拒绝。

3.2 为什么 S3 协议限制 7 天#

  • 安全考量:签名 URL 本质是临时授权凭证,有效期越长,泄露后的风险窗口越大
  • 凭证轮换:AccessKey 可能被轮换或吊销,7 天的上限确保签名 URL 不会长期绕过权限变更
  • 时钟偏移:长时间跨度下,客户端与服务端的时钟偏差可能导致签名验证失败

四、两种访问模式对比#

4.1 预签名 URL 模式(私有桶)#

请求流程:
客户端 → 获取签名 URL → 携带签名参数访问 OSS → OSS 验证签名+有效期 → 返回文件
URL 示例:
https://oss.example.com/bucket/photo.jpg?X-Amz-Algorithm=...&X-Amz-Expires=604800&X-Amz-Signature=...

特点

  • 桶保持私有,安全性高
  • URL 带签名参数,有过期时间
  • 到期后需重新获取签名 URL
  • 适合需要访问控制的场景

4.2 直接 URL 模式(公开桶 + 自定义域名)#

请求流程:
客户端 → 直接访问 URL → OSS 检查桶策略(公开读)→ 返回文件
URL 示例:
https://oss.example.com/bucket/photo.jpg

特点

  • 桶必须设为公开读
  • URL 无签名参数,永不过期
  • 任何人拿到 URL 都能访问
  • 适合公开资源(如头像、公开图片)

4.3 对比总结#

维度预签名 URL直接 URL
桶权限私有公开读
过期时间有(最长 7 天)
访问控制有(签名即权限)无(任何人可访问)
URL 长度长(含签名参数)短(干净路径)
适用场景私有文件、临时分享公开资源、CDN 加速

五、签名 URL 过期后的应对方案#

方案一:前端自动续签(推荐)#

签名 URL 快过期时,前端自动调用后端接口获取新的签名 URL。

前端逻辑:
1. 加载文件时获取签名 URL,记录过期时间
2. 展示文件时检查是否即将过期(如剩余 < 1 小时)
3. 即将过期则调后端接口刷新签名 URL
4. 无感替换,用户无感知

优点:桶保持私有,安全性好 缺点:需要前后端配合,增加接口调用

方案二:后端代理下载#

后端提供下载接口,鉴权后从 OSS 拉取文件再返回给前端。

请求流程:
前端 → 后端 /api/files/{id}/download → 后端鉴权 → 后端从 OSS 拉取文件 → 返回给前端

优点:前端无需处理签名逻辑,完全由后端控制 缺点:文件流量经过后端,增加后端带宽和延迟

方案三:公开桶 + 自定义域名#

将桶设为公开读,配置自定义域名,返回不带签名的直接 URL。

优点:URL 永不过期,实现最简单 缺点:文件可被任何人访问,不适合私有资源

方案四:CDN 回源 + 鉴权#

在 OSS 前面加一层 CDN,通过 CDN 的鉴权功能(如 URL 鉴权、Referer 防盗链、IP 黑白名单)控制访问。

请求流程:
客户端 → CDN(鉴权 + 缓存)→ OSS

优点:兼顾性能和安全,CDN 缓存减轻 OSS 压力 缺点:架构复杂度增加,需要额外配置 CDN


六、最佳实践#

6.1 根据场景选择模式#

场景推荐模式理由
用户头像、公开图片公开桶 + 直接 URL无需访问控制,永不过期
私有文档、合同文件私有桶 + 签名 URL需要访问控制
临时分享链接私有桶 + 签名 URL(短有效期)限制分享时间窗口
视频流媒体CDN 回源 + 鉴权性能 + 安全兼顾

6.2 有效期设置建议#

有效期适用场景
5 ~ 15 分钟临时上传凭证、一次性下载
1 ~ 2 小时短期预览、编辑场景
24 小时日常文件访问
7 天(最大值)长期展示场景,需配合续签机制

6.3 安全注意事项#

  1. 签名 URL 不要存储在数据库中:签名 URL 是临时凭证,存储后可能过期失效,应按需生成
  2. 使用 HTTPS:签名参数在 URL 中,HTTP 明文传输可能导致泄露
  3. 最小有效期原则:有效期应尽可能短,满足业务需求即可
  4. 签名 URL 不要暴露在日志中:日志中的签名 URL 可能被未授权人员获取
  5. AccessKey 定期轮换:轮换后旧的签名 URL 自动失效,缩小泄露影响范围

七、常见问题#

Q1:签名 URL 过期后,文件还在吗?#

。签名 URL 过期只是访问凭证失效,文件本身不受影响。重新生成签名 URL 即可再次访问。

Q2:能否生成永不过期的签名 URL?#

S3 / MinIO 不能,协议限制最长 7 天。阿里云 OSS / 腾讯云 COS 理论上可以设置极长的有效期,但不推荐——签名 URL 的设计初衷就是临时授权。

Q3:签名 URL 泄露了怎么办?#

  • 如果有效期很短,等待自然过期即可
  • 如果有效期较长,可以轮换 AccessKey,旧签名立即失效
  • 如果桶策略允许,可以删除或重命名文件

Q4:去掉签名参数后还能访问吗?#

取决于桶策略:

  • 私有桶:不能,返回 403
  • 公开桶:能,桶策略本身就允许匿名访问

Q5:前端如何判断签名 URL 是否过期?#

签名 URL 中的 X-Amz-DateX-Amz-Expires 是明文参数,前端可以解析:

过期时刻 = X-Amz-Date + X-Amz-Expires(秒)

在过期前主动刷新即可。也可以由后端在返回签名 URL 时一并返回过期时间戳。

MinIO | 文件存储签名 URL 有效期机制 | 学习文档
https://tblog.mmzhiku.xyz/posts/projects/projects-object-storage-presigned-url/
作者
MmzMing
发布于
2026-05-01
许可协议
CC BY-NC-SA 4.0

评论区

看板娘
公告
友链 互换友链

正在招募技术类博客友链,要求原创、稳定更新。点击了解更多。

查看详情
维护 服务器升级

本周日凌晨 2:00-4:00 进行服务器维护,期间站点可能短暂无法访问。

欢迎 关于我的介绍

欢迎来到我的博客,我是深耕java、python和react技术开发。热爱技术、持续学习,欢迎同好交流探讨,也欢迎大佬互换友链。

查看详情
音乐
封面

音乐

暂未播放

0:00
0:00
暂无歌词
标签
# AI 6 # 认证 5 # 安全 4 # 登录 3 # Skill 2 # Redis 2 # Bitmap 2 # 部署 2 # Java 2 # 并发编程 2 # 性能优化 2 # 前端 1 # 博客 1 # Prompt 1 # 工作流 1 # RAG 1 # Cloudflare 1 # 缓存设计 1 # 高性能 1 # Bot 1 # Umami 1 # Vercel 1 # 线程池 1 # 虚拟线程 1 # 分布式 1 # JWT 1 # OAuth2 1 # MinIO 1 # 文件存储 1 # 扫码登录 1 # WebSocket 1 # Agent 1 # Oracle 1 # 数据库 1
目录

隐私政策

更新日期: 2026/5/19
生效日期: 2026/5/19

导言#

MmzMing的知识库 是一款由 MmzMing(以下简称“我们”)提供的产品。您在使用我们的服务时,我们可能会收集和使用您的相关信息。我们希望通过本《隐私政策》向您说明,在使用我们的服务时,我们如何收集、使用、储存和分享这些信息,以及我们为您提供的访问、更新、控制和保护这些信息的方式。

本《隐私政策》与您所使用的 MmzMing的知识库 服务息息相关,希望您仔细阅读,在需要时,按照本《隐私政策》的指引,作出您认为适当的选择。本《隐私政策》中涉及的相关技术词汇,我们尽量以简明扼要的表述,并提供进一步说明的链接,以便您的理解。

您使用或继续使用我们的服务,即意味着同意我们按照本《隐私政策》收集、使用、储存和分享您的相关信息。

如对本《隐私政策》或相关事宜有任何问题,请通过 784774835@qq.com 与我们联系。

1. 我们收集的信息#

我们或我们的第三方合作伙伴提供服务时,可能会收集、储存和使用下列与您有关的信息。如果您不提供相关信息,可能无法注册成为我们的用户或无法享受我们提供的某些服务,或者无法达到相关服务拟达到的效果。

  • 个人信息:您在注册账户或使用我们的服务时,向我们提供的相关个人信息,例如电话号码、电子邮件等。
  • 日志信息:指您使用我们的服务时,系统可能通过 cookies、标识符及相关技术收集的信息,包括您的 设备信息浏览信息点击信息,并将该等信息储存为日志信息,为您提供个性化的用户体验、保障服务安全。您可以通过浏览器设置拒绝或管理 cookie、标识符或相关技术的使用。
  • 位置信息:指您开启设备定位功能并使用我们基于位置提供的相关服务时,收集的有关您位置的信息,包括:
    • 您通过具有定位功能的移动设备使用我们的服务时,通过 GPS 或 WiFi 等方式收集的您的地理位置信息;
    • 您可以通过关闭定位功能,停止对您的地理位置信息的收集。

2. 信息的存储#

2.1 信息存储的方式和期限#

我们会通过安全的方式存储您的信息,包括本地存储(例如利用 APP 进行数据缓存)、数据库和服务器日志。

一般情况下,我们只会在为实现服务目的所必需的时间内或法律法规规定的条件下存储您的个人信息。

2.2 信息存储的地域#

我们会按照法律法规规定,将境内收集的用户个人信息存储于中国境内。

目前我们不会跨境传输或存储您的个人信息。将来如需跨境传输或存储的,我们会向您告知信息出境的目的、接收方、安全保证措施和安全风险,并征得您的同意。

2.3 产品或服务停止运营时的通知#

当我们的产品或服务发生停止运营的情况时,我们将以推送通知、公告等形式通知您,并在合理期限内删除您的个人信息或进行匿名化处理,法律法规另有规定的除外。

3. 信息安全#

我们使用各种安全技术和程序,以防信息的丢失、不当使用、未经授权阅览或披露。例如,在某些服务中,我们将利用加密技术(例如 SSL)来保护您提供的个人信息。但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全。您需要了解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。

4. 我们如何使用信息#

我们可能将在向您提供服务的过程之中所收集的信息用作下列用途:

  • 向您提供服务;
  • 在我们提供服务时,用于身份验证、客户服务、安全防范、诈骗监测、存档和备份用途,确保我们向您提供的产品和服务的安全性;
  • 帮助我们设计新服务,改善我们现有服务;
  • 使我们更加了解您如何接入和使用我们的服务,从而针对性地回应您的个性化需求,例如语言设定、位置设定、个性化的帮助服务和指示,或对您和其他用户作出其他方面的回应;
  • 向您提供与您更加相关的广告以替代普遍投放的广告;
  • 评估我们服务中的广告和其他促销及推广活动的效果,并加以改善;
  • 软件认证或管理软件升级;
  • 让您参与有关我们产品和服务的调查。

5. 信息共享#

目前,我们不会主动共享或转让您的个人信息至第三方,如存在其他共享或转让您的个人信息或您需要我们将您的个人信息共享或转让至第三方情形时,我们会直接或确认第三方征得您对上述行为的明示同意。

为了投放广告,评估、优化广告投放效果等目的,我们需要向广告主及其代理商等第三方合作伙伴共享您的部分数据,要求其严格遵守我们关于数据隐私保护的措施与要求,包括但不限于根据数据保护协议、承诺书及相关数据处理政策进行处理,避免识别出个人身份,保障隐私安全。

我们不会向合作伙伴分享可用于识别您个人身份的信息(例如您的姓名或电子邮件地址),除非您明确授权。

我们不会对外公开披露所收集的个人信息,如必须公开披露时,我们会向您告知此次公开披露的目的、披露信息的类型及可能涉及的敏感信息,并征得您的明示同意。

随着我们业务的持续发展,我们有可能进行合并、收购、资产转让等交易,我们将告知您相关情形,按照法律法规及不低于本《隐私政策》所要求的标准继续保护或要求新的控制者继续保护您的个人信息。

另外,根据相关法律法规及国家标准,以下情形中,我们可能会共享、转让、公开披露个人信息无需事先征得您的授权同意:

  • 与国家安全、国防安全直接相关的;
  • 与公共安全、公共卫生、重大公共利益直接相关的;
  • 犯罪侦查、起诉、审判和判决执行等直接相关的;
  • 出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
  • 个人信息主体自行向社会公众公开个人信息的;
  • 从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。

6. 您的权利#

在您使用我们的服务期间,我们可能会视产品具体情况为您提供相应的操作设置,以便您可以查询、删除、更正或撤回您的相关个人信息,您可参考相应的具体指引进行操作。此外,我们还设置了投诉举报渠道,您的意见将会得到及时的处理。如果您无法通过上述途径和方式行使您的个人信息主体权利,您可以通过本《隐私政策》中提供的联系方式提出您的请求,我们会按照法律法规的规定予以反馈。

当您决定不再使用我们的产品或服务时,可以申请注销账户。注销账户后,除法律法规另有规定外,我们将删除或匿名化处理您的个人信息。

7. 变更#

我们可能适时修订本《隐私政策》的条款。当变更发生时,我们会在版本更新时向您提示新的《隐私政策》,并向您说明生效日期。请您仔细阅读变更后的《隐私政策》内容,若您继续使用我们的服务,即表示您同意我们按照更新后的《隐私政策》处理您的个人信息。

8. 未成年人保护#

我们鼓励父母或监护人指导未满十八岁的未成年人使用我们的服务。我们建议未成年人鼓励他们的父母或监护人阅读本《隐私政策》,并建议未成年人在提交的个人信息之前寻求父母或监护人的同意和指导。