WebGL không chỉ dùng cho hiệu ứng web đẹp mắt — nó còn có thể theo dõi người dùng. Tìm hiểu cách vân tay WebGL hoạt động và cách phòng vệ.
Vân tay WebGL nhận diện thiết bị của bạn bằng cách truy vấn phần cứng đồ họa và quan sát chính xác cách nó kết xuất các cảnh 3D. Vì mỗi tổ hợp của mẫu GPU, phiên bản driver và hệ điều hành tạo ra kết quả hơi khác nhau và báo cáo các khả năng hơi khác nhau, một trang web có thể đọc chuỗi nhà sản xuất và bộ kết xuất GPU của bạn, liệt kê các tiện ích mở rộng được hỗ trợ cùng các giới hạn số, và băm một hình ảnh đã kết xuất thành một định danh ổn định — tất cả mà không cần quyền, cookie hay bộ nhớ lưu trữ. Điều này khiến WebGL trở thành một trong những tín hiệu có entropy cao nhất trong vân tay trình duyệt hiện đại.
WebGL là gì và vì sao nó làm lộ danh tính phần cứng
WebGL là một API JavaScript cho phép các trang web truy cập cấp thấp vào GPU để có đồ họa 2D và 3D tăng tốc phần cứng. Về cơ bản nó là một liên kết của trình duyệt với OpenGL ES, nghĩa là khi bạn gọi WebGL, bạn đang vươn xuống qua trình duyệt, qua driver đồ họa, tới bộ xử lý đồ họa vật lý bên trong máy của bạn.
Chính khả năng truy cập sâu đó là điều biến WebGL thành mỏ vàng cho vân tay số. Để vẽ hiệu quả, WebGL phải tiết lộ những gì phần cứng của bạn có thể làm — nó hỗ trợ kết cấu (texture) lớn đến đâu, những tính năng tùy chọn nào khả dụng, các shader của nó làm tròn số dấu phẩy động như thế nào. Nó cũng tạo ra đầu ra thay đổi theo phần cứng: cùng một loạt lệnh vẽ lại cho ra các điểm ảnh khác nhau tinh tế trên card NVIDIA so với GPU của Apple so với chip tích hợp Intel, bởi mỗi loại triển khai rasterization, khử răng cưa và toán dấu phẩy động theo cách khác nhau.
Có hai nhóm tín hiệu WebGL lớn: siêu dữ liệu khai báo (các chuỗi và con số mà GPU tự báo cáo về chính nó) và đầu ra đã kết xuất (các điểm ảnh thực tế tạo ra khi vẽ một cảnh). Cùng nhau, chúng bổ trợ cho vân tay Canvas, vốn dò xét đường kết xuất 2D, và cả hai cùng đóng góp vào bức tranh rộng hơn được mô tả trong hướng dẫn về vân tay trình duyệt của chúng tôi.
Các điểm dữ liệu giàu tín hiệu
Chuỗi nhà sản xuất và bộ kết xuất GPU
Tín hiệu WebGL nhận dạng mạnh nhất chính là chuỗi nhà sản xuất và bộ kết xuất không bị che. Theo mặc định, các tham số tiêu chuẩn VENDOR và RENDERER trả về các giá trị chung chung, nhưng tiện ích mở rộng WEBGL_debug_renderer_info lại phơi bày danh tính phần cứng thực sự — những chuỗi như Google Inc. (NVIDIA) và ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 Direct3D11 vs_5_0 ps_5_0, D3D11).
Chuỗi này thường tiết lộ mẫu GPU, backend kết xuất (Direct3D, Metal, OpenGL qua ANGLE), và đôi khi cả driver. Tự nó thôi đã có thể thu hẹp bạn xuống một nhóm nhỏ người dùng, vì các tổ hợp GPU cộng backend chính xác hiếm gặp hơn nhiều so với người ta tưởng.
Chuỗi đó hiện có thực sự đọc được hay không phụ thuộc rất nhiều vào trình duyệt. Trên Chrome hoặc Edge mặc định thì vẫn đọc được. Brave và Firefox thì ngày càng không — xem phần "Trình duyệt hiện đang ẩn những gì" bên dưới để biết bức tranh theo từng trình duyệt tính đến hiện tại.
Các tiện ích mở rộng được hỗ trợ
WebGL đi kèm một bộ tính năng lõi cùng hàng chục tiện ích mở rộng tùy chọn. Danh sách mà getSupportedExtensions() trả về — và thứ tự của nó — phụ thuộc vào GPU, driver và phiên bản trình duyệt. Hai thiết bị dùng cùng một mẫu GPU trên danh nghĩa vẫn có thể khác nhau ở đây nếu driver hoặc bản dựng trình duyệt của chúng khác nhau, tạo thêm một lớp phân biệt nữa. Điều này khiến nó trở thành mục tiêu ưa thích của kiểu lấy vân tay dựa trên băm: script không cần phân tích danh sách, chỉ cần băm nó — một giá trị băm ổn định cũng tốt như chính chuỗi đó để làm định danh, và đây chính xác là đặc tính mà Brave giờ đây nhắm tới (xem phần "Trình duyệt hiện đang ẩn những gì").
Các tham số số và độ chính xác shader
WebGL phơi bày một danh sách dài các giới hạn số phản ánh khả năng phần cứng: MAX_TEXTURE_SIZE, MAX_VIEWPORT_DIMS, MAX_RENDERBUFFER_SIZE, các dải độ rộng đường và kích thước điểm ở chế độ không khử răng cưa (aliased), và số lượng vector uniform tối đa của vertex shader và fragment shader. Độ chính xác shader — được truy vấn qua getShaderPrecisionFormat() cho các định dạng float và int high/medium/low — bổ sung thêm độ chi tiết, vì hành vi độ chính xác gắn liền với chính con chip silicon.
Băm dựa trên kết xuất
Kỹ thuật mạnh nhất lặp lại chính cách làm của vân tay canvas, nhưng thực hiện qua GPU. Một script kết xuất một cảnh cố tình hóc búa — chuyển sắc, chiếu sáng, độ trong suốt, hình học cong — đọc lại các điểm ảnh bằng readPixels(), rồi băm chúng. Những khác biệt trong làm tròn dấu phẩy động, khử răng cưa và lọc kết cấu giữa các GPU và driver tạo ra một giá trị băm ổn định nhưng khác nhau giữa các họ phần cứng. Vì nó nắm bắt hành vi chứ không chỉ giá trị khai báo, nó khó giả mạo một cách thuyết phục hơn nhiều so với một chuỗi siêu dữ liệu.
Nhìn thực tế vào mã
Đoạn mã dưới đây thu thập các tín hiệu WebGL cốt lõi mà một script vân tay sẽ gom lại. Bạn có thể xem kết quả trực tiếp tương đương cho chính trình duyệt của mình bằng công cụ phát hiện vân tay của BrowserInsight.
function getWebGLFingerprint() {
const canvas = document.createElement('canvas');
const gl =
canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
if (!gl) return { supported: false };
// 1. Nhà sản xuất + bộ kết xuất GPU không bị che qua tiện ích debug
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
const vendor = debugInfo
? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)
: gl.getParameter(gl.VENDOR);
const renderer = debugInfo
? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)
: gl.getParameter(gl.RENDERER);
// 2. Các giới hạn số về khả năng
const params = {
maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),
maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS),
maxRenderbufferSize: gl.getParameter(gl.MAX_RENDERBUFFER_SIZE),
aliasedLineWidth: gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE),
};
// 3. Độ chính xác shader cho định dạng high-float của fragment
const precision = gl.getShaderPrecisionFormat(
gl.FRAGMENT_SHADER,
gl.HIGH_FLOAT
);
// 4. Các tiện ích mở rộng được hỗ trợ (cả sự hiện diện lẫn thứ tự đều có ý nghĩa)
const extensions = gl.getSupportedExtensions();
return {
supported: true,
vendor,
renderer,
params,
precision: { rangeMin: precision.rangeMin, prec: precision.precision },
extensions,
};
}
Một giá trị băm dựa trên kết xuất đi xa thêm một bước: nó biên dịch một shader, vẽ một hình được chiếu sáng kiểu chuyển sắc, gọi gl.readPixels() để đọc dữ liệu vào một mảng có kiểu (typed array), rồi đưa mảng đó qua một hàm băm. Giá trị thu được giữ nguyên đối với thiết bị của bạn nhưng khác nhau giữa các phần cứng.
WebGL bổ sung bao nhiêu entropy
Entropy đo lường mức độ một tín hiệu thu hẹp được bạn là ai. WebGL có giá trị với những kẻ theo dõi chính vì nó mang nhiều entropy và vẫn ổn định: GPU của bạn không thay đổi giữa các lần tải trang, và phần lớn người dùng không bao giờ đổi driver. Chuỗi nhà sản xuất/bộ kết xuất, danh sách tiện ích mở rộng, các giới hạn số và giá trị băm đã kết xuất có tương quan một phần — tất cả đều bắt nguồn từ cùng một phần cứng — nhưng mỗi cái nắm bắt một thứ mà những cái khác bỏ sót.
Trên thực tế WebGL hiếm khi được dùng một mình. Nó được kết hợp với canvas, âm thanh, phông chữ, số đo màn hình và hàng chục thuộc tính khác. Bảng dưới đây đối chiếu các loại tín hiệu WebGL chính và mức độ dễ giả mạo của từng loại.
| Tín hiệu WebGL | Tiết lộ điều gì | Độ ổn định | Độ khó giả mạo |
|---|---|---|---|
| Chuỗi nhà sản xuất / bộ kết xuất | Mẫu GPU + backend kết xuất | Rất cao trên Chrome/Edge; trên Brave 1.93+ là chuỗi chung, không còn nhận dạng được | Dễ ghi đè, nhưng phá vỡ tính nhất quán |
| Tiện ích mở rộng được hỗ trợ | Bộ tính năng driver + trình duyệt | Cao; ngẫu nhiên hóa theo trang trên Brave 1.93+ | Trung bình — danh sách phải tự nhất quán |
| Tham số số | Giới hạn khả năng phần cứng | Rất cao | Trung bình — các giá trị phụ thuộc lẫn nhau |
| Độ chính xác shader | Hành vi dấu phẩy động | Cao | Khó — gắn với silicon thực |
| Băm điểm ảnh đã kết xuất | Hành vi kết xuất GPU thực tế | Cao | Rất khó — phải giả được đầu ra thực |
Vì siêu dữ liệu và đầu ra đã kết xuất phải khớp với nhau, việc giả mạo ngây thơ thường lại làm tăng tính độc nhất: một thiết bị báo cáo chuỗi bộ kết xuất Intel nhưng tạo ra các điểm ảnh kiểu NVIDIA sẽ nổi bật hơn so với một thiết bị chỉ đơn giản nói thật.
Trình duyệt hiện đang ẩn những gì
Các tín hiệu ở trên mô tả hành vi mặc định của nền tảng web. Từng trình duyệt ngày càng đi chệch khỏi mặc định đó, và tính đến tháng 8/2026, khoảng cách giữa "WebGL về lý thuyết có thể đọc được gì" và "trình duyệt thực tế của một người truy cập cụ thể trả về gì" đã rộng hơn bao giờ hết. Ví dụ mới nhất và cụ thể nhất là bản cập nhật quyền riêng tư #38 của Brave, được bật mặc định trong Brave 1.93 trên hai nền tảng mà Brave nêu tên: desktop và Android. Brave mô tả đây là đợt triển khai dần dần, kéo dài vài ngày, nên không phải người dùng nào cũng thấy ngay. Bản cập nhật này thay đổi ba tín hiệu đã nêu ở trên:
- Chuỗi nhà sản xuất và bộ kết xuất bị ẩn danh hóa. Thay vì trả về mẫu GPU thực của bạn qua
WEBGL_debug_renderer_info, giờ đây Brave thayUNMASKED_VENDOR_WEBGL/UNMASKED_RENDERER_WEBGLbằng một chuỗi chung duy nhất, giống hệt nhau cho mọi người dùng Brave. Phần mô tả ở trên vẫn đúng với thực tế trên Chrome và Edge ở cấu hình mặc định — nhưng không còn đúng với Brave nữa. - Thông tin bộ mô tả bộ điều hợp WebGPU bị làm rỗng.
GPUAdapterInfo— phiên bản tương đương của chuỗi nhà sản xuất/bộ kết xuất bên phía WebGPU, phơi bàyvendor,architecturevàdevicenhư các thuộc tính hạng nhất mà không cần bất kỳ tiện ích gỡ lỗi nào — nay bị Brave làm rỗng thay vì để cùng một danh tính phần cứng đó rò rỉ qua một API mới hơn. Chúng tôi trình bày chi tiết bề mặt này trong bài Vân tay WebGPU: GPU ID thế hệ tiếp theo sau WebGL; tóm lại ở đây là: Brave 1.93 đóng nó lại theo đúng cách nó đóng chuỗi nhà sản xuất của WebGL. - Danh sách tiện ích mở rộng bị ngẫu nhiên hóa, chứ không chỉ đơn thuần bị ẩn. Brave đưa tính ngẫu nhiên vào
getSupportedExtensions()để một script lấy vân tay dựa trên băm nhìn thấy một giá trị khác nhau theo từng phiên duyệt web, từng trang (eTLD+1) và từng vùng lưu trữ. Điều này đánh thẳng vào kỹ thuật băm đã mô tả ở trên: giá trị băm chỉ hữu ích như một định danh khi cùng một đầu vào cho ra cùng một giá trị băm trên mọi trang bạn truy cập. Một khi bản thân danh sách tiện ích mở rộng thay đổi theo từng trang, giá trị băm cũng thay đổi theo — nên giá trị mà một bên theo dõi thu thập trên trang A không còn khớp với giá trị thu thập trên trang B nữa, và nó hoàn toàn mất tác dụng như một định danh xuyên trang, dù phần cứng của bạn chưa từng thay đổi.
Việc quy về đúng từng nhà cung cấp ở đây rất quan trọng, vì các biện pháp bảo vệ này không mang tính phổ quát. Brave ẩn danh hóa và ngẫu nhiên hóa theo mặc định từ phiên bản 1.93 trở đi. Firefox đi theo hướng khác: khi bật privacy.resistFingerprinting, nó tắt hẳn WEBGL_debug_renderer_info, nên trong chế độ đó mọi người dùng Firefox đều nhận cùng một giá trị VENDOR/RENDERER chung chung, chứ không phải giá trị ngẫu nhiên hóa. Chrome và Edge mặc định không có cả hai biện pháp bảo vệ này — các chuỗi không bị che và danh sách tiện ích mở rộng thực vẫn đọc được đúng như mô tả ở trên. Không có điều gì trong số này có nghĩa là vân tay số đã bị "giải quyết" ở bất kỳ trình duyệt nào, và chính ghi chú triển khai của Brave cũng nói rõ việc này vẫn đang tiếp cận người dùng theo từng giai đoạn — hãy coi phần này là hiện trạng bảo vệ của một nhà cung cấp cụ thể, chứ không phải hiện trạng của toàn bộ web.
Cũng đáng để biết vì sao một chuỗi có độ nhận dạng cao như vậy lại từng đọc được mà không cần bất kỳ lời nhắc xin quyền nào ngay từ đầu. Câu trả lời nằm ngay trong tên của tiện ích: WEBGL_debug_renderer_info được đặc tả để phục vụ việc gỡ lỗi. Những lỗi kết xuất gắn với phần cứng cụ thể là có thật, và một trang web vẽ nhiều nội dung 3D có lý do chính đáng để ghi log xem tổ hợp GPU và driver nào cho ra hình ảnh hỏng. Nhưng một khi một tiện ích mở rộng đã được phơi bày cho toàn bộ nền tảng web, bất kỳ trang nào cũng có thể gọi nó, chứ không chỉ những trang thực sự cần chẩn đoán — đây chính là khuôn mẫu chung đằng sau phần lớn các tín hiệu vân tay có entropy cao mà không cần xin quyền.
Các trang web sử dụng vân tay WebGL như thế nào
Những mục đích chính đáng rất phổ biến. Các hệ thống chống gian lận và chống bot dùng vân tay WebGL như một trong nhiều tín hiệu để phát hiện lưu lượng tự động, trình duyệt headless và những tài khoản đột nhiên đổi phần cứng. Các đội phân tích và bảo mật dùng nó để gắn cờ các phiên đáng ngờ. Môi trường headless và ảo hóa thường để lộ những chuỗi bộ kết xuất đặc trưng (chẳng hạn các bộ rasterizer phần mềm như SwiftShader hay llvmpipe), và đó là lý do các bộ phát hiện bot dựa rất nhiều vào WebGL.
Logic nhất quán tương tự không chỉ áp dụng cho GPU mà còn mở rộng sang chính trình duyệt: chuỗi bộ kết xuất phải khớp với phần còn lại của môi trường, bao gồm cả engine kết xuất thực sự đã vẽ ra trang. Bạn có thể kiểm tra engine và phiên bản của chính mình — và phát hiện dấu hiệu giả mạo engine — bằng công cụ kiểm tra nhân trình duyệt của BrowserInsight.
Cũng chính khả năng đó tiếp sức cho quảng cáo và theo dõi xuyên trang, bởi một ID ổn định bắt nguồn từ phần cứng sống sót qua việc xóa cookie và các cửa sổ duyệt riêng tư. Bản chất lưỡng dụng đó là lý do vì sao việc hiểu vân tay WebGL lại quan trọng, dù mối quan tâm của bạn là bảo mật hay quyền riêng tư.
Các biện pháp phòng vệ và sự đánh đổi
Không có biện pháp phòng vệ hoàn hảo — mỗi lựa chọn đều đánh đổi đi tính năng, hiệu năng, hoặc khả năng hòa lẫn vào đám đông. Các hướng tiếp cận chính:
Tor Browser
Tor Browser chọn con đường chuẩn hóa: nó đi kèm các thiết lập đồng nhất để mọi người dùng cùng trình ra một vân tay giống nhau, và nó hỏi xác nhận trước khi cho phép WebGL chạy. Mục tiêu không phải là che giấu GPU của bạn mà là làm cho mọi người dùng trông y hệt nhau, đó là mô hình quyền riêng tư mạnh nhất — đổi lại là tốc độ và một số nội dung 3D bị hỏng.
Brave và farbling
Brave thêm một mức ngẫu nhiên hóa nhỏ, có tính xác định, theo từng phiên và từng trang (gọi là "farbling") vào các đầu ra có thể bị lấy vân tay, bao gồm cả dữ liệu đọc lại của WebGL. Mỗi trang thấy một giá trị hơi khác, và nhiễu lại được xáo trộn, nên rất khó dựng nên một ID ổn định xuyên trang trong khi phần lớn trang vẫn hoạt động. Kể từ Brave 1.93, cách tiếp cận này cũng được mở rộng sang lớp siêu dữ liệu — xem chi tiết về việc ẩn danh hóa chuỗi nhà sản xuất/bộ kết xuất và ngẫu nhiên hóa danh sách tiện ích mở rộng ở phần "Trình duyệt hiện đang ẩn những gì" bên trên.
Tắt WebGL
Tắt hẳn WebGL (qua các cờ hoặc webgl.disabled) loại bỏ hoàn toàn bề mặt này. Cách này hiệu quả nhưng cứng nhắc: bản thân sự vắng mặt của WebGL đã là điều khá bất thường và có thể làm hỏng bản đồ, trò chơi và các công cụ trực quan hóa.
Giả mạo giá trị — và vì sao nó phản tác dụng
Các tiện ích mở rộng ghi đè chuỗi bộ kết xuất hoặc chèn nhiễu có thể giúp ích, nhưng đi kèm rủi ro thực sự. Nếu siêu dữ liệu giả mạo mâu thuẫn với các điểm ảnh đã kết xuất hoặc các giới hạn số, một bộ phát hiện tinh vi sẽ nhận ra sự bất nhất, và bạn trở nên dễ nhận diện hơn chứ không phải khó hơn. Cách giả mạo an toàn nhất là nhất quán và được nhiều người dùng chia sẻ; việc ngẫu nhiên hóa tùy tiện theo từng người mà không có sự phối hợp thường đạt được điều ngược lại với mục đích.
Bài học thực dụng: hãy chọn một biện pháp phòng vệ mà nhiều người khác cũng dùng (sự đồng nhất của Tor, farbling của Brave) thay vì một cấu hình riêng khiến bạn trở nên độc nhất. Để biết bạn đang ở đâu ngay lúc này, hãy chạy công cụ phát hiện vân tay của BrowserInsight và xem lại bộ kết xuất WebGL, các tiện ích mở rộng và giá trị băm của mình.
WebGL cũng không phải là điểm cuối của việc lấy vân tay GPU. API WebGPU mới hơn tiết lộ nhà sản xuất bộ điều hợp, kiến trúc và chuỗi thiết bị như các thuộc tính hạng nhất — không cần bất kỳ tiện ích mở rộng gỡ lỗi nào. Cho đến gần đây, đây vẫn là một bề mặt phong phú hơn WebGL mà hầu hết các công cụ quyền riêng tư chưa đụng tới; Brave 1.93 đóng nó lại bằng cách làm rỗng các bộ mô tả bộ điều hợp đó, trong khi các trình duyệt khác hiện vẫn để lộ thông tin này.
Ngẫu nhiên hóa không đồng nghĩa với ẩn danh
Không biện pháp phòng vệ nào ở trên khiến bạn hoàn toàn "vô hình", và điều này đáng được nói rõ. Một biện pháp phòng vệ khiến trình duyệt của bạn trở nên hiếm gặp — một tổ hợp giá trị ngẫu nhiên hóa mà không ai khác có — có thể có độ nhận dạng cao chẳng kém gì tín hiệu mà nó vốn nhằm che giấu — vì cùng lý do mà một bộ đồ hóa trang không ai khác mặc lại càng khiến bạn bị chú ý. Chúng tôi bàn về sự đánh đổi này, và cách suy nghĩ về nó, trong bài Cover Your Tracks: điểm độc nhất không chứng minh điều gì. Khái niệm nền tảng — cần bao nhiêu người khác trông giống hệt bạn trước khi một tín hiệu không còn hữu ích để nhận diện lại bạn — được giải thích trong bài Entropy dấu vân tay trình duyệt và tập ẩn danh là gì. Tính đồng nhất (Tor, và giờ là chuỗi nhà sản xuất đã bị ẩn danh hóa của Brave) có tác dụng vì nó giữ bạn ở trong một đám đông lớn; ngẫu nhiên hóa theo từng người dùng chỉ có tác dụng nếu đủ nhiều người khác cũng làm như vậy.
Câu hỏi thường gặp
Một trang web có đọc được chính xác mẫu GPU của tôi không?
Điều đó phụ thuộc vào trình duyệt của bạn. Tiện ích mở rộng WEBGL_debug_renderer_info phơi bày một chuỗi bộ kết xuất không bị che mà thường nêu rõ mẫu GPU và backend kết xuất của bạn, và trên cấu hình Chrome hay Edge mặc định thì nó vẫn đọc được mà không cần bất kỳ lời nhắc xin quyền nào. Firefox tắt tiện ích mở rộng này khi bật privacy.resistFingerprinting, và tính đến Brave 1.93 (tháng 8/2026), Brave thay nó bằng một chuỗi chung mà mọi người dùng Brave đều có — xem phần "Trình duyệt hiện đang ẩn những gì" ở trên để biết bức tranh đầy đủ theo từng trình duyệt.
Vân tay WebGL có còn hoạt động ở chế độ riêng tư/ẩn danh không?
Có. Duyệt riêng tư xóa cookie và lịch sử nhưng không thay đổi phần cứng của bạn. Các tín hiệu WebGL — nhà sản xuất, bộ kết xuất, tiện ích mở rộng, giới hạn số và giá trị băm đã kết xuất — vẫn giống nhau giữa cửa sổ thường và cửa sổ riêng tư, nên chúng có thể nhận diện lại bạn ở cả hai.
Tắt WebGL có đủ để chặn vân tay số không?
Nó loại bỏ bề mặt WebGL, nhưng không loại bỏ vân tay số nói chung. Canvas, âm thanh, phông chữ, màn hình và các tín hiệu khác vẫn áp dụng, và sự vắng mặt nổi bật của WebGL bản thân nó cũng có thể là một đặc điểm phân biệt. Tắt nó là một lớp, chứ không phải một giải pháp trọn vẹn.
Vân tay WebGL khác vân tay canvas như thế nào?
Vân tay canvas dò xét đường kết xuất 2D, trong khi WebGL dò xét đường 3D do GPU dẫn động và còn phơi bày siêu dữ liệu phần cứng tường minh (nhà sản xuất, bộ kết xuất, giới hạn khả năng). Chúng có tương quan nhưng khác biệt, và đó là lý do những kẻ theo dõi thu thập cả hai để có độ tin cậy cao hơn.


