PUT a URL signed for 1 second, sent after 2.2 seconds -> status=403 AccessDenied POST /presign/upload {"contentType":"image/png"} -> status=200 method=PUT expiresInSeconds=300 headers={"content-type":"image/png"} url path: http:///uploads/4dfdf0af-141a-4d1b-9d35-3609a9385791 query: X-Amz-Algorithm=AWS4-HMAC-SHA256 query: X-Amz-Date=20261017T154013Z query: X-Amz-SignedHeaders=content-type%3Bhost query: X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20261017%2Fus-east-1%2Fs3%2Faws4_request query: X-Amz-Expires=300 query: X-Amz-Signature=4e5c56c29980cf521e477119788a0616c392deac4686df7259957af9f1445203 PUT with the signed Content-Type (image/png) -> status=200 PUT the same URL again (presigned URLs are reusable) -> status=200 PUT with a different Content-Type (text/html) -> status=403 SignatureDoesNotMatch PUT with no Content-Type header -> status=403 SignatureDoesNotMatch PUT after changing the last character of the key -> status=403 SignatureDoesNotMatch PUT after raising X-Amz-Expires to 7 days -> status=403 SignatureDoesNotMatch GET presigned URL -> status=200 bytes match upload=true content-disposition=attachment; filename="holiday.png" disallowed type: POST /presign/upload text/html -> status=400