一句話:pre-signed URL 尾巴那串 X-Amz-*,就是 SigV4 認證所需的六樣資訊——宣告演算法、誰簽的、何時簽、有效多久、簽了哪些 header、以及那段簽章。
https://examplebucket.s3.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20130524T000000Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature=aeeed9bb...d404
| 參數 | 意義 |
|---|---|
X-Amz-Algorithm | 固定 AWS4-HMAC-SHA256——宣告「這是 SigV4、用 HMAC-SHA256 算的」。 |
X-Amz-Credential | accessKeyID/日期/region/s3/aws4_request——第一段是公開的 access key ID,後面是 credential scope(限定日期/region/service)。 |
X-Amz-Date | 簽章時間,ISO 8601(yyyyMMddTHHmmssZ,UTC)。過期判斷的起點。 |
X-Amz-Expires | 有效秒數。最小 1、最大 604800(7 天)——因為 Signing Key 本身最多有效 7 天。 |
X-Amz-SignedHeaders | 哪些 header 被簽進去,分號連接。presigned 通常只有 host。 |
X-Amz-Signature | SigV4 算出的那段簽章(小寫 hex)。 |
若用臨時憑證(STS),還會多一個 X-Amz-Security-Token。
算簽章時,canonical request 的 query 字串要含除了 X-Amz-Signature 以外的所有參數——因為簽章是「算完才有」的結果,不可能在算之前就把它塞進「要簽的內容」(雞生蛋)。其他五個 X-Amz-* 全都一起被簽,唯獨簽章自己排除。