ลองดู User-Agent ของ Chrome รุ่นใหม่ ๆ จะเห็นอะไรทำนอง "Mozilla/5.0 ... AppleWebKit/537.36 ... Chrome/120.0 Safari/537.36" — สตริงที่เต็มไปด้วยชื่อเบราว์เซอร์อื่นที่จริง ๆ แล้ว Chrome ไม่ได้เป็น นี่คือผลลัพธ์ของการแก้ปัญหาความเข้ากันได้ตลอดหลายสิบปี ไม่ใช่เรื่องบังเอิญ
ที่มาของคำว่า "Mozilla"
ในยุค 1990 เว็บไซต์ตรวจสอบความสามารถของเบราว์เซอร์ด้วยการเช็กว่า User-Agent มีคำว่า "Mozilla" หรือไม่ (ชื่อรหัสของ Netscape Navigator ผู้นำตลาดในยุคนั้น) เมื่อ Internet Explorer ต้องการได้รับเนื้อหา "ขั้นสูง" แบบเดียวกัน มันจึงเริ่มใส่คำว่า "Mozilla" ลงใน User-Agent ของตัวเองด้วย — และธรรมเนียมนี้ก็ติดตรึงอยู่ในวงการตลอดมา
LINE in-app browser และตลาด Android ที่ครองส่วนแบ่งสูง
ประเทศไทยเป็นหนึ่งในตลาดที่แอป LINE ได้รับความนิยมสูงมากในชีวิตประจำวัน ไม่ต่างจากญี่ปุ่น และการเปิดลิงก์จากแชท LINE มักเปิดผ่าน in-app browser ของแอปเองแทนที่จะออกไปเปิดในเบราว์เซอร์หลักของเครื่อง ซึ่ง in-app browser เหล่านี้มักมีพื้นฐานเป็น Chromium แต่แนบ token เฉพาะของตัวเองไว้ใน User-Agent ประกอบกับส่วนแบ่งตลาด Android ในไทยสูงกว่า iOS อย่างชัดเจน การวิเคราะห์ log ที่พึ่งพาแค่ "Chrome" หรือ "Safari" แบบตรง ๆ จึงอาจพลาดทราฟฟิกจำนวนไม่น้อยที่มาจาก in-app browser เหล่านี้
ทำไมการตรวจจับผ่าน User-Agent จึงไม่น่าเชื่อถือ
เพราะเบราว์เซอร์ใหม่ทุกตัวต่างเติม token ของรุ่นก่อนหน้าลงใน User-Agent เพื่อความเข้ากันได้ สตริงนี้จึงกลายเป็นกองซากประวัติศาสตร์ มากกว่าจะเป็นคำอธิบายที่แม่นยำของเบราว์เซอร์จริง ๆ แนวทางปฏิบัติที่ดีในปัจจุบันคือการตรวจจับการรองรับฟีเจอร์ JavaScript/CSS โดยตรง แทนที่จะแปลความหมายจาก User-Agent
ใช้ทำอะไรได้บ้าง
- วินิจฉัยปัญหาความเข้ากันได้โดยตรวจสอบว่า client รายงานเบราว์เซอร์และเวอร์ชันใดกันแน่
- ทำความเข้าใจ log ของเซิร์ฟเวอร์ที่บันทึก User-Agent ของผู้เข้าชม
- เข้าใจว่าทำไมโค้ดตรวจจับเบราว์เซอร์แบบเก่าที่อิง User-Agent จึงผิดพลาดบ่อยครั้ง
User-Agent Client Hints ทางเลือกใหม่
แทนที่จะแปลความหมายจากสตริงยาวเทอะทะเพียงตัวเดียว เบราว์เซอร์สมัยใหม่ที่ใช้ฐาน Chromium รองรับ User-Agent Client Hints แล้ว — header แยกต่างหาก เช่น Sec-CH-UA, Sec-CH-UA-Platform และ Sec-CH-UA-Mobile ที่เซิร์ฟเวอร์ต้องร้องขออย่างชัดเจนและได้รับข้อมูลกลับมาในรูปแบบที่มีโครงสร้าง นี่เป็นส่วนหนึ่งของแนวโน้ม "User-Agent Reduction" ที่กว้างขึ้นเพื่อความเป็นส่วนตัว ดังนั้นเมื่อเวลาผ่านไป สตริง User-Agent แบบดั้งเดิมจะมีรายละเอียดน้อยลงเรื่อย ๆ