← Tất cả bài viết· ~8 phút

Web Bot Auth: cách AI agent chứng minh danh tính

Web Bot Auth cho bot ký request để website xác minh. Ai công bố thư mục khóa, cách xác minh hoạt động, và kết quả kiểm tra 9 origin.

Tác giả: Long Nguyen — CTO, ERPFit

Web Bot Auth: cách AI agent chứng minh danh tính

Câu trả lời ngắn: Web Bot Auth cho một bot chứng minh nó là ai. Bot ký từng request bằng HTTP Message Signatures (RFC 9421) và ghi địa chỉ thư mục khóa của mình trong header Signature-Agent. Bên vận hành bot công bố khóa công khai tại /.well-known/http-message-signatures-directory. Website của bạn không công bố gì: website, hoặc CDN của nó, chỉ xác minh. Giao thức là bản nháp của nhóm công tác IETF (draft-ietf-webbotauth-httpsig-protocol-00, ngày 1/9/2026). Agent của ChatGPT và một phần lưu lượng Google-Agent đã ký request.

Vì sao chuỗi user-agent không đủ

Chuỗi user-agent là đoạn văn bản client tự viết về mình. Bất kỳ scraper nào cũng gửi được ChatGPT-User hay Google-Agent. Website thường chống lại bằng danh sách IP và reverse DNS — Google vẫn hướng dẫn xác minh Googlebot theo cách đó. Nhưng AI agent hay chạy trên dải IP cloud dùng chung, và danh sách nhanh lỗi thời. Chữ ký gắn request với một khóa mà chỉ bên vận hành thật nắm giữ. Website có thể cho agent thật của ChatGPT đi qua tường chặn bot và giữ bản giả mạo ở ngoài. Xem thêm AI crawler và bài hướng dẫn robots.txt cho AI crawler.

Hai bên, hai việc

  • Bên vận hành bot (công ty AI, crawler, dịch vụ giám sát) tạo cặp khóa, công bố khóa công khai trong thư mục khóa, và ký mọi request.
  • Website xác minh: đọc chữ ký, tải thư mục khóa ghi trong Signature-Agent, lưu cache, rồi quyết định cho phép gì. Thực tế việc này do CDN hoặc WAF làm. Cloudflare và Vercel có tài liệu hỗ trợ; hướng dẫn của Google nói các dịch vụ chống bot, CDN và WAF lớn đều hỗ trợ.

Vì vậy tệp thuộc về origin của bot. Một cửa hàng, một blog hay website công ty không gửi bot thì không công bố gì, và như thế là đúng.

Request đã ký trông như thế nào

GET /page HTTP/1.1
Host: example.com
Signature-Agent: sig1="https://bot.example"
Signature-Input: sig1=("@authority" "signature-agent";key="sig1");created=1700000000;expires=1700000060;keyid="<JWK thumbprint>";tag="web-bot-auth"
Signature: sig1=:<chữ ký>:

Các quy tắc chính trong bản nháp -00:

  • tag PHẢI là web-bot-auth.
  • Chữ ký bao gồm @authority hoặc @target-uri, cộng với thành phần signature-agent mà nó dùng.
  • Bắt buộc có created, expires và keyid; khuyến nghị thời hạn không quá 24 giờ.
  • keyid là JWK SHA-256 thumbprint dạng base64url của khóa (RFC 7638; RFC 8037 cho Ed25519).
  • Signature-Agent là một dictionary: sig1="https://bot.example". Bản nháp viết: "Signers MUST send the dictionary form."
  • Thư mục khóa phải qua HTTPS, trả về 200, và bên xác minh không đi theo chuyển hướng. Nếu khóa trong thư mục có kid, kid PHẢI bằng thumbprint.

Chúng tôi kiểm tra 9 origin

Ngày 25/10/2026, chúng tôi chạy bộ chấm của bản quét CiteStat (packages/core/web-bot-auth.ts) trên 9 origin: 3 bên vận hành bot có thư mục khóa công khai, và 6 website không gửi bot đã ký.

OriginKết quảMức
chatgpt.comHợp lệ: 1 khóa Ed25519, kid = thumbprint, đúng media typeĐạt
http-message-signatures-example.research.cloudflare.comHợp lệ: 1 khóa; nbf ghi bằng mili giâyĐạt
agent.bot.goog5 khóa Ed25519; mỗi kid là nhãn 6 ký tự, không phải thumbprintTrung bình
github.com, vercel.com, www.cloudflare.com, developers.cloudflare.com, citestat.com, erpfit.comKhông có thư mục khóa — không gửi bot đã kýKhông áp dụng

Những điều chúng tôi thấy:

  • Cả ba thư mục đều tự ký response. Bản nháp khuyến nghị mỗi khóa một chữ ký, với tag http-message-signatures-directory. Chữ ký của chatgpt.com có hạn 24 giờ; của Cloudflare và Google là 5 phút.
  • Khóa của ChatGPT có hạn trượt. Giá trị exp trong thư mục cách thời điểm chúng tôi tải đúng 7 ngày (604.800 giây). Server ghi exp mới cho mỗi lần tải, nên bên xác minh lưu cache phải tải lại trong vòng một tuần.
  • Ví dụ của Cloudflare ghi nbf bằng mili giây (1743465600000). Ngày trong JWK tính bằng giây, nên bên xác minh làm đúng chuẩn sẽ hiểu đó là một ngày cách nay khoảng 55.000 năm và không dùng khóa. Bộ chấm của chúng tôi đọc giá trị này là mili giây và ghi chú lại.
  • Nhãn kid của Google không theo bản nháp. Bản nháp -00 viết: JWK tại đường dẫn này nếu có kid thì kid "MUST be set to the thumbprint", để bên xác minh chọn khóa bằng cách so keyid với kid. Bên xác minh chỉ so chuỗi vẫn tìm được khóa của Google; bên xác minh kiểm tra nhãn với khóa thì loại chúng. Google gọi cách triển khai của mình là thử nghiệm và khuyên website giữ cả kiểm tra IP, reverse DNS và user-agent.
  • Khóa ví dụ trong chính bản nháp cũng vậy: kid NFcW…, trong khi thumbprint của khóa là poqk….

Bản nháp và bên xác minh lệch nhau ở một header

Header Signature-Agent có hai dạng. Bản nháp -00 bắt buộc bên ký gửi dạng dictionary, và Google làm đúng như vậy: g="https://agent.bot.goog". Tài liệu của Cloudflare (cập nhật 8/10/2026) theo một bản nháp cũ hơn (directory-03): giá trị phải là một URL trong ngoặc kép, và "dạng dictionary của các bản nháp sau" nằm trong danh sách lý do xác minh thất bại. Chừng nào hai bên chưa khớp, bot muốn được Cloudflare xác minh phải theo dạng của Cloudflare. Nếu bạn vận hành bot, hãy hỏi CDN của website đích chấp nhận dạng nào.

Chủ website nên làm gì

  1. Không cần công bố gì. Thư mục khóa là việc của bên gửi bot.
  2. Bật xác minh ở CDN hoặc WAF nếu muốn cho agent đã ký đi qua (Cloudflare: signed agents và verified bots; Vercel: bot management), thay vì tự viết bộ xác minh.
  3. Giữ kiểm tra IP và reverse DNS. Không phải agent nào cũng ký, và Google chỉ ký một phần lưu lượng agent của mình.
  4. Tách hai câu hỏi. robots.txt và Content Signals nói bạn cho phép gì; Web Bot Auth chỉ nói ai đang hỏi.

Bên vận hành bot nên làm gì

  1. Tạo khóa Ed25519 và đặt kid bằng thumbprint RFC 7638 của khóa.
  2. Công bố thư mục khóa tại /.well-known/http-message-signatures-directory trên origin HTTPS của bạn, với Content-Type: application/http-message-signatures-directory+json. Ghi nbf/exp bằng giây và ký response.
  3. Ký mọi request: tag web-bot-auth, bao gồm @authority và signature-agent, keyid là thumbprint, thời hạn ngắn (Cloudflare viết: một phút thường là đủ).
  4. Đăng ký với bên xác minh. Ở Cloudflare: Bot Submission Form → Request Signature, nhập URL thư mục khóa; thử với https://crawltest.com/cdn-cgi/web-bot-auth.

Crawler của CiteStat hiện chưa ký request. Nó tự giới thiệu bằng user-agent CiteStat và tuân thủ robots.txt.

Lỗi của chính chúng tôi

Đến ngày 25/10/2026, bản quét CiteStat hỏi mọi website tệp /.well-known/web-bot-auth.json — tệp mà không bản nháp nào định nghĩa — và tính việc thiếu tệp là một lần trượt Agent Readiness. citestat.com đạt nhờ một tệp do chính chúng tôi đặt ra. Nay bản quét đọc đúng đường dẫn thư mục khóa. Website không có thư mục khóa nhận "Không áp dụng" và không bị tính vào mẫu số. Điểm Agent Readiness thay đổi theo: developers.cloudflare.com và vercel.com từ 4,4 lên 5; citestat.com từ 7,8 xuống 7,5, vì mất lần đạt sai.

CiteStat kiểm tra gì

Trên thẻ Agent Readiness, bản quét tải /.well-known/http-message-signatures-directory của origin. JWK Set đúng media type có ít nhất một khóa dùng được (khóa công khai đủ thành phần, kid bằng thumbprint, còn trong nbf/exp, không có khóa bí mật d) thì đạt. JSON không phải JWK Set, hoặc không có khóa dùng được, là mức trung bình. Khóa hợp lệ nhưng mỗi kid là nhãn chứ không phải thumbprint (agent.bot.goog) có một phát hiện riêng, mức trung bình, vì verifier làm đúng bản nháp không tìm thấy khóa đó. Sai media type là mức thấp. Không có thư mục khóa thì kiểm tra không áp dụng. Bản quét không kiểm tra server của bạn có xác minh chữ ký hay không. Điểm SEO tổng không đổi. Bạn có thể quét website của mình miễn phí, 10 lượt mỗi ngày; nếu kiểm tra website khách hàng hằng tuần, gói Pro có 100 lượt mỗi ngày với giá 500.000₫/tháng (chưa gồm VAT) — xem bảng giá.

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

Website của tôi có cần tệp Web Bot Auth không?

Không, nếu website không gửi bot. Thư mục khóa thuộc về bên vận hành bot. Website chỉ xác minh, thường qua CDN hoặc WAF. Vì vậy bản quét CiteStat ghi "Không áp dụng" cho website không có thư mục khóa và không trừ điểm.

Web Bot Auth có thay robots.txt không?

Không. robots.txt nói bot được phép lấy gì. Web Bot Auth chứng minh bot nào đang hỏi. Website cần cả hai: biết chắc đó là agent thật, rồi áp dụng quy tắc của mình cho agent đó.

Googlebot có ký request không?

Không. Theo tài liệu của Google, Web Bot Auth đang ở giai đoạn thử nghiệm: chỉ một phần request của Google-Agent được ký, với danh tính https://agent.bot.goog. Để xác minh Googlebot, vẫn dùng reverse DNS và danh sách IP Google công bố.

Web Bot Auth có giúp tăng thứ hạng Google không?

Tài liệu của Google về Web Bot Auth không nhắc đến thứ hạng; nó nói về việc nhận diện bot. Bản quét CiteStat chỉ tính Web Bot Auth trong thẻ Agent Readiness; điểm SEO tổng không đổi.

Nguồn: draft-ietf-webbotauth-httpsig-protocol-00 (IETF webbotauth, 1/9/2026) · RFC 9421 (HTTP Message Signatures) · RFC 7638 (JWK Thumbprint) · Cloudflare: Web Bot Auth (cập nhật 8/10/2026) · Google: Authenticate requests with Web Bot Auth (experimental) · Google: Verify Google requests. Dữ liệu 9 origin: tải ngày 25/10/2026.