最近节日
正在加载日历...----
解释 MinIO/S3 签名 URL 的参数和 7 天有效期限制,对比预签名上传与下载,说明私有对象访问、链接泄露和过期刷新策略。

签名 URL 是服务端为私有对象生成的临时访问凭证。本文解释 MinIO/S3 签名参数、7 天有效期限制、预签名上传与下载的差异,以及泄露后的处置方式。签名 URL 只授予特定对象和时间窗口内的访问权限,不能替代桶策略和服务端鉴权。
在对象存储(OSS / S3 / MinIO)中,文件默认是私有的——只有拥有 AccessKey 的用户才能访问。但在实际业务中,我们经常需要让前端或第三方临时访问某个文件,比如:
这就引出了签名 URL(Presigned URL) 的概念。
签名 URL 是服务端用 AccessKey 和 SecretKey 对一个 HTTP 请求进行签名后,将签名参数附加到 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 对以上所有参数计算得出 |
客户端携带签名 URL 请求 → OSS 服务端 1. 取出 X-Amz-Date(签名时间)+ X-Amz-Expires(有效期秒数) 2. 计算:签名时间 + 有效期 = 过期时刻 3. 判断当前时间是否超过过期时刻 ├── 超过 → 返回 403 Access Denied: Request has expired └── 未超过 → 验证签名是否被篡改 ├── 篡改 → 返回 403 SignatureDoesNotMatch └── 有效 → 返回文件内容关键点:过期校验是服务端执行的,客户端无法通过修改本地时间绕过。
| 存储服务 | 最大有效期 | 说明 |
|---|---|---|
| AWS S3 | 7 天(604800 秒) | S3 协议硬性限制 |
| MinIO | 7 天(604800 秒) | 兼容 S3 协议,遵循相同限制 |
| 阿里云 OSS | 无硬性上限 | 可设置任意长的有效期 |
| 腾讯云 COS | 无硬性上限 | 可设置任意长的有效期 |
MinIO / S3 的 7 天上限是协议层面的约束,即使代码中传入更大的值,服务端也会拒绝。
请求流程:客户端 → 获取签名 URL → 携带签名参数访问 OSS → OSS 验证签名+有效期 → 返回文件
URL 示例:https://oss.example.com/bucket/photo.jpg?X-Amz-Algorithm=...&X-Amz-Expires=604800&X-Amz-Signature=...特点:
请求流程:客户端 → 直接访问 URL → OSS 检查桶策略(公开读)→ 返回文件
URL 示例:https://oss.example.com/bucket/photo.jpg特点:
| 维度 | 预签名 URL | 直接 URL |
|---|---|---|
| 桶权限 | 私有 | 公开读 |
| 过期时间 | 有(最长 7 天) | 无 |
| 访问控制 | 有(签名即权限) | 无(任何人可访问) |
| URL 长度 | 长(含签名参数) | 短(干净路径) |
| 适用场景 | 私有文件、临时分享 | 公开资源、CDN 加速 |
签名 URL 快过期时,前端自动调用后端接口获取新的签名 URL。
前端逻辑:1. 加载文件时获取签名 URL,记录过期时间2. 展示文件时检查是否即将过期(如剩余 < 1 小时)3. 即将过期则调后端接口刷新签名 URL4. 无感替换,用户无感知优点:桶保持私有,安全性好 缺点:需要前后端配合,增加接口调用
后端提供下载接口,鉴权后从 OSS 拉取文件再返回给前端。
请求流程:前端 → 后端 /api/files/{id}/download → 后端鉴权 → 后端从 OSS 拉取文件 → 返回给前端优点:前端无需处理签名逻辑,完全由后端控制 缺点:文件流量经过后端,增加后端带宽和延迟
将桶设为公开读,配置自定义域名,返回不带签名的直接 URL。
优点:URL 永不过期,实现最简单 缺点:文件可被任何人访问,不适合私有资源
在 OSS 前面加一层 CDN,通过 CDN 的鉴权功能(如 URL 鉴权、Referer 防盗链、IP 黑白名单)控制访问。
请求流程:客户端 → CDN(鉴权 + 缓存)→ OSS优点:兼顾性能和安全,CDN 缓存减轻 OSS 压力 缺点:架构复杂度增加,需要额外配置 CDN
| 场景 | 推荐模式 | 理由 |
|---|---|---|
| 用户头像、公开图片 | 公开桶 + 直接 URL | 无需访问控制,永不过期 |
| 私有文档、合同文件 | 私有桶 + 签名 URL | 需要访问控制 |
| 临时分享链接 | 私有桶 + 签名 URL(短有效期) | 限制分享时间窗口 |
| 视频流媒体 | CDN 回源 + 鉴权 | 性能 + 安全兼顾 |
| 有效期 | 适用场景 |
|---|---|
| 5 ~ 15 分钟 | 临时上传凭证、一次性下载 |
| 1 ~ 2 小时 | 短期预览、编辑场景 |
| 24 小时 | 日常文件访问 |
| 7 天(最大值) | 长期展示场景,需配合续签机制 |
在。签名 URL 过期只是访问凭证失效,文件本身不受影响。重新生成签名 URL 即可再次访问。
S3 / MinIO 不能,协议限制最长 7 天。阿里云 OSS / 腾讯云 COS 理论上可以设置极长的有效期,但不推荐——签名 URL 的设计初衷就是临时授权。
取决于桶策略:
签名 URL 中的 X-Amz-Date 和 X-Amz-Expires 是明文参数,前端可以解析:
过期时刻 = X-Amz-Date + X-Amz-Expires(秒)在过期前主动刷新即可。也可以由后端在返回签名 URL 时一并返回过期时间戳。