---
url: 'https://www.corbado.com/vi/blog/client-hints-user-agent-chrome-safari-firefox'
title: 'Client Hints và User-Agent trong Chrome, Safari & Firefox'
description: 'Tìm hiểu về hỗ trợ User-Agent và Client Hints API trong Chrome, Safari & Firefox và cách chúng tôi sử dụng chúng cho passkey và phát hiện thiết bị trong các thành phần JavaScript.'
lang: 'vi'
author: 'Vincent Delitz'
date: '2026-07-27T08:25:48.663Z'
lastModified: '2026-07-27T08:25:48.663Z'
keywords: 'giảm bớt user-agent, user-agent, client hints, user-agent client hints api, client hints api, hỗ trợ client hints trên trình duyệt, chuỗi user agent, client hints chrome'
category: 'Engineering'
---

# Client Hints và User-Agent trong Chrome, Safari & Firefox

## Key Facts

- Việc **giảm bớt User-Agent** đã hoàn tất trên tất cả các trình duyệt lớn: Chrome và Edge kể từ năm 2023, Firefox hoàn tất một phần và Safari đã đóng băng kể từ iOS 26 phát hành vào tháng 9 năm 2025.
- **Firefox không hỗ trợ Client Hints** hoặc `navigator.userAgentData`, yêu cầu các nhà phát triển phải chuyển sang sử dụng phương pháp phân tích chuỗi User-Agent cổ điển trên trình duyệt của Mozilla.
- API JavaScript **`getHighEntropyValues()`** chỉ truy cập dữ liệu thiết bị có entropy cao trong các trình duyệt Chromium. Safari và Firefox hoàn toàn thiếu API này.
- Không thể phân biệt **Windows 10 và Windows 11** chỉ qua chuỗi User-Agent. Chỉ Client Hints trên Chrome và Edge mới có thể tiết lộ phiên bản nền tảng thực tế.
- Corbado sử dụng Client Hints cho **thông tin passkey**: phát hiện thiết bị mới và đánh giá tính đủ điều kiện xác thực trên nhiều thiết bị, đặc biệt là để phân biệt các phiên bản Windows.

## 1. Giới thiệu: Client Hints và việc giảm bớt User-Agent là gì?

Các phương pháp để phát hiện và phản hồi với các môi trường người dùng khác nhau đang liên tục thay đổi. Theo truyền thống, **chuỗi User-Agent** là cách để xác định trình duyệt và thông tin thiết bị, cho phép các trang web tùy chỉnh trải nghiệm tương ứng. Tuy nhiên, các chuỗi này thường được sử dụng để lấy dấu vân tay và xác định người dùng mà không có sự đồng ý của họ cho các mục đích tiếp thị, làm dấy lên những lo ngại về quyền riêng tư.

Trong bối cảnh này, **Client Hints dưới dạng API JavaScript** đã nổi lên như một công cụ, cung cấp một cách chia sẻ thông tin cần thiết về thiết bị và tùy chọn của người dùng được kiểm soát hơn và tôn trọng quyền riêng tư hơn. Bài viết này tập trung vào **hậu quả của việc giảm bớt User-Agent** và khám phá cách Client Hints giúp thích ứng với tình hình mới này.

Các điểm chính chúng ta sẽ giải quyết:

- **Việc giảm bớt User-Agent là gì:** Hiểu về sự chuyển đổi sang các chuỗi User-Agent bị giảm bớt và ý nghĩa của nó.
- **Client Hints hoạt động như thế nào:** Khám phá các cơ chế đằng sau Client Hints và cách chúng có thể được triển khai hiệu quả.

Vì các trình duyệt và hệ điều hành có quan điểm khác nhau và điều chỉnh cách tiếp cận của họ một cách khác nhau, các nhà phát triển phần mềm phải đối mặt với thách thức đảm bảo các ứng dụng của họ vẫn có thể phát hiện và phản hồi chính xác với các môi trường người dùng khác nhau trên các trình duyệt và hệ điều hành.

Bài viết này nhằm mục đích cung cấp một cái nhìn tổng quan toàn diện về những thay đổi này, đưa ra những hiểu biết sâu sắc và hướng dẫn thực tế để giúp các nhà phát triển trong trường hợp trường hợp sử dụng hoặc phần mềm của họ phụ thuộc vào chi tiết thiết bị hoặc hệ điều hành (ví dụ: quản lý thiết bị chi tiết, phát hiện các thiết bị đã biết, ngăn chặn gian lận hoặc các tính năng phát hiện khác) hoặc giống như trường hợp của chính chúng tôi là **tối ưu hóa trải nghiệm passkey với User-Agent và Client Hints**.

Trước khi đi sâu vào các chi tiết kỹ thuật về Client Hints, chúng ta sẽ khám phá ngắn gọn lịch sử của User-Agent và cách các nỗ lực giảm bớt User-Agent khác nhau hoạt động.

### 1.1 Lịch sử tóm tắt của User-Agent

Lịch sử của các chuỗi User-Agent có thể bắt nguồn từ khi bắt đầu có các trình duyệt web đầu tiên. Tim Berners-Lee đã phát triển trình duyệt web đầu tiên, WorldWideWeb (sau này được đổi tên thành Nexus) vào năm 1990. Ngay sau đó là các trình duyệt tiên phong khác như Line Mode Browser vào năm 1991, và tiếp theo là các trình duyệt như MidasWWW, ViolaWWW, Erwise và Cello xuất hiện.

Năm 1993, việc phát hành [NCSA Mosaic](https://en.wikipedia.org/wiki/NCSA_Mosaic), thường được gọi đơn giản là Mosaic, được cho là đã châm ngòi cho sự bùng nổ ban đầu của web. Chuỗi User-Agent của Mosaic khá đơn giản, thường được định dạng là `NCSA_Mosaic/1.0` có tên sản phẩm theo sau là dấu gạch chéo và số phiên bản tùy chọn.

Ban đầu, **trường User-Agent được giới thiệu cho mục đích phân tích và giúp xác định các sự cố**. Nó được khuyến nghị rõ ràng rằng trường này "nên được đưa vào" trong các yêu cầu HTTP, như đã lưu ý trong kho lưu trữ HTTP của W3C từ năm 1992. Trường đơn giản này cung cấp một cách đơn giản nhưng hiệu quả để truyền đạt tên sản phẩm và phiên bản, hỗ trợ việc hiểu và khắc phục các sự cố liên quan đến trình duyệt.

Khi web phát triển, sự phức tạp và việc sử dụng các chuỗi User-Agent cũng tăng theo. Chúng trở nên chi tiết hơn và bắt đầu bao gồm rất nhiều thông tin về trình duyệt, hệ điều hành và thiết bị. Mặc dù thông tin này rất có giá trị đối với phân tích web và tối ưu hóa trải nghiệm người dùng, nó cũng đặt ra **những lo ngại đáng kể về quyền riêng tư**. Các chuỗi User-Agent chi tiết **cho phép lấy dấu vân tay thiết bị**, tạo điều kiện cho các nhà quảng cáo và người theo dõi tạo ra các hồ sơ độc đáo về người dùng và theo dõi các hoạt động trực tuyến của họ trên các trang web khác nhau.

Trong kỷ nguyên hiện đại, nơi quyền riêng tư đã trở thành mối quan tâm quan trọng của người dùng cũng như các cơ quan quản lý, bản chất chi tiết của các chuỗi User-Agent ngày càng bị coi là có vấn đề. Nhận thức này đã dẫn đến những nỗ lực làm giảm độ chi tiết của các chuỗi User-Agent, nhằm tạo ra sự cân bằng giữa việc cung cấp thông tin cần thiết cho chức năng web và bảo vệ quyền riêng tư của người dùng.
Sự chuyển đổi này đánh dấu sự khởi đầu của **việc giảm bớt User-Agent, một phong trào hướng tới việc giảm thiểu thông tin được chia sẻ trong các chuỗi User-Agent để giảm thiểu rủi ro về quyền riêng tư và tăng cường bảo mật**.

### 1.2 Giới thiệu về việc giảm bớt User-Agent & Client Hints

Phong trào giảm bớt User-Agent bắt đầu như một phản ứng trước những lo ngại về quyền riêng tư ngày càng tăng. Dưới đây là tổng quan theo trình tự thời gian về các mốc quan trọng trong quá trình phát triển này:

#### 1.2.1 User-Agent trong Safari

Năm 2017, Apple đã khởi xướng [phong trào giảm bớt User-Agent bằng một bài đăng nổi tiếng trên Twitter](https://x.com/rmondello/status/943545865204989953) công bố rằng Safari sẽ đóng băng chuỗi User-Agent trong Safari Technology Preview 46 (STP 46), nhằm chống lại việc lấy dấu vân tay và cải thiện quyền riêng tư.

![twitter safari user agent reduction](https://www.corbado.com/website-assets/twitter_user_agent_d4776d2a35.png)

Tuy nhiên, quyết định này sau đó đã bị đảo ngược một phần vào năm 2021 do các vấn đề tương thích đáng kể với các trang web phụ thuộc vào thông tin User-Agent cập nhật.

#### 1.2.2 User-Agent trong Chrome (+ Edge)

Vào năm 2019/2020, [Google đã công bố kế hoạch](https://groups.google.com/a/chromium.org/g/blink-dev/c/-2JIRNMWJ7s/m/u-YzXjZ8BAAJ) nhằm giảm độ chi tiết của các chuỗi User-Agent trong Chrome, giới thiệu [User-Agent Client Hints (UA-CH)](https://chromestatus.com/feature/5704553745874944) như một cách linh hoạt và được kiểm soát để yêu cầu thông tin trình duyệt và thiết bị cụ thể. Google bắt đầu thử nghiệm việc giảm bớt User-Agent trong các phiên bản Chrome Canary và Beta, thu thập phản hồi để đảm bảo khả năng tương thích và chức năng, và đã [hoàn tất vào năm 2023](https://www.chromium.org/updates/ua-reduction/) cho Android và tất cả các nền tảng Chrome khác. Đồng thời, Chrome **đã giới thiệu Client Hints** như một cách mới để truy cập thông tin đó. Vì Microsoft Edge dựa trên Chromium, Microsoft Edge hoạt động giống như Chrome trên tất cả các nền tảng.

#### 1.2.3 User-Agent trong Firefox

Năm 2021, Mozilla đã tham gia nỗ lực này, dần dần giảm độ chi tiết của chuỗi User-Agent nhưng Mozilla quyết định **không hỗ trợ Client Hints trong Firefox**.

#### 1.2.4 User-Agent Ngày nay (Cập nhật tháng 9 năm 2025)

- **Việc giảm bớt User-Agent khác nhau tùy theo trình duyệt:** Chromium (Chrome, Edge) đã triển khai giảm bớt UA hoàn toàn với hỗ trợ Client Hints. Tuy nhiên, Safari sử dụng cách tiếp cận UA bị đóng băng của riêng mình mà không áp dụng UA-CH, và Firefox chưa triển khai `navigator.userAgentData`. Hệ sinh thái vẫn bị phân mảnh.

- **Client Hints đã phát triển trong Chromium:** Tất cả các trình duyệt vẫn gửi một tiêu đề User-Agent, nhưng trong hầu hết chúng, nó được đóng băng ở một phiên bản cũ hơn (xem bảng bên dưới). Đối với Chromium, Client Hints có thể được sử dụng để có thêm thông tin.

Hãy xem các trình duyệt hiện đang gửi những gì dưới dạng User-Agent trong chương tiếp theo.

## 2. Việc giảm bớt User-Agent là gì?

Khi nói về việc giảm bớt User-Agent, ý nghĩa là **giảm thông tin** trong chuỗi User-Agent. Hãy đi sâu hơn để tìm hiểu những gì được nhúng vào User-Agent trước khi bị giảm bớt.

### 2.1 User-Agent cổ điển là gì?

Một chuỗi User-Agent cổ điển thường bao gồm các thành phần sau, có thể được sử dụng để phát hiện chức năng:

`Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.2.1.0 Mobile Safari/537.36`

- **Hệ điều hành:** Tên của hệ điều hành (ví dụ: Windows, macOS, Linux).
- **Số phiên bản hệ điều hành:** Phiên bản cụ thể của hệ điều hành.
- **Tên trình duyệt:** Tên của trình duyệt (ví dụ: Chrome, Firefox, Safari).
- **Phiên bản trình duyệt:** Phiên bản cụ thể của trình duyệt.
- **Kiến trúc:** Kiến trúc của hệ thống (ví dụ: x86, ARM).
- **Loại/Mô hình thiết bị:** Thông tin về loại hoặc mô hình thiết bị (ví dụ: iPhone, Pixel).
- **Thông tin khác:** Phần này có thể bao gồm các chi tiết bổ sung như nền tảng, số hiệu bản dựng (build number), v.v.

#### 2.1.1 Tại sao sử dụng User-Agent để phát hiện tính năng?

Trong lịch sử, các chuỗi User-Agent thường được sử dụng để phát hiện tính năng và nền tảng, cho phép các trang web điều chỉnh nội dung và chức năng của họ dựa trên các đặc điểm thiết bị và trình duyệt được phát hiện (ví dụ: xác định bản tải xuống nào cho một nhị phân cụ thể để cung cấp). Điều này trở nên đặc biệt quan trọng với sự gia tăng của điện thoại di động và máy tính bảng đối với các bố cục không được xây dựng với tính năng phản hồi (responsive) để có thể chuyển hướng điện thoại di động đến phiên bản cụ thể của chúng.

Tuy nhiên, cách tiếp cận này hiện được **coi là không tối ưu, vì nó dựa trên các giả định về khả năng của trình duyệt có thể không đúng hoặc không đủ cụ thể**. Các thực tiễn phát triển web hiện đại ủng hộ việc sử dụng **phát hiện tính năng thông qua các API trình duyệt** ở những nơi có thể để kiểm tra trực tiếp các tính năng và khả năng cụ thể của trình duyệt. Phương pháp này đáng tin cậy hơn và đảm bảo rằng các trang web hoạt động chính xác bất kể chuỗi User-Agent hoặc phiên bản trình duyệt. Việc phát hiện tính năng tập trung vào khả năng thực tế của trình duyệt, cung cấp một cách thức mạnh mẽ hơn và đáp ứng tốt hơn trong tương lai để xử lý sự khác biệt trong hành vi và chức năng của trình duyệt.

Cho đến nay, điều này vẫn chưa hoàn toàn khả thi vì các API trình duyệt mới để phát hiện chức năng được triển khai vào các thời điểm khác nhau và thường có cách tiếp cận khác nhau giữa các nhóm trình duyệt lớn hơn (ví dụ: các trình duyệt dựa trên Chromium) và nhỏ hơn (ví dụ: Firefox).

#### 2.1.2 Hiểu về Entropy trong việc lấy dấu vân tay: Tại sao cung cấp nhiều thông tin lại là một vấn đề?

Nhiều thông tin hơn mang lại cho một trang web khả năng rộng hơn để tạo dấu vân tay với nhiều "entropy" hơn. Entropy trong ngữ cảnh này là lượng biến thể có thể được sử dụng để tạo ra một dấu vân tay duy nhất giữa những khách truy cập khác nhau từ một trang web.

Một dấu vân tay có thể được sử dụng cho các mục đích khác nhau. Nó có thể được sử dụng cho các mục đích bảo vệ như phát hiện gian lận và ngăn chặn việc chiếm đoạt tài khoản bằng cách xác định các thiết bị mới, nhưng nó cũng có thể được sử dụng để xác định khách truy cập mà không có sự đồng ý của họ hoặc để nhắm mục tiêu quảng cáo cụ thể hơn.

Trong bối cảnh các chuỗi User-Agent, entropy đề cập đến lượng thông tin duy nhất, có thể nhận dạng được có thể được sử dụng để theo dõi và phân biệt người dùng cá nhân.

- **Thông tin entropy cao:** Chẳng hạn như các phiên bản trình duyệt và hệ điều hành cụ thể, góp phần đáng kể vào tính độc đáo của dấu vân tay của người dùng, giúp dễ dàng theo dõi họ trên các trang web khác nhau.
- **Thông tin entropy thấp:** Tên trình duyệt chung hoặc tên hệ điều hành, cung cấp dữ liệu ít chi tiết hơn và ít đóng góp vào việc theo dõi người dùng hơn vì có nhiều người dùng sử dụng các kết hợp đó.

Có rất nhiều thông tin bổ sung có thể được sử dụng làm nguồn entropy bên dưới User-Agent. Ví dụ: bạn có thể tìm thấy các nguồn entropy khác nhau trên [https://coveryourtracks.eff.org](https://coveryourtracks.eff.org).

### 2.2 Giảm bớt Entropy của User-Agent

Do đó, khi các trình duyệt nói về việc giảm bớt User-Agent, họ chủ yếu nhắm mục tiêu vào việc giảm thông tin có entropy cao. Dưới đây là các ví dụ khác nhau về việc giảm bớt:

#### 2.2.1 Ví dụ 1: Việc giảm bớt User-Agent của Chrome

Dưới đây, bạn sẽ tìm thấy một ví dụ về việc giảm bớt User-Agent trên Chrome của Google trên điện thoại Android:

**Trước đây:**
`Mozilla/5.0 (Linux; Android <span style={{color: '#016F01' }}>13; Pixel 7</span>) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36`

**Sau này:**
`Mozilla/5.0 (Linux; Android <span style={{color: '#016F01' }}>10; K</span>) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36`

Định dạng của User-Agent không thay đổi để không can thiệp vào logic phân tích cú pháp hiện có của các thư viện. Các giá trị sau đã bị giảm bớt:

- Phiên bản hệ điều hành
- Phiên bản phụ của trình duyệt
- Mô hình phần cứng ![user agent](https://www.corbado.com/website-assets/user_agent_0fe7987aff.png)

Đồ họa nêu chi tiết những giá trị nào sẽ tiếp tục được cập nhật dựa trên hệ điều hành và các giá trị màu xanh lá cây cho biết những giá trị nào sẽ không đổi trên tất cả các nền tảng. Đối với các giá trị hệ điều hành khác nhau, sẽ chỉ có một biến thể không đổi:

| **Hệ điều hành** | **Tên bị giảm bớt/cố định** |
| ---------------- | --------------------------- |
| Mac              | Macintosh; Intel Mac OS X 10_15_7 |
| Windows          | Windows NT 10.0; Win64; x64 |
| ChromeOS         | X11; CrOS x86_64 14541.0.0 |
| Linux            | X11; Linux x86_64 |
| Android          | Linux; Android 10; K |
| iOS              | giảm bớt (iOS 26+) |

#### 2.2.2 Ví dụ 2: Việc giảm bớt User-Agent của Firefox

Dưới đây, bạn sẽ tìm thấy một ví dụ về việc giảm bớt User-Agent của Mozilla Firefox tuân theo hầu hết các quan điểm của Google về việc giảm bớt User-Agent.

Đây là một ví dụ về User-Agent trên Windows 11 với phiên bản Firefox hiện tại:

`Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0`

Trong User-Agent này, Kiến trúc CPU, phiên bản hệ điều hành và phiên bản phụ của trình duyệt đã bị đóng băng.

#### 2.2.3 Ví dụ 3: Việc giảm bớt User-Agent của Safari trên macOS

Dưới đây, bạn sẽ tìm thấy một ví dụ về việc giảm bớt User-Agent của Safari trên macOS.

Đầu tiên, hãy bắt đầu với **User-Agent của Safari trên macOS Sonoma Phiên bản 14.5** trên Mac Silicon M2.

`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15`

Bạn có thể thấy rằng Phiên bản macOS được giới hạn ở mức `10_15_07` và kiến trúc cũng được cố định thành `Intel` mà không báo cáo kiến trúc CPU Mac. Điều này cũng đúng với Firefox và [Chrome](https://issues.chromium.org/issues/40167872) trên macOS.

#### 2.2.4 Ví dụ 4: User-Agent của Safari trên iOS (Hiện đã bị giảm bớt trong iOS 26+)

Trước iOS 26 (phát hành vào tháng 9 năm 2025), Safari trên iOS hiển thị phiên bản hệ điều hành thực tế. Tuy nhiên, **Apple hiện đã đóng băng User-Agent iOS/iPadOS** trong Safari 26, tương tự như macOS. Ví dụ dưới đây cho thấy User-Agent trước iOS 26:

`Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1`

**Lưu ý:** Kể từ iOS 26, tất cả các trình duyệt trên iOS (Chrome, Firefox, Safari) hiện có chuỗi User-Agent bị đóng băng, tương tự như macOS. Các ví dụ bên dưới hiển thị hành vi trước iOS 26:

`Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/126.0.6478.153 Mobile/15E148 Safari/604.1`

`Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/127.1 Mobile/15E148 Safari/605.1.15`

### 2.3 Các hạn chế về phát hiện với việc giảm bớt User-Agent

Nhìn chung, rõ ràng là User-Agent bị giảm bớt đặc biệt về thông tin có entropy cao. Tổng quan sau đây cho thấy User-Agent bị giảm bớt trên các nền tảng/hệ điều hành kết hợp nào.

| **Trình duyệt**  | **Windows** | **MacOS** | **iOS** | **Android** |
| ---------------- | ----------- | --------- | ------- | ----------- |
| Chrome           | bị giảm bớt | bị giảm bớt | bị giảm bớt (iOS 26+) | bị giảm bớt |
| Edge             | bị giảm bớt | bị giảm bớt | bị giảm bớt (iOS 26+) | bị giảm bớt |
| Firefox          | bị giảm bớt | bị giảm bớt | bị giảm bớt (iOS 26+) | bị giảm bớt |
| Safari           | -           | bị giảm bớt* | bị giảm bớt (Safari 26+)** | -           |
| Samsung Internet | -           | -         | -       | bị giảm bớt |
| WebViews         | -           | -         | bị giảm bớt (iOS 26+) | không bị giảm bớt (≥ 16: bị giảm bớt) |

Do đó, các vấn đề phát hiện quan trọng nhất với User-Agent bị giảm bớt là (* = xem nhận xét bên dưới cho phiên bản macOS):

- **Không thể phân biệt Windows 10 và Windows 11:** Bạn không thể phân biệt hệ thống Windows 10 và Windows 11 chỉ dựa vào User-Agent nữa.
- **Không thể phân biệt thiết bị Android và phiên bản hệ điều hành:** Trái ngược với Apple, Android từng đưa mô hình phần cứng thực tế vào User-Agent. Điều này không còn đúng nữa. Do đó, các mô hình phần cứng khác nhau không thể được phân biệt chỉ qua User-Agent nữa. Với Apple điều này chưa bao giờ là có thể.
- **Không thể phân biệt phiên bản macOS và kiến trúc:** Không có cách nào để phân biệt các phiên bản macOS và kiến trúc nền tảng dựa trên User-Agent.
- **(*) Phiên bản macOS trên Safari:** Safari đã đóng băng phiên bản hệ điều hành nhưng tiếp tục hiển thị Phiên bản Safari. Tại thời điểm viết bài cho bản 10.15 trở lên, việc trừ đi ba từ phiên bản Safari để phát hiện Phiên bản MacOS chính là an toàn.
- **(**) Phiên bản iOS trên Safari 26+:** Kể từ iOS 26 (tháng 9 năm 2025), Apple đã đóng băng User-Agent iOS/iPadOS, tương tự như macOS. Phiên bản OS không còn được hiển thị nữa.

Đây là bảng ánh xạ các phiên bản macOS với các phiên bản Safari tương ứng:

| **Phiên bản macOS**    | **Phiên bản Safari** | **Năm phát hành** |
| ---------------------- | -------------------- | ----------------- |
| macOS Sequoia (15)     | Safari 18            | 2024              |
| macOS Sonoma (14)      | Safari 17            | 2023              |
| macOS Ventura (13)     | Safari 16            | 2022              |
| macOS Monterey (12)    | Safari 15            | 2021              |
| macOS Big Sur (11)     | Safari 14            | 2020              |
| macOS Catalina (10.15) | Safari 13            | 2019              |

Có nhiều cách khác để phát hiện hệ điều hành và trình duyệt dựa trên các kỹ thuật lấy dấu vân tay phức tạp, như lấy dấu vân tay TLS. Vì có những tình huống hợp lệ khi việc phát hiện hệ điều hành sâu hơn sẽ có ý nghĩa, Google đã giới thiệu Client Hints để có thể nhận thông tin này qua lập trình. Chúng ta sẽ xem cách Client Hints hoạt động trong chương tiếp theo.

## 3. Client Hints hoạt động như thế nào?

Client Hints cho phép các trang web truy cập thông tin có entropy cao đã bị xóa khỏi chuỗi User-Agent theo cách thân thiện với quyền riêng tư. Có hai phương pháp chính để truy cập Client Hints:

- **HTTP Header**: Sử dụng các tiêu đề yêu cầu HTTP, chỉ khả dụng cho các bối cảnh bên thứ nhất.
- **JavaScript API**: Sử dụng một API JavaScript, có thể được sử dụng bởi một kịch bản nhúng.

Client hints cũng có thể được sử dụng để truy xuất thông tin entropy thấp đã được bao gồm trong User-Agent. Điều này ngụ ý rằng trên Chrome, nơi Client Hints được hỗ trợ, user-agents không còn cần thiết nữa.

### 3.1 Những Client Hints nào tồn tại?

Tùy thuộc vào phương pháp truy cập nào được sử dụng, việc đặt tên của Client hints có đôi chút khác biệt. Chúng tôi đã liệt kê tên quan trọng nhất của các Client Hints:
![client hints](https://s3.eu-central-1.amazonaws.com/corbado-cloud-staging-website-assets/client_hints_f186bae2e2.jpg)

| **HTTP UA-CH token**       | **UA-CH JS API**             | **Entropy** |
| -------------------------- | ---------------------------- | ----------- |
| Sec-CH-UA-Platform-Version | UADataValues.platformVersion | Cao         |
| Sec -CH-UA-Mobile          | NavigatorUAData.mobile       | Thấp        |
| Sec-CH-UA-Model            | UADataValues.model           | Cao         |
| Sec-CH-UA                  | NavigatorUAData.brands       | Thấp        |
| Sec-CH-UA-Arch             | UADataValues. architecture   | Cao         |

### 3.2 Cách truy cập Client Hints qua Tiêu đề Yêu cầu HTTP

Trong bối cảnh bên thứ nhất, các trang web có thể yêu cầu thông tin cụ thể về trình duyệt và thiết bị của người dùng bằng cách sử dụng các tiêu đề yêu cầu HTTP. Cách tiếp cận này liên quan đến việc đặt tiêu đề chính xác trong phản hồi HTTP của máy chủ, cho biết máy chủ quan tâm đến Client Hints nào. Trình duyệt sau đó bao gồm các gợi ý này trong các yêu cầu tiếp theo đến cùng một nguồn gốc.

Tiêu đề này báo hiệu cho trình duyệt gửi thông tin chi tiết về người dùng trong các yêu cầu trong tương lai, cho phép máy chủ điều chỉnh các phản hồi cho phù hợp. Phương pháp này đảm bảo rằng thông tin chi tiết về người dùng chỉ có thể truy cập được đối với trang web bên thứ nhất, ngăn chặn các tài nguyên của bên thứ ba lấy được dữ liệu có entropy cao. Có hai loại tiêu đề yêu cầu có sẵn mà chúng ta sẽ thảo luận bây giờ:

- Tiêu đề Regular Client Hint
- Tiêu đề Critical (Client) Hint

#### 3.2.1 Cách sử dụng Tiêu đề Regular Client Hint?

Regular Client Hints là các tiêu đề mà máy chủ có thể yêu cầu từ trình duyệt để thu thập thông tin về môi trường của người dùng **trong các yêu cầu tiếp theo**.

**Ví dụ: Chrome trên macOS 14.5 với Regular Client Hints trên corbado.com**

1. Trong yêu cầu đầu tiên cho Corbado.com, Chrome sẽ bao gồm các tiêu đề entropy thấp sau đây vì thông tin này cũng được bao gồm trong User-Agent.

| **Tiêu đề**        | **Giá trị**                                                       |
| ------------------ | ----------------------------------------------------------------- |
| Sec-Ch-Ua          | "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24" |
| Sec-Ch-Ua-Mobile   | ?0                                                                |
| Sec-Ch-Ua-Platform | "macOS"                                                           |

2. Giả sử Corbado.com muốn nhận được phiên bản hệ điều hành (phiên bản nền tảng) trên **các yêu cầu tiếp theo.** Do đó, nó sẽ thiết lập tiêu đề “Sec-CH-UA-Platform-Version” thích hợp trong phản hồi cho yêu cầu đầu tiên:

| **Tiêu đề** | **Giá trị**                |
| ----------- | -------------------------- |
| Accept-CH   | Sec-CH-UA-Platform-Version |

3. Trên **các yêu cầu tiếp theo**, Corbado.com sau đó sẽ nhận được một tiêu đề bổ sung cùng với phiên bản nền tảng:

| **Tiêu đề**        | **Giá trị**                                                       |
| ------------------ | ----------------------------------------------------------------- |
| Sec-Ch-Ua          | "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24" |
| Sec-Ch-Ua-Mobile   | ?0                                                                |
| Sec-Ch-Ua-Platform | "macOS"                                                           |
| Sec-Ch-Ua-Platform | "14.5.0"                                                          |

Đồng thời, User-Agent cho yêu cầu này sẽ vẫn giữ nguyên (không có phiên bản nền tảng):

`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36`

Sử dụng [https://user-agent-client-hints.glitch.me/headers](https://user-agent-client-hints.glitch.me/headers), bạn có thể thử xem các bố cục thông tin khác nhau sẽ như thế nào đối với các gợi ý thông thường (hãy nhớ **bạn phải sử dụng Chrome**). Xem [tại đây](https://github.com/WICG/ua-client-hints) để biết thêm chi tiết. Trong trường hợp corbado.com cần thông tin này ngay trong lần tải trang đầu tiên, việc sử dụng các Client Hints thông thường này sẽ không đủ, nhưng có một cách để đẩy nhanh quá trình này bằng các Critical (client) hints.

#### 3.2.2 Cách sử dụng Tiêu đề Critical (Client) Hint?

Giả sử [corbado.com](https://corbado.com) sẽ cần phiên bản nền tảng trên yêu cầu đầu tiên để hiển thị trang tải xuống thích hợp được thiết kế riêng cho phiên bản macOS chính xác. Nó có thể sử dụng các Critical (client) hints, điều này sẽ dẫn đến **việc thử lại yêu cầu ngay lập tức** để chỉ hiển thị trang có chứa tiêu đề:

**Ví dụ: Chrome trên macOS 14.5 với Critical Client Hints trên corbado.com**

1. Trong yêu cầu đầu tiên cho corbado.com, Chrome sẽ bao gồm các tiêu đề entropy thấp sau đây vì thông tin này cũng được bao gồm trong User-Agent.

| **Tiêu đề**        | **Giá trị**                                                       |
| ------------------ | ----------------------------------------------------------------- |
| Sec-CH-UA          | "Google Chrome";v="125", "Chromium";v="125", "Not_A/Brand";v="24" |
| Sec-CH-UA-Mobile   | ?0                                                                |
| Sec-CH-UA-Platform | "macOS"                                                           |

2. Giả sử corbado.com muốn nhận được phiên bản hệ điều hành (phiên bản nền tảng) vào **lần hiển thị đầu tiên của trang**. Sau đó, nó sẽ đặt tiêu đề critical client hint “Sec-CH-UA-Platform-Version” trong phản hồi cho yêu cầu đầu tiên:

| **Tiêu đề** | **Giá trị**                |
| ----------- | -------------------------- |
| Accept-CH   | Sec-CH-UA-Platform-Version |

3. Chrome sẽ không bắt đầu kết xuất và ngay lập tức thử lại yêu cầu, để **tiêu đề có sẵn trong lần kết xuất đầu tiên** của corbado.com. Sau đó, nó sẽ nhận được tiêu đề bổ sung cùng với phiên bản nền tảng:

| **Tiêu đề**                | **Giá trị**                                                       |
| -------------------------- | ----------------------------------------------------------------- |
| Sec-CH-UA                  | "Google Chrome";v="125", "Chromium";v="125", "Not_A/Brand";v="24" |
| Sec-CH-UA-Mobile           | ?0                                                                |
| Sec-CH-UA-Platform         | "macOS"                                                           |
| Sec-CH-UA-Platform-Version | "14.5.0"                                                          |

Trong các biểu đồ sau, chúng ta **thấy một ví dụ khác** trong đó trang web yêu cầu mô hình thiết bị như một phần quan trọng với tiêu đề Critical-CH. Như chúng ta có thể thấy, máy khách thử lại yêu cầu giống như trong ví dụ trên (biểu đồ trình tự bên trái).

![chromium user agent flow complete](https://www.corbado.com/website-assets/chromium_user_agent_flow_complete_cfbf688661.png)_Client hints với Chromium: [https://developers.google.com/privacy-sandbox/protections/User-Agent](https://developers.google.com/privacy-sandbox/protections/User-Agent)_

Do đó, việc sử dụng các Critical Client Hints sẽ làm tăng độ trễ vì trình duyệt phải bắt đầu một yêu cầu thứ hai ngay lập tức, thêm vào các roundtrips. Có một cách để tối ưu hóa việc truyền tải bằng cách **tạo điều kiện cho quá trình bắt tay TLS (TLS handshake)** (hộp màu xanh lá cây ở trên cùng của biểu đồ) để truyền chi tiết. Cách tiếp cận này tạo điều kiện cho **[ALPN](https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation) (Application-Layer Protocol Negotiation)** có thể được tìm thấy [tại đây](https://docs.google.com/document/d/1HQd3vosjFls2jp6DwpkNMUN4CBdmmxZJJz0WhhcqOPw/edit) một cách chi tiết nhưng nằm ngoài mục đích của bài viết này.

Để nhận thông tin bổ sung bằng cách sử dụng tiêu đề, cấu hình cần được thêm vào backend hoặc vào webserver / load balancers. Điều này có thể dễ dàng thực hiện trong bối cảnh bên thứ nhất, khi bạn có toàn quyền kiểm soát trang web với tư cách là một công ty. Ví dụ: các thành phần UI của chúng tôi tại corbado.com yêu cầu phiên bản nền tảng để tăng độ chính xác của [thông tin passkey](https://docs.corbado.com/corbado-connect/features/passkey-intelligence) của chúng tôi. Các nhà phát triển tích hợp các thành phần của chúng tôi trên nhiều trang khác nhau và việc yêu cầu họ thêm tiêu đề rồi chuyển thông tin đó cho các thành phần của chúng tôi sẽ là một chi phí phụ không mong muốn. Đối với SPA và các ứng dụng JavaScript nhúng khác, có một giao diện khác có thể được sử dụng, sẽ được giải thích trong phần tiếp theo.

### 3.3 Cách truy cập Client hints qua JavaScript API (Kịch bản nhúng)

Bằng cách sử dụng hàm [navigator.userAgentData.getHighEntropyValues()](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues), Client hints cũng có thể được truy cập thông qua một JavaScript API, cung cấp một cách linh hoạt và động để yêu cầu thông tin cụ thể về trình duyệt và thiết bị của người dùng. Phương pháp này liên quan đến việc sử dụng đối tượng `navigator.userAgentData` trong kịch bản của trang web để truy vấn Client Hints. **Phương pháp này không yêu cầu phải thiết lập các tiêu đề Client Hint, nhưng nó chỉ hoạt động trong các trình duyệt hỗ trợ `navigator.userAgentData` (các trình duyệt dựa trên Chromium như Chrome và Edge). Firefox và Safari không hỗ trợ API này, vì vậy các nhà phát triển phải thực hiện phát hiện tính năng và cung cấp các phương pháp thay thế.**

Ví dụ: khi thực thi mã này trong Chrome Console trên macOS:

```javascript
if (navigator.userAgentData) {
    navigator.userAgentData
        .getHighEntropyValues(["architecture", "model", "platformVersion"])
        .then((ua) => {
            console.log(ua);
        });
}
```

Khi promise giải quyết, thông tin liên quan sẽ được trả về. Như chúng tôi đã phác thảo ở trên, các tên không hoàn toàn giống với tiêu đề nhưng rất gần.

![platform version](https://www.corbado.com/website-assets/platform_version_6111c471f1.png)

`platformVersion` sau đó được trả về trong promise và nó có thể được truy cập trực tiếp từ mã JavaScript được nhúng. Phạm vi bao phủ cho hàm này thấp hơn nhiều so với việc giảm bớt User-Agent thực tế:

![get high entropy list](https://www.corbado.com/website-assets/get_high_entropy_list_75834fcb30.png)

Ngoài ra, Chrome không cung cấp chức năng này trên iOS vì nó triển khai WebKit trên iOS do các hạn chế của Apple.

Bây giờ chúng tôi đã tập hợp các thông tin quan trọng nhất về việc giảm bớt User-Agent và cách Client hints cung cấp một giải pháp khắc phục trong Chrome.

## 4. Khuyến nghị để tiếp cận User-Agents hiện nay

Tùy thuộc vào trường hợp sử dụng của bạn, bạn nên sử dụng một cách tiếp cận khác nhau để đảm bảo ứng dụng của bạn nhận được kết quả tốt nhất có thể:

- **Phát hiện tính năng: Sử dụng các JavaScript API hiện có của trình duyệt bất cứ khi nào có thể**. Bất cứ khi nào khả thi, hãy dựa vào các API của trình duyệt để phát hiện trực tiếp chức năng, thay vì sử dụng User-Agent. Điều này đáng tin cậy hơn và đáp ứng tốt hơn trong tương lai.
- **Đối với entropy thấp, các gợi ý như loại thiết bị: User-Agent là đủ**. Nếu ứng dụng của bạn chỉ cần xác định loại thiết bị hoặc các chi tiết entropy thấp khác, chuỗi User-Agent sẽ đủ chi tiết. Bạn cũng có thể sử dụng các API hiện có cho các mục đích này.
- **Đối với thông tin entropy cao và kiểm soát tên miền: Sử dụng phương pháp tiêu đề**. Nếu bạn yêu cầu thông tin chi tiết và có quyền kiểm soát tên miền, hãy sử dụng cách tiếp cận tiêu đề HTTP để yêu cầu thông tin có entropy cao ở những nơi được hỗ trợ (Chrome, Edge). Trên tất cả các trình duyệt khác (không gửi các tiêu đề Client hint), hãy sử dụng User-Agent cổ điển. Hãy quyết định xem bạn có cần sử dụng Critical Client Hints hay không dựa trên việc bạn cần thông tin đó ngay lập tức hay có thể chấp nhận một độ trễ nhỏ.
- **Đối với các thư viện JavaScript: Sử dụng getHighEntropyValues**. Nếu bạn đang phát triển một thư viện JavaScript, lựa chọn tốt nhất là sử dụng hàm navigator.userAgentData.getHighEntropyValues() để yêu cầu thông tin cụ thể về trình duyệt và thiết bị của người dùng một cách linh hoạt bất cứ khi nào hàm này được xác định và sử dụng các thư viện phân tích cú pháp User-Agent trong các trường hợp khác.

Bảng sau đây tóm tắt những nơi bạn vẫn có thể phát hiện phiên bản hệ điều hành nếu bạn có quyền truy cập vào User-Agent (UA) và Client Hints (CH):

| **Trình duyệt**  | **Windows** | **MacOS**    | **iOS**         | **Android**      |
| ---------------- | ----------- | ------------ | --------------- | ---------------- |
| Chrome           | ✅ CH       | ✅ CH        | ❌ (iOS 26+)    | ✅ CH            |
| Edge             | ✅ CH       | ✅ CH        | ❌ (iOS 26+)    | ✅ CH            |
| Firefox          | ❌          | ❌           | ❌ (iOS 26+)    | ❌               |
| Safari           | -           | ✅ UA-Safari | ❌ (Safari 26+) | -                |
| Samsung Internet | -           | -            | -               | ✅ CH            |
| WebViews         | -           | -            | ❌ (iOS 26+)    | ✅ UA (≥ 16: ❌) |

Bằng cách chọn phương pháp thích hợp dựa trên nhu cầu cụ thể của bạn, bạn có thể cân bằng hiệu quả nhu cầu về thông tin chi tiết của người dùng với các cân nhắc về quyền riêng tư và hiệu suất. Nếu bạn phụ thuộc nhiều vào thông tin khó trích xuất hoặc thực sự dựa trên thiết bị, hãy quay lại các thư viện chuyên nghiệp như [wurfl](https://web.wurfl.io/) hoặc [51degrees.com](https://51degrees.com) để thực hiện những công việc nặng nhọc thay cho bạn. Cả hai thư viện đều hỗ trợ việc tích hợp các liên kết client vào việc phát hiện và cũng có cách riêng độc quyền để phát hiện ngay cả các kiểu máy iPhone.

## 5. Cách sử dụng User-Agent và Client Hints cho Passkey

Tại Corbado, chúng tôi tập trung phát triển các giải pháp xung quanh passkey bằng cách sử dụng các thành phần UI chủ yếu được phát triển bằng React. Các thành phần của chúng tôi được nhúng vào nhiều trang web khác nhau, vì vậy chúng tôi làm theo đề xuất của riêng mình và sử dụng getHighEntropyValues() ở bất cứ nơi nào có sẵn, và dựa vào việc phân tích cú pháp User-Agent cổ điển cho tất cả các trường hợp khác. Chúng tôi chủ yếu sử dụng điều này cho:

- **Quản lý passkey:** Trên trang quản lý passkey của chúng tôi, chúng tôi hiển thị tất cả các thông tin có sẵn về thiết bị nơi passkey được tạo.
- **Xác thực qua nhiều thiết bị (Cross-Device-Authentication):** Để xác thực trên nhiều thiết bị, chúng tôi sử dụng thông tin về hệ điều hành để xác định khả năng máy khách hỗ trợ sử dụng CDA là bao nhiêu. Điều này đặc biệt quan trọng khi phân biệt giữa Windows 10 và 11, điều này chỉ có thể thực hiện được với Client Hints trên Chrome và Edge:

![get high entropy value](https://www.corbado.com/website-assets/get_high_entropy_value_538459bd28.png)_Chi tiết hơn trên: [https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11](https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11)_

- **Thôngত্তি passkey:** Chúng tôi tin rằng nền tảng sẽ là bên quyết định liệu việc đăng nhập bằng passkey có nên được bắt đầu hay không. Do đó, chúng tôi tích hợp càng nhiều logic càng tốt vào các thành phần của mình để phát hiện xem một thiết bị mới có đang được sử dụng hay không. Trong những tình huống như vậy, phiên bản hệ điều hành mới hoặc nhỏ hơn là một gợi ý có giá trị rằng mọi thứ có thể đã thay đổi.

Khi chúng tôi bắt đầu biên soạn thông tin cho các thành phần của mình, chúng tôi nhận thấy rất nhiều dữ liệu bị phân mảnh được tạo trong hoặc trước khi bắt đầu việc giảm bớt User-Agent. Do đó, chúng tôi nghĩ rằng một bản tóm tắt sẽ giúp các nhà phát triển muốn cải thiện việc phát hiện nhưng không làm việc thường xuyên với User-Agents hoặc Client Hints.

## 6. Kết luận

Sau khi việc phát hiện dựa trên User-Agent là tiêu chuẩn trong nhiều thập kỷ, các chuỗi User-Agent đã trở nên ít chi tiết hơn để bảo vệ quyền riêng tư của người dùng.
Trong bài viết này, chúng tôi đã đề cập:

- **Việc giảm bớt User-Agent là gì?** Việc giảm bớt User-Agent là quá trình giảm thiểu lượng thông tin được chia sẻ thông qua các chuỗi User-Agent để bảo vệ quyền riêng tư của người dùng. Sự chuyển đổi này làm giảm độ chi tiết của dữ liệu như phiên bản hệ điều hành và kiểu phần cứng, vốn trước đây được sử dụng để lấy dấu vân tay và theo dõi người dùng trên các trang web khác nhau. Chúng tôi đã khám phá việc giảm bớt này ảnh hưởng như thế nào đến các nhà phát triển và cách họ có thể thích ứng với những thay đổi này.
- **Client Hints hoạt động như thế nào?** Client hints cung cấp một cơ chế để yêu cầu thông tin cụ thể, có entropy cao về thiết bị của người dùng theo cách quan tâm đến quyền riêng tư hơn. Bằng cách sử dụng các tiêu đề HTTP và API JavaScript, các nhà phát triển có thể truy cập dữ liệu chi tiết về môi trường của người dùng khi cần thiết. Chúng tôi đã thảo luận về cách Client Hints được triển khai, các loại gợi ý có sẵn và các phương pháp để truy cập chúng thông qua các tiêu đề yêu cầu HTTP và JavaScript.

Client hints đang tiếp tục phát triển, và sự chấp nhận của chúng có thể tăng lên khi ngày càng có nhiều trình duyệt và nhà phát triển nhận ra lợi ích của chúng. Tuy nhiên, vẫn còn phải xem liệu sự hỗ trợ của chúng có trở nên phổ biến hay không hay liệu web sẽ tiếp tục phân kỳ về chủ đề này.

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

### Làm cách nào để tôi có được phiên bản iOS thực sự trong ứng dụng web của mình sau iOS 26?

Apple đã đóng băng chuỗi User-Agent của iOS/iPadOS trong Safari 26, phát hành vào tháng 9 năm 2025, có nghĩa là phiên bản hệ điều hành không còn được hiển thị qua User-Agent trên bất kỳ trình duyệt nào chạy trên iOS. Khác với Chrome trên Android hoặc máy tính để bàn, không có Client Hints API nào khả dụng trên các trình duyệt iOS, do đó phiên bản iOS thực tế không còn có thể truy cập được thông qua lập trình.

### Sự khác biệt giữa Client Hints thông thường và Critical Client Hints là gì?

Client Hints thông thường, được yêu cầu thông qua tiêu đề phản hồi `Accept-CH`, chỉ được bao gồm trong các yêu cầu tiếp theo và không khả dụng trong lần tải trang đầu tiên. Critical Client Hints kích hoạt trình duyệt thử lại ngay lập tức trước khi hiển thị, đảm bảo gợi ý khả dụng trong lần hiển thị đầu tiên, nhưng điều này sẽ làm tăng độ trễ (round-trip) vào chu kỳ yêu cầu.

### Tại sao Apple lại đảo ngược quyết định ban đầu năm 2017 về việc đóng băng Safari User-Agent?

Apple đã công bố việc đóng băng User-Agent trong Safari Technology Preview 46 vào năm 2017 nhưng đã đảo ngược một phần quyết định vào năm 2021 do các vấn đề tương thích đáng kể với các trang web phụ thuộc vào thông tin User-Agent cập nhật. Apple sau đó đã triển khai cách tiếp cận đóng băng User-Agent từ từ thay vì đóng băng hoàn toàn ngay lập tức vào thời điểm đó.

### Làm cách nào tôi có thể phát hiện phiên bản macOS trong Safari nếu Client Hints không được hỗ trợ?

Safari không hỗ trợ Client Hints, nhưng phiên bản macOS có thể được suy ra từ số phiên bản Safari trong chuỗi User-Agent. Trừ đi ba từ phiên bản chính của Safari sẽ ánh xạ một cách đáng tin cậy đến phiên bản chính của macOS cho macOS 10.15 trở lên, dựa trên sự liên kết nhất quán về ngày phát hành giữa các phiên bản Safari và macOS.

### Các nhà phát triển thư viện JavaScript nên sử dụng phương pháp nào để phát hiện thiết bị đa trình duyệt?

Cách tiếp cận được khuyến nghị là gọi `navigator.userAgentData.getHighEntropyValues()` khi hàm được định nghĩa, áp dụng cho các trình duyệt dựa trên Chromium, và chuyển sang sử dụng các thư viện phân tích chuỗi User-Agent cho Firefox và Safari. Đối với các trường hợp yêu cầu xác định mô hình thiết bị có độ đặc thù cao, các thư viện chuyên nghiệp như wurfl hoặc 51degrees cung cấp khả năng phát hiện bổ sung ngoài những gì chuỗi User-Agent hiển thị.
