Presigned URL là một URL S3 đã được ký sẵn bằng credential của backend, kèm thời hạn hết hạn. Ai cầm URL đó thì làm được đúng một thao tác đã ký (GET để tải, PUT để ghi) trên đúng một object, mà không cần có credential AWS.
Luồng upload thường dùng:
1. Client gọi backend: "tôi muốn upload avatar.jpg, 300KB, image/jpeg".
2. Backend kiểm tra quyền + kích thước + content-type, sinh key ngẫu nhiên (vd users/<id>/<uuid>.jpg), ký presigned PUT hạn 5 phút, trả URL về.
3. Browser PUT thẳng file lên S3 — không đi qua backend.
4. Client báo backend "xong", backend lưu key vào DB (hoặc dùng S3 Event Notification để xác nhận).
Lợi ích chính: file lớn không chiếm băng thông và bộ nhớ của server ứng dụng, và không cần tăng giới hạn body size của API.
Lưu ý hay bị hỏi tiếp:
- Bucket phải cấu hình CORS thì browser mới PUT được (nếu không sẽ lỗi preflight).
- URL hết hạn theo thời gian ký; ký ngắn (5–15 phút).
- Muốn ràng buộc kích thước tối đa ngay ở S3 thì dùng presigned POST policy thay vì presigned PUT.
- Tải file riêng tư cũng ký GET tương tự, không cần mở public bucket.