FileDummy Logo
FileDummy
Bảo Mật & Toàn Vẹn Tệp Tin

Presigned URL: Tải Tệp An Toàn Từ S3 & Cloudflare R2 Không Lộ Bucket

Tạo link tải tệp có giới hạn thời gian từ AWS S3 và Cloudflare R2 bằng AWS SDK v3 trong Node.js. Bảo mật dữ liệu không cần mở public bucket.

1 tháng 11, 20269 phút đọc1,420 lượt xem
nodejsaws-s3cloudflare-r2presigned-urlsecurity

Cho phép người dùng tải xuống tài sản riêng tư trực tiếp từ Amazon S3 hoặc Cloudflare R2 mà không cần định tuyến luồng dữ liệu khổng lồ qua máy chủ ứng dụng của bạn sẽ giảm đáng kể tải cho máy chủ và chi phí băng thông. Presigned URL cung cấp các liên kết tải xuống an toàn, có thời hạn, được ký bởi thông tin xác thực đám mây của bạn.

Kiến Trúc: Tại Sao Dùng Presigned URL Cho Download Trực Tiếp?

Code
[Trình duyệt] -- 1. GET /api/download-link?file=report.pdf --> [Node.js API Server]
                                                                 | Tạo Presigned URL
[Trình duyệt] <-- 2. Trả về URL có chữ ký (hết hạn sau 15 phút) (Không tốn băng thông!)

[Trình duyệt] -- 3. GET https://bucket.r2.cloudflarestorage.com/report.pdf?X-Amz-Signature=... --> [Cloudflare R2]
[Trình duyệt] <-- 4. Tải xuống trực tiếp tốc độ cao -----------------------------------------------+
Thử Nghiệm Thực Tế.pdf

Tải file PDF mẫu 100MB để đo thời gian đến byte đầu tiên (TTFB) với presigned download URL.

Tải File Mẫu 100MB PDF →

Tạo Presigned GET URL Trong Node.js (AWS SDK v3)

TypeScript
import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const s3 = new S3Client({
  region: 'auto',
  endpoint: process.env.R2_ENDPOINT,
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
  },
});

export async function createDownloadUrl(
  bucketName: string,
  objectKey: string,
  fileName: string,
  expiresInSeconds = 900 // 15 phút
): Promise<string> {
  const command = new GetObjectCommand({
    Bucket: bucketName,
    Key: objectKey,
    // Buộc trình duyệt tải về với tên file đúng thay vì mở trong tab mới
    ResponseContentDisposition: `attachment; filename="${encodeURIComponent(fileName)}"`,
  });

  const presignedUrl = await getSignedUrl(s3, command, { expiresIn: expiresInSeconds });
  return presignedUrl;
}

Các Biện Pháp Bảo Mật Tốt Nhất

  • Thời gian hết hạn ngắn: Giới hạn thời gian hết hạn từ 5–15 phút. Sau khi trình duyệt bắt đầu luồng tải xuống, tính liên tục của kết nối vẫn được duy trì ngay cả khi URL hết hạn giữa chừng.
  • Kiểm tra phân quyền trước: Luôn xác minh quyền phiên người dùng và giới hạn tốc độ trong API endpoint trước khi tạo và trả về URL đã ký.
NDL

Nguyễn Đại Long

Tác Giả

Backend Lead • Chuyên gia Kiến trúc Hệ thống Phân tán & Lưu trữ Đám mây

Hơn 4 năm kinh nghiệm thiết kế các hệ thống xử lý tệp tải lên thông lượng lớn, tối ưu hóa cơ sở dữ liệu và hạ tầng phân tán Cloudflare R2 / AWS S3. Người sáng lập FileDummy và Mạng lưới Hệ sinh thái NDL.

Bài viết này có hữu ích không?

Bấm Thích để ủng hộ tác giả và giúp bài viết lan tỏa tới cộng đồng lập trình viên.

Thảo Luận Kỹ Thuật & Đóng Góp Ý Kiến (0)

Chia sẻ kết quả benchmark, phản hồi các trường hợp biên hoặc đặt câu hỏi chuyên môn.

0/3000

Chưa có bình luận nào. Hãy là lập trình viên đầu tiên bắt đầu cuộc thảo luận!

Câu Hỏi Thường Gặp (FAQ)

How long should a presigned URL be valid?▾

Match expiry to the use case. For direct download links in a UI: 15–60 minutes. For email links: 24–72 hours. For machine-to-machine: 5–15 minutes. A leaked URL grants temporary access, so keep expiry as short as practical.

Can presigned URLs be revoked before they expire?▾

You cannot directly revoke a presigned URL. To effectively revoke, move or delete the object in S3/R2. Use short expiry times for fine-grained access control.

What is the difference between a presigned URL and a public bucket URL?▾

A public URL is permanently accessible to anyone. A presigned URL is time-limited, tied to specific IAM permissions, and optionally IP-restricted. Use presigned URLs for private files.

Bài Viết Liên Quan