一句話:一組憑證分兩半——access key ID 是公開的「帳號」、secret access key 是機密的「密碼」。pre-signed URL 只把 access key ID 寫進網址,secret key 從頭到尾不外洩。
「簽章要用 secret key 算,那 secret key 是不是也被寫進網址、被大家看光了?」——不會。 這是初學者最容易誤會、也最該安心的一點。
AKIAIOSFODNN7EXAMPLE):公開的「帳號」那半,可以外露。它只用來告訴 S3「這是用哪組憑證簽的」。比喻:access key ID 像你的帳號名稱(可以告訴別人);secret key 像密碼(打死不能說)。簽名時你「用密碼證明是你」,但交出去的文件上只寫得到你的帳號名,不會印出密碼。
在 pre-signed URL 裡:
X-Amz-Credential 參數裡(那串 AKIA.../日期/region/s3/aws4_request 的第一段)。X-Amz-Signature(而簽章不可逆、推不回 secret key)。S3 收到請求,靠網址裡的 access key ID 查出自己這邊存的對應 secret key,用它重算一次簽章,跟網址帶來的 X-Amz-Signature 比對。兩邊都握有 secret key、各算一次、相等就放行——這就是 Level 0 的 HMAC 玩法:key 不用傳,各自算、比結果。