Hướng dẫn yêu cầu kỹ thuật B2B image hosting 2026: checklist 15 mục
Mua dịch vụ image hosting cho công ty cũng giống mua database — không ai đánh giá qua mỗi landing page.
Team mình giao cho tôi đánh giá một nhà cung cấp thay thế. Tôi gom lại tất cả sự cố production và hóa đơn bất ngờ từ ba năm qua rồi viết thành một checklist. Đây không phải bài so sánh "CDN nào nhiều PoP hơn". Đây là loại bảng bạn paste vào RFP, yêu cầu vendor trả lời "Yes / No / Partial" cho từng dòng. Nhìn bề ngoài các dịch vụ image hosting giống nhau, nhưng kiến trúc bên dưới khác nhau rất nhiều.
Nếu bạn chỉ muốn tìm dịch vụ miễn phí hoặc rẻ nhất, xem so sánh image hosting miễn phí hoặc thay thế Imgur. Bài này dành cho tech lead, bộ phận mua sắm SaaS, và DevOps engineer.
Tại sao chọn image hosting cho doanh nghiệp hoàn toàn khác với dùng cá nhân
Người dùng cá nhân quan tâm: "Upload được không? Link dễ share không?"
Doanh nghiệp quan tâm chuỗi câu hỏi khác. Hợp đồng có ghi SLA không? API bị quá tải thì rate limit xử lý thế nào? Egress fee có nhảy gấp đôi đột ngột trong một tháng nào đó không? Khi auditor hỏi dữ liệu EXIF lưu bao lâu, bạn trả lời được không?
Nói thật nhé, mua image hosting B2B thực chất là mua ba thứ: đường cong chi phí dự đoán được, cam kết hệ thống có thể kiểm chứng, và giao diện giao thức có thể tích hợp. 15 mục phía dưới đều xoay quanh ba điều này.
Sau một lần sập production, tôi mới hiểu: gói miễn phí chạy demo được, chạy production thì không.
Bảng checklist 15 mục cho RFP (copy thẳng vào tài liệu mua sắm)
Đây là bảng tôi thực sự dùng khi đánh giá vendor. Mỗi mục đều có cách xác minh — không phải hỏi "các anh có hỗ trợ không?" rồi coi như xong, vì vendor nào cũng trả lời Yes.
| # | Tiêu chí | Cách xác minh | Tiêu chuẩn đạt |
|---|---|---|---|
| 1 | S3 API compatible | Chạy s3api list-objects-v2 --prefix |
Response schema khớp AWS |
| 2 | Multipart Upload | Upload file 500MB, ngắt giữa chừng, resume | Hỗ trợ part retry |
| 3 | Pre-signed URL | Tạo URL 15 phút và verify chữ ký | HMAC-SHA256, TTL tùy chỉnh |
| 4 | Webhook events | Trigger sự kiện upload/delete | HMAC signature + cơ chế retry |
| 5 | Rate Limit policy | Chạy burst test | Trả 429 + Retry-After header |
| 6 | Điều khoản SLA | Đọc MSA | ≥99.9%, có service credit |
| 7 | Multi-region | Yêu cầu danh sách region | ≥2 region, đồng bộ cross-region |
| 8 | Egress pricing | Yêu cầu bảng giá | Đơn giá minh bạch, có tier discount |
| 9 | Image processing pipeline | Test on-the-fly transform | Hỗ trợ WebP/AVIF, URL params |
| 10 | CDN edge nodes | Chạy global ping test | ≥50 PoP, có node Đông Nam Á |
| 11 | EXIF / Metadata control | Upload ảnh có GPS | Cho phép strip chọn lọc |
| 12 | Xác thực | Xem API docs | Hỗ trợ OAuth2 + API Key rotation |
| 13 | Audit logs | Hỏi log retention | ≥90 ngày, export được |
| 14 | Compliance certs | Yêu cầu SOC 2 / ISO 27001 | Ít nhất một chứng chỉ |
| 15 | Data residency & deletion | Xem DPA | Chọn được region, hard delete |
Đừng chỉ tick Yes/No. Mỗi mục yêu cầu vendor đính kèm link tài liệu hoặc bước xác minh kỹ thuật. Mục nào không có tài liệu — thực tế 90% là "có kế hoạch nhưng chưa làm".
Chi tiết kỹ thuật từng mục — những chỗ vendor hay lấp liếm
Bảng chỉ là khung xương. Mấy mục dưới đây là nơi vendor hay lập lờ nhất lúc đàm phán hợp đồng.
S3 Compatible — không đơn giản như một câu nói
"Chúng tôi S3 compatible" là câu vendor nào cũng thích nói. Nhưng S3 API có hơn 200 operation, điều quan trọng là nhóm operation bạn thực sự dùng có hoạt động đúng không.
GetObject, PutObject thì ai cũng có. Đi sâu hơn:
# Test multipart
aws s3api create-multipart-upload --bucket test --key big.mp4 \
--endpoint-url https://vendor.example.com
# Test versioning
aws s3api put-bucket-versioning --bucket test \
--versioning-configuration Status=Enabled
# Test lifecycle
aws s3api put-bucket-lifecycle-configuration ...
Mình đã thử, chưa tới 60% vendor pass cả ba test. Bucket lifecycle và object lock hay thiếu nhất — mà thiếu hai cái này, audit compliance sẽ có vấn đề.
Pre-signed URL: TTL và thuật toán ký
Đây là phương thức xác thực phổ biến nhất trong B2B. End user không có credentials của bạn, bạn phát cho họ một vé có thời hạn.
Cơ chế bên dưới là HMAC-SHA256: method, path, expiry, headers được đóng gói thành string-to-sign rồi ký bằng secret key. Vendor tốt sẽ cho bạn:
- TTL tùy chỉnh (từ 1 phút đến 7 ngày)
- Khóa theo IP nguồn (
aws:SourceIpcondition) - Giới hạn HTTP method
- Hỗ trợ SigV4 (SigV2 đã lỗi thời, vendor nào còn dùng SigV2 thì loại luôn)
Vendor dở sẽ cho bạn một URL công khai "không bao giờ hết hạn" rồi gọi đó là signed. Đây chính là lý do Pre-signed URL phải ghi rõ trong RFP.
Webhook signature — mình từng dính bài này
Webhook là xương sống của kiến trúc event-driven. Upload xong, quét virus xong, chuyển mã xong — mỗi sự kiện phải push về hệ thống của bạn.
Nhưng bảo mật webhook là chỗ vendor hay cắt xén nhất. Những implementation tệ mình từng gặp:
- Không có signature, POST trần
- Có signature nhưng secret nằm trong query string
- Có signature nhưng dùng MD5
- Có signature nhưng không có timestamp — replay attack thoải mái
Webhook hợp chuẩn phải có:
- HMAC-SHA256 signature trong
X-Signatureheader X-Timestampheader, reject request quá 5 phút- Tự động retry khi fail (exponential backoff, ít nhất 3 lần)
- Dead letter queue hoặc replay API
Verify webhook bằng Go trông như thế này:
func verifyWebhook(body []byte, sig, ts, secret string) bool {
if time.Since(parseTS(ts)) > 5*time.Minute {
return false
}
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(ts + "." + string(body)))
expected := hex.EncodeToString(mac.Sum(nil))
return hmac.Equal([]byte(sig), []byte(expected))
}
Thiếu đoạn kiểm tra timestamp, replay attack xuyên thủng toàn bộ event system của bạn.
Rate Limit: hai tầng cần đánh giá
Rate limit phải xem hai tầng: quota của bạn là bao nhiêu và vượt quota thì xảy ra gì.
Quota thì dễ thương lượng, thường ghi per-second / per-minute trong plan. Điều thực sự quan trọng là hành vi khi vượt giới hạn:
| Hành vi | Đánh giá |
|---|---|
| 503 cắt kết nối | Không đạt |
| 429 không có Retry-After | Nửa đạt |
| 429 + Retry-After header | Đạt |
| 429 + Retry-After + quota header | Xuất sắc |
Điểm cộng nếu có X-RateLimit-Remaining header — giúp code của bạn chủ động throttle thay vì bị động ăn 429.
SLA — con quỷ nằm trong exclusion clause
Ai cũng ghi 99.9%. 99.9% nghĩa là 43.2 phút downtime mỗi tháng. 99.95% là 21.6 phút. 99.99% là 4.3 phút.
Nhưng giá trị thật của SLA không nằm ở con số mà ở exclusion clause. Đọc kỹ từng dòng:
- Bảo trì có lịch có tính downtime không?
- Sự cố khu vực có tính không?
- DDoS có tính không?
- Lỗi phụ thuộc bên thứ ba (ví dụ upstream DNS) có tính không?
Quan trọng hơn là cơ chế service credit. Không đạt SLA thì được hoàn bao nhiêu? Hoàn credit hay tiền mặt? Credit có tích lũy hay hết hạn?
Nói thật, đa số SLA viết thì đẹp, lúc thực sự claim thì bị exclusion chặn lại. Nên khi mua sắm, đừng chỉ nhìn phần trăm — hãy yêu cầu lịch sử incident thực tế 12 tháng gần nhất, có thể cung cấp dưới NDA.
Egress Pricing — cái bẫy chi phí ẩn
Egress (băng thông ra) là nơi ngân sách image hosting hay bị vỡ. Chiêu cũ của vendor: storage rẻ, egress đắt.
Nhìn số liệu, giá egress giữa các vendor lớn có thể chênh nhau hơn 10 lần. Cloudflare R2 zero egress (trong mạng Cloudflare), Cloudinary dùng credit model, imgix tính per request. Cái nào tiết kiệm phụ thuộc hoàn toàn vào traffic profile của bạn.
Trước khi ký, hỏi rõ ba điều:
- Có tier discount theo volume không? Thường trên 10TB/tháng mới có ưu đãi rõ rệt
- Traffic nội bộ cross-region có tính egress không?
- CDN cache hit có tính egress không? Một số vendor tính cache hit cũng là billable traffic
Mình đã thử nghiệm: môi trường test 200GB/tháng không sao. Lên production, traffic tăng vọt lên 8TB, hóa đơn thêm một con số 0. Hợp đồng không ghi rõ overage behavior nên tháng đó chịu trận.
Lưu ý cho doanh nghiệp Việt Nam
Nếu công ty bạn có người dùng chủ yếu tại Việt Nam, hãy ưu tiên vendor có PoP tại Singapore hoặc region AWS ap-southeast-1. Một số nhà cung cấp hosting nội địa Việt Nam có latency tốt nhưng thường thiếu S3 compatibility và audit log. Theo Luật An ninh mạng Việt Nam (Nghị định 13/2023/NĐ-CP), dữ liệu của người dùng Việt Nam có thể cần lưu trữ trong nước — hãy hỏi vendor về data residency option trước khi ký hợp đồng.
Ba tiêu chí hay bị bỏ qua
Ba mục này không nằm trong "bảng so sánh image hosting" phổ biến, nhưng dùng thật sẽ đau.
EXIF và Metadata — vấn đề compliance
EXIF chứa tọa độ GPS, serial number máy ảnh, thời gian chụp. Upload lên image host công khai, tất cả metadata mặc định đi theo.
Với B2B, cần hỏi:
- Có thể strip EXIF chọn lọc (xóa GPS nhưng giữ copyright)?
- Có hỗ trợ thao tác IPTC / XMP metadata?
- Xử lý metadata lúc upload hay on-the-fly?
GDPR và Luật An ninh mạng Việt Nam đều coi tọa độ GPS là dữ liệu cá nhân. Xử lý sai, rủi ro pháp lý chuyển thẳng sang công ty bạn.
Xác thực hybrid: OAuth2 + API Key
Image host cũ chỉ cho API Key. B2B hiện đại yêu cầu kết hợp:
- Hệ thống nội bộ: API Key + IP allowlist
- Frontend SPA: OAuth2 PKCE flow
- Truy cập tạm: Pre-signed URL
Nếu vendor chỉ cho bạn một API Key vĩnh viễn và bảo tự quản lý scope — họ đang đẩy rủi ro bảo mật cho khách hàng. Giải pháp đúng phải hỗ trợ scoped token, tự động rotation, và revocation API.
Hard delete và data retention
Yêu cầu "quyền được quên" theo GDPR phải thực thi trong 30 ngày. Nhiều image host nói "chúng tôi sẽ xóa", thực tế chỉ soft delete — object vẫn nằm trong S3, trong CDN cache, trong backup tape.
Khi mua sắm, xác nhận:
- Deletion có ghi trong DPA (Data Processing Agreement)?
- Chu kỳ backup có cơ chế xóa tương ứng?
- Vendor có cung cấp chứng nhận xóa không?
Tôi đã xử lý một case thật: khách hàng nhận yêu cầu xóa theo GDPR, nhưng cold storage backup của vendor giữ 365 ngày không thể override. Pháp lý qua lại ba tháng.
CDN Edge Nodes và latency thực tế
Con số PoP hay bị thổi phồng. Vendor quảng cáo "300+ PoP" nhưng thực tế 280 cái ở Bắc Mỹ và châu Âu, Đông Nam Á chỉ có 5.
Cách xác minh đơn giản: lấy anycast IP của vendor, chạy mtr từ VPS tại các khu vực khác nhau (Hà Nội, TP.HCM, Singapore, Tokyo, Frankfurt). Trên 80ms RTT là không chấp nhận được.
Nếu user Đông Nam Á phải truy cập CDN route về US West, đó là 150ms+ tối thiểu. Thời gian tải ảnh trên frontend sẽ chậm rõ rệt. Trong B2B SaaS — đặc biệt e-commerce và media — điều này ảnh hưởng trực tiếp tỷ lệ chuyển đổi.
lpic.cc ở đâu trong bức tranh này
Nói thật nhé: lpic.cc hiện tại không phải giải pháp enterprise B2B.
Chúng tôi nhắm vào developer cá nhân, blogger, và người dùng forum với upload miễn phí, bảo vệ bằng mật khẩu, và lưu trữ 30 ngày. Backend chạy trên lưu trữ đối tượng đám mây với API tự xây, kiến trúc có dùng một số kỹ thuật trong bài này (Pre-signed URL, webhook, xử lý EXIF). Nhưng chúng tôi không cung cấp enterprise SLA, chứng chỉ SOC 2, hay DPA.
Nếu bạn là tech lead đang đánh giá image hosting cấp production, hãy lấy checklist này áp dụng cho Cloudinary, imgix, Cloudflare Images, hay ImageKit. Nếu bạn cần giải pháp nhẹ cho cá nhân hoặc team nhỏ, thử lpic.cc xem — upload miễn phí tại đây rồi tự đánh giá.
Câu hỏi thường gặp
Q1: Team nhỏ có cần image hosting enterprise không?
Không nhất thiết. Dưới 10K MAU và dưới 500GB/tháng, bạn có thể dựng một layer trên Cloudflare R2 + Workers với chi phí dưới $5/tháng. Giải pháp enterprise có giá trị ở SLA, compliance, và support SLA — team nhỏ chưa chắc cần. Nhưng nếu bạn phục vụ khách hàng B2B và hợp đồng yêu cầu DPA, thì không có lựa chọn khác.
Q2: S3 compatible thực sự quan trọng không?
Rất quan trọng. S3 là API chuẩn thực tế. Compatible nghĩa là bạn dùng được SDK hoàn thiện, Terraform provider, backup tool. Không compatible nghĩa là bạn bị khóa vào API riêng của vendor, chi phí di cư trong tương lai cực cao. Đây là chỉ báo vendor lock-in kinh điển.
Q3: Webhook khác polling chỗ nào? Sao phải dùng webhook?
Polling là bạn hỏi "xong chưa?" mỗi N giây. Webhook là vendor push thông báo khi hoàn thành. Khác biệt ở latency (giây vs mili giây) và chi phí (quota API call của bạn vs zero). Với các sự kiện như upload xong, chuyển mã xong, quét virus — không có webhook thì không làm được UX real-time.
Q4: SLA 99.9% vs 99.99% thực sự chênh nhiều không?
Về số là 43 phút vs 4 phút mỗi tháng. Có ảnh hưởng hay không tùy business. Nếu ảnh là product photo trong flow thanh toán e-commerce, mỗi phút downtime đều mất doanh thu. Nếu ảnh trong sổ tay nhân viên nội bộ, 99.9% hay 99% đều chấp nhận được. Hãy đối chiếu yêu cầu SLA với tác động thực tế đến business.
Q5: Cloudflare R2 zero egress — chọn luôn được không?
Không hẳn. Zero egress của R2 chỉ áp dụng trong mạng Cloudflare (qua Workers hoặc CDN). Kéo data từ R2 về cloud khác vẫn tính phí. Ngoài ra, Class A operation (ghi) của R2 không rẻ. Với workload ghi nhiều đọc ít, R2 chưa chắc tiết kiệm. Hãy tính tổng chi phí dựa trên tỷ lệ read/write thực tế.
Tài liệu tham khảo
- Best S3-Compatible Storage Providers Top 5 in 2026
- S3-Compatible Object Storage What It Means for Enterprises
- Cloudflare Images Pricing Explained 2026
- Image Transform Pricing Compared
- Cloudinary vs Imgix Comparison
- How to Implement SHA256 Webhook Signature Verification
- Google Cloud CDN Signed URLs
- Webhooks Security Best Practices - Stytch
- What is an Uptime SLA Guarantee - Uptime.com