30 tháng 9, 2026 · 5 phút đọc

Cách chia sẻ tệp riêng tư trên S3 và R2 bằng presigned URL

Không phải tệp nào cũng nên nằm trong bucket công khai. Hợp đồng, hóa đơn hay bản build chưa phát hành có thể vẫn riêng tư mà vẫn chia sẻ được, bằng một liên kết chỉ hoạt động trong thời gian giới hạn.

Presigned URL hoạt động thế nào

URL chứa mọi thứ S3 cần để kiểm tra yêu cầu: khóa dùng để ký, thời điểm ký, thời hạn hiệu lực và chữ ký. Nó trông như sau:

https://your-bucket.s3.eu-central-1.amazonaws.com/contract.pdf
  ?X-Amz-Algorithm=AWS4-HMAC-SHA256
  &X-Amz-Credential=AKIA…/20260930/eu-central-1/s3/aws4_request
  &X-Amz-Date=20260930T120000Z
  &X-Amz-Expires=3600
  &X-Amz-SignedHeaders=host
  &X-Amz-Signature=…

Việc ký diễn ra trên máy tính của bạn. Không có gì được gửi đến nhà cung cấp cho đến khi ai đó mở liên kết, và thay đổi bất kỳ phần nào cũng làm chữ ký mất hiệu lực.

Tạo bằng AWS CLI

aws s3 presign s3://your-bucket/contract.pdf --expires-in 86400

Liên kết đó hoạt động trong 24 giờ. Với Cloudflare R2 hoặc một dịch vụ tương thích S3 khác, hãy trỏ CLI đến endpoint của dịch vụ đó:

aws s3 presign s3://your-bucket/contract.pdf --expires-in 86400 \
  --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com

Những giới hạn cần biết

  • Tối đa 7 ngày. Signature Version 4 cho phép tối đa 604.800 giây, trên cả S3 và R2.
  • Thông tin xác thực tạm thời hết hạn sớm hơn. URL được ký bằng phiên STS hoặc SSO sẽ ngừng hoạt động khi phiên đó hết hạn, kể cả khi bạn đặt thời hạn dài hơn.
  • R2 cần tên miền API. Presigned URL trên R2 hoạt động với <ACCOUNT_ID>.r2.cloudflarestorage.com, không hoạt động với tên miền riêng.
  • Ai có liên kết cũng dùng được. Hãy coi nó như mật khẩu cho đến khi hết hạn.
  • Không thu hồi được từng liên kết. Để vô hiệu hóa liên kết sớm, hãy xóa hoặc đổi tên đối tượng, hoặc vô hiệu hóa access key đã dùng để ký.

Presigned URL hay bucket công khai?

Dùng bucket công khai cho những tệp cần được xem và phải luôn hoạt động: ảnh chụp màn hình trong tài liệu, hình ảnh trong README. Dùng presigned URL cho mọi thứ nhạy cảm hoặc chỉ cần trong thời gian ngắn. Nhiều người giữ mỗi loại một bucket và chọn theo từng tệp.

Câu hỏi thường gặp

Presigned URL có thể kéo dài hơn 7 ngày không?

Không với Signature Version 4, chuẩn mà S3 và R2 sử dụng. Nếu cần truy cập lâu hơn, hãy công khai tệp hoặc tạo liên kết mới khi liên kết cũ hết hạn.

Vì sao presigned URL của tôi trả về SignatureDoesNotMatch?

Thường là do URL bị thay đổi sau khi ký, ví dụ bởi ứng dụng email hoặc do đổi host sang tên miền riêng. Thiết lập vùng và endpoint cũng phải khớp với bucket.

Presigned URL có dùng được với Backblaze B2 và MinIO không?

Có. Cả hai đều hỗ trợ presigned URL theo Signature Version 4 thông qua API tương thích S3.