

Khi một file được lưu trong bucket ở chế độ private, người dùng thông thường không thể truy cập trực tiếp. Tuy nhiên, trong nhiều ứng dụng, doanh nghiệp vẫn cần cho khách hàng tải tài liệu, xem hình ảnh hoặc upload dữ liệu mà không muốn chuyển bucket sang public. Presigned URL là một trong những cơ chế được sử dụng để giải quyết bài toán này.
Vậy Presigned URL là gì, hoạt động như thế nào và cần lưu ý gì để sử dụng an toàn? Hãy cùng tìm hiểu trong bài viết dưới đây.
Presigned URL là một URL đã được ký bằng thông tin xác thực và có thời hạn nhất định, cho phép người sở hữu URL thực hiện một hành động cụ thể đối với tài nguyên trên Object Storage mà không cần được cấp trực tiếp thông tin đăng nhập của hệ thống lưu trữ.
Có thể hiểu đơn giản, Presigned URL giống như một đường dẫn truy cập tạm thời.
Thay vì:
ứng dụng có thể tạo một URL chỉ có hiệu lực trong một khoảng thời gian nhất định.

Một Presigned URL nhìn bên ngoài vẫn giống URL thông thường nhưng thường có thêm nhiều tham số trong query string.
Tùy nền tảng Object Storage, cách biểu diễn có thể khác nhau. Tuy nhiên, về mặt logic thường có các thành phần sau.
Xác định tài nguyên mà người dùng được phép truy cập.
Ví dụ:
URL có thể gắn với một hành động cụ thể.
Các phương thức phổ biến gồm:
URL được tạo dựa trên danh tính hoặc credential có quyền thực hiện request tương ứng.
Điều này không có nghĩa credential bí mật được đưa trực tiếp cho người dùng. Thay vào đó, hệ thống tạo chữ ký dựa trên credential đó.
Xác định URL được phép sử dụng trong bao lâu.
Ví dụ:
Thời hạn nên được lựa chọn dựa trên nhu cầu thực tế thay vì đặt quá dài.
Signature là thành phần quan trọng giúp Object Storage xác minh rằng request đã được tạo hoặc ủy quyền bởi một bên có credential phù hợp.
Google Cloud giải thích Signed URL chứa thông tin xác thực, bao gồm chữ ký trong query string, cho phép người không có credential riêng thực hiện một hành động nhất định trong thời gian giới hạn.
Presigned URL (URL ký trước) được sử dụng để cấp quyền truy cập tạm thời vào một tài nguyên trên Object Storage mà không cần cung cấp trực tiếp thông tin xác thực của hệ thống cho người dùng.
Backend có thể tạo Presigned URL cho phép client tải ảnh, video, tài liệu hoặc các tệp khác trực tiếp lên Object Storage. Nhờ không phải trung chuyển toàn bộ dữ liệu qua application server, kiến trúc này có thể giúp giảm tải cho backend.
Với object được đặt ở chế độ private, Presigned URL có thể cấp quyền tải xuống hoặc truy cập tệp trong một khoảng thời gian nhất định. Khi URL hết hạn, yêu cầu sử dụng URL đó sẽ không còn được chấp nhận.
Client không cần nhận Access Key, Secret Key hoặc credential có phạm vi quyền rộng. Việc tạo chữ ký được thực hiện bởi hệ thống có quyền phù hợp, còn client chỉ nhận Presigned URL để thực hiện thao tác được cho phép.
Presigned URL thường được tạo cho một object và thao tác cụ thể, chẳng hạn GET để tải xuống hoặc PUT để tải lên. Tùy dịch vụ lưu trữ và phương thức triển khai, hệ thống có thể áp dụng thêm các điều kiện đối với yêu cầu.

Presigned URL giúp kiểm soát quyền truy cập vào dữ liệu trên Object Storage mà không cần chuyển object sang trạng thái public. Cơ chế này đặc biệt hữu ích với các ứng dụng cần chia sẻ, tải lên hoặc tải xuống file trong một khoảng thời gian nhất định.
Một trong những ưu điểm quan trọng của Presigned URL là object không cần được public để người dùng có thể truy cập.
Thay vào đó, hệ thống tạo một URL đã được ký và cấp quyền thực hiện một thao tác cụ thể trong thời gian giới hạn. Nhờ đó, dữ liệu vẫn có thể được lưu trữ ở chế độ private trong khi người dùng được phép vẫn truy cập được khi cần.
Khi sử dụng Presigned URL, ứng dụng không phải chia sẻ trực tiếp Access Key, Secret Key hoặc thông tin xác thực của tài khoản lưu trữ cho client.
Client chỉ nhận URL đã được cấp quyền cần thiết. Cách tiếp cận này giúp hạn chế việc để lộ credential và giảm nguy cơ người dùng có được quyền truy cập rộng hơn yêu cầu thực tế.
Presigned URL chỉ có hiệu lực trong một khoảng thời gian nhất định thay vì cung cấp quyền truy cập vĩnh viễn.
Thời hạn có thể được thiết lập tùy theo mục đích sử dụng, chẳng hạn URL tải tài liệu có thể tồn tại trong thời gian ngắn, sau đó tự hết hiệu lực.
Presigned URL có thể được sử dụng để cho phép client upload hoặc download dữ liệu trực tiếp với Object Storage mà không nhất thiết phải truyền toàn bộ file qua application server.
Trong những kiến trúc phù hợp, cách này giúp giảm lưu lượng dữ liệu trung chuyển qua backend, từ đó giảm tải cho máy chủ ứng dụng khi xử lý các file có dung lượng lớn hoặc nhiều yêu cầu đồng thời.
Presigned URL giúp phân tách rõ vai trò giữa backend và quá trình truyền dữ liệu. Backend có thể tập trung vào các nhiệm vụ như xác thực người dùng, kiểm tra quyền truy cập và tạo Presigned URL, trong khi client trao đổi file trực tiếp với Object Storage.
Mô hình này phù hợp với nhiều ứng dụng web và mobile cần xử lý ảnh, video, tài liệu, file đính kèm hoặc các dữ liệu có dung lượng lớn.

Hai loại URL này dễ bị nhầm lẫn vì cuối cùng người dùng đều mở một đường dẫn để truy cập dữ liệu.
Tuy nhiên, cơ chế quyền hoàn toàn khác nhau.
Tiêu chí | Presigned URL | Public URL |
| Trạng thái object | Có thể giữ private | Thường phải public |
| Chữ ký | Có | Không bắt buộc |
| Thời gian sử dụng | Có giới hạn | Thường không giới hạn |
| Credential của client | Không cần | Không cần |
| Kiểm soát hành động | Có thể gắn với request cụ thể | Thường ít linh hoạt hơn |
| Nguy cơ chia sẻ ngoài ý muốn | Có nhưng giới hạn theo thời gian/quyền | Có thể tồn tại lâu dài |
| Trường hợp sử dụng | File private, upload/download có kiểm soát | Nội dung công khai |
Ví dụ:
Logo của doanh nghiệp có thể sử dụng Public URL.
Nhưng hợp đồng của từng khách hàng nên được bảo vệ bằng cơ chế truy cập phù hợp thay vì public object.
Hai thuật ngữ này thường đề cập đến cùng một ý tưởng chung: sử dụng URL có chữ ký để cấp quyền truy cập giới hạn vào một tài nguyên.
Tuy nhiên, tên gọi phụ thuộc vào nền tảng.
AWS sử dụng thuật ngữ:
Presigned URL
AWS S3 cho phép tạo Presigned URL để upload hoặc download object.
Google Cloud sử dụng thuật ngữ:
Signed URL
Theo Google Cloud, Signed URL cấp quyền và thời gian giới hạn để thực hiện request đối với tài nguyên Cloud Storage.
Vì vậy không nên hiểu Presigned URL là công nghệ chỉ tồn tại trên AWS.
Trong các nền tảng Object Storage khác, cơ chế tương tự có thể được triển khai với tên gọi hoặc phương thức ký khác nhau.
Microsoft Azure sử dụng Shared Access Signature – SAS để cấp quyền truy cập giới hạn vào tài nguyên Storage.
SAS cho phép xác định:
Về mục tiêu, SAS có nhiều điểm tương đồng với URL được ký, nhưng không nên coi SAS và AWS Presigned URL là hai tên gọi hoàn toàn giống nhau vì cơ chế triển khai của từng nền tảng khác biệt.
Không. Presigned URL cho phép truy cập một tài nguyên private trong phạm vi quyền và khoảng thời gian được quy định. Public URL thường gắn với tài nguyên có thể truy cập công khai.
Người sử dụng Presigned URL thường không cần trực tiếp cung cấp credential của Object Storage. Tuy nhiên, ứng dụng vẫn nên xác thực người dùng trước khi cấp URL nếu dữ liệu cần được bảo vệ.
Có. Một trong những use case phổ biến là backend tạo Presigned URL rồi cho client upload trực tiếp lên Object Storage.
Có. Download object private là một trong những trường hợp sử dụng phổ biến nhất của Presigned URL.
Khi URL hết hiệu lực, request mới sử dụng URL đó sẽ không còn được chấp nhận theo điều kiện của nền tảng.
Thông thường không nên đặt thời hạn dài hơn nhu cầu thực tế. Expiration ngắn giúp giảm khoảng thời gian URL có thể bị sử dụng nếu bị lộ.
Không. Credential hoặc principal tạo URL vẫn phải có quyền phù hợp. Presigned URL chỉ là một cách ủy quyền tạm thời cho một request hoặc tài nguyên cụ thể.
Presigned URL là cơ chế cho phép cấp quyền truy cập có thời hạn đến tài nguyên trên Object Storage mà không cần public dữ liệu hoặc chia sẻ trực tiếp credential với người dùng.
Cơ chế này đặc biệt phù hợp cho các trường hợp như upload file, download tài liệu private, chia sẻ dữ liệu tạm thời và xây dựng ứng dụng web/mobile sử dụng Object Storage.
Tuy nhiên, Presigned URL vẫn cần được bảo vệ như một thông tin nhạy cảm. Doanh nghiệp nên đặt expiration phù hợp, áp dụng least privilege, sử dụng HTTPS và xác thực người dùng trước khi tạo URL.
