← ব্লগে ফিরে যান

User-Agent Client Hints মাইগ্রেশন: সম্পূর্ণ UA স্ট্রিং ছাড়াই ডিভাইস পরিমাপ

Chrome User-Agent স্ট্রিংকে একটি জমাট খোলসে নামিয়ে আনছে। দেখুন, প্রাইভেসি-ফার্স্ট অ্যানালিটিক্স ফিঙ্গারপ্রিন্টিং ছাড়াই Client Hints দিয়ে ডিভাইস সংকেত কীভাবে পড়ে।

User-Agent স্ট্রিংয়ের ধীর মৃত্যু

কয়েক দশক ধরে User-Agent রিকোয়েস্ট হেডারই ছিল অ্যানালিটিক্সের সেই কর্মী, যে গোড়ার প্রশ্নগুলোর উত্তর দিত: কোন ব্রাউজার, কোন অপারেটিং সিস্টেম, মোবাইল না ডেস্কটপ? একই সঙ্গে এটি ছিল ফিঙ্গারপ্রিন্টিংয়ের দায়ও। Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xxx.0.0.0 Safari/537.36-এর মতো একটি পূর্ণ UA স্ট্রিং নিখুঁত ভার্সন নম্বর আর প্ল্যাটফর্মের খুঁটিনাটি ফাঁস করে, যা অন্য সংকেতের সঙ্গে মিলে আলাদা আলাদা দর্শনার্থী শনাক্ত করতে সাহায্য করে।

Google-এর User-Agent Reduction উদ্যোগ বছরের পর বছর ধরে এই স্ট্রিং ছেঁটে চলেছে। Chrome এখন একটি সংক্ষিপ্ত UA পাঠায়, যেখানে প্ল্যাটফর্ম ভার্সন জমাট করে দেওয়া হয়েছে এবং মাইনর ভার্সনের অংশগুলো শূন্য করা হয়েছে। Chrome-এর ডকুমেন্টেশন অনুযায়ী উদ্দেশ্য হলো নিষ্ক্রিয়ভাবে পাওয়া এনট্রপি সরিয়ে ফেলা, অথচ তার বদলে একটি কাঠামোবদ্ধ, চেয়ে নেওয়ার ভিত্তিতে পাওয়া বিকল্প রেখে দেওয়া: User-Agent Client Hints (UA-CH)।

২০২৬ সালে যাঁরা অ্যানালিটিক্স বানাচ্ছেন, তাঁদের জন্য ব্যবহারিক ফল স্পষ্ট। মোটা দাগে ব্রাউজার পরিবারের বাইরে কিছু জানতে পুরোনো UA স্ট্রিং পার্স করা ক্রমেই অনির্ভরযোগ্য হয়ে উঠছে — এবং ক্রমেই ভুল পথ হয়ে উঠছে।

Client Hints আসলে কীভাবে কাজ করে

UA-CH ডিভাইসের তথ্যকে একটিমাত্র ঠাসা স্ট্রিংয়ের বদলে আলাদা আলাদা, চেয়ে নেওয়ার যোগ্য হিন্টে ভাগ করে দেয়। কম-এনট্রপির হিন্টগুলো ডিফল্টভাবেই প্রতিটি রিকোয়েস্টের সঙ্গে যায়:

  • Sec-CH-UA — ব্র্যান্ড ও গুরুত্বপূর্ণ ভার্সনের তালিকা
  • Sec-CH-UA-Mobile — ?0 / ?1 বুলিয়ান
  • Sec-CH-UA-Platform — যেমন "macOS"

উচ্চ-এনট্রপির হিন্ট — পূর্ণ প্ল্যাটফর্ম ভার্সন, আর্কিটেকচার, মডেল, বিটনেস — সার্ভার স্পষ্টভাবে না চাইলে পাঠানো হয় না। সার্ভার সেগুলো চায় Accept-CH রেসপন্স হেডার দিয়ে, আর তখন ব্রাউজার পরবর্তী রিকোয়েস্টগুলোতে সেগুলো যুক্ত করতে পারে। Sec- উপসর্গের অর্থ, এই হেডারগুলো ব্রাউজারের নিয়ন্ত্রণে এবং স্ক্রিপ্ট দিয়ে সেট করা যায় না — এটি একটি অর্থবহ অখণ্ডতার নিশ্চয়তা।

এই উল্টে যাওয়াটা গোপনীয়তার জন্য গুরুত্বপূর্ণ। ডিফল্ট অবস্থান হলো ন্যূনতম প্রকাশ। বাড়তি এনট্রপি এখন একটি সচেতন সিদ্ধান্ত, যা আপনার নিজের রেসপন্স হেডারেই নথিভুক্ত থাকে — প্রতিটি দর্শনার্থীর কাছ থেকে নিঃশব্দে কুড়িয়ে নেওয়া কিছু নয়।

এই পরিবর্তনের প্রাইভেসি-ফার্স্ট পাঠ

Monoid সচেতনভাবেই এই সীমারেখার কম-এনট্রপির দিকে থেকে যায়। আর্কিটেকচার, মডেল বা পূর্ণ প্ল্যাটফর্ম ভার্সন টেনে আনতে আমরা কখনও Accept-CH পাঠাই না, আর যে হিন্টগুলো আমরা দেখি সেগুলোকে কখনও একটি স্থায়ী ডিভাইস স্বাক্ষরে জোড়া লাগাই না। সেটিই হতো ফিঙ্গারপ্রিন্টিং — ডিভাইসের বৈশিষ্ট্য থেকে একটি শনাক্তকারী পুনর্গঠন — ঠিক যা ঠেকাতেই UA হ্রাসের নকশা করা হয়েছিল, এবং ঠিক যাকে ePrivacy নির্দেশিকার অনুচ্ছেদ ৫(৩) ও ব্রাউজারগুলোর ফিঙ্গারপ্রিন্টিং-বিরোধী নীতি টার্মিনাল সরঞ্জামের তথ্যে প্রবেশ হিসেবে গণ্য করে।

ডিফল্ট কম-এনট্রপির হিন্টগুলোই সেসব প্রশ্নের জন্য যথেষ্ট, অ্যানালিটিক্সের যেগুলোই করা উচিত:

  • Sec-CH-UA থেকে ব্রাউজার পরিবার ও মেজর ভার্সন, সামঞ্জস্য ও সাপোর্ট পরিকল্পনার জন্য।
  • Sec-CH-UA-Mobile থেকে মোবাইল বনাম নন-মোবাইল, লেআউট ও Core Web Vitals বিভাজনের জন্য।
  • Sec-CH-UA-Platform থেকে প্ল্যাটফর্ম, OS-স্তরের বিশ্লেষণের জন্য।

সবচেয়ে গুরুত্বপূর্ণ: এগুলো সমষ্টিগত মাত্রা, প্রতি-দর্শনার্থী চাবি নয়। লক্ষ লক্ষ দর্শনার্থীর মধ্যে ভাগ হওয়া একটি বুলিয়ান আর একটি প্ল্যাটফর্মের নাম নিজে থেকে কোনো অর্থবহ শনাক্তকরণ ক্ষমতা বহন করে না।

এজে হিন্ট পড়া

যেহেতু Client Hints সাধারণ রিকোয়েস্ট হেডার, এজ ওয়ার্কার কোনো ক্লায়েন্ট-সাইড স্ক্রিপ্ট ছাড়াই সেগুলো পড়তে পারে। Cloudflare-এ কম-এনট্রপির হিন্টগুলো আগত Request অবজেক্টেই পৌঁছে যায়:

export default {
  async fetch(request) {
    const brands = request.headers.get('Sec-CH-UA') || '';
    const isMobile = request.headers.get('Sec-CH-UA-Mobile') === '?1';
    const platform = request.headers.get('Sec-CH-UA-Platform') || '';
    // কেবল স্থূল মাত্রা বের করুন; যৌগিক চাবি কখনও সংরক্ষণ করবেন না।
    return new Response('ok');
  }
};

লক্ষ করুন কী অনুপস্থিত: Accept-CH-এর কোনো প্রতিধ্বনি নেই, উচ্চ-এনট্রপির হিন্টের কোনো অনুরোধ নেই, মিলিত মানগুলোর কোনো হ্যাশিং নেই। Sec-CH-UA-এর মান একটি কাঠামোবদ্ধ তালিকা, তাই সাবধানে পার্স করুন — এতে ইচ্ছাকৃত "GREASE" ব্র্যান্ড এন্ট্রি থাকে, যা হুবহু মিলিয়ে দেখা ভঙ্গুর পার্সিং ঠেকাতে তৈরি; কৌশলটি স্পেসিফিকেশন ধার করেছে TLS থেকে।

আপনার পাইপলাইনে কী বদলাবেন

আপনার অ্যানালিটিক্স যদি এখনও পূর্ণ UA স্ট্রিংয়ে রেগেক্স চালায়, সময়ের সঙ্গে তিনটি জিনিস ভাঙবে। ভার্সন নম্বর সরে গিয়ে .0.0.0 হবে, প্ল্যাটফর্ম ভার্সন জমে যাবে, আর সাবস্ট্রিং মিলিয়ে করা মোবাইল শনাক্তকরণ অনির্ভরযোগ্য হয়ে পড়বে। মাইগ্রেশনের পথ সরল:

  1. UA স্ট্রিং পার্স করার বদলে কাঠামোবদ্ধ কম-এনট্রপির হিন্টকে অগ্রাধিকার দিন।
  2. সংক্ষিপ্ত UA স্ট্রিংকে কেবল পুরোনো ক্লায়েন্টের জন্য ফলব্যাক হিসেবে ব্যবহার করুন।
  3. "দরকার হতে পারে" ভেবে উচ্চ-এনট্রপির হিন্ট চাওয়ার প্রলোভন এড়ান — প্রতিটি বাড়তি হিন্ট আপনার ফিঙ্গারপ্রিন্টিং পরিসর আর কমপ্লায়েন্স ঝুঁকি দুই-ই বাড়ায়।

বড় শিক্ষাটি আমরা যা কিছু বানাই তার সঙ্গেই সংগতিপূর্ণ। ব্রাউজার নির্মাতারা ওয়েব প্ল্যাটফর্ম থেকে নিষ্ক্রিয় এনট্রপি ধাপে ধাপে সরিয়ে নিচ্ছেন। সঠিক জবাব নতুন API-এর পেছনে ছুটে তার পিছু নেওয়া নয়, বরং এমন পরিমাপ নকশা করা যার কোনোদিনই সেটির দরকার ছিল না।

Sources

Comments

Loading comments…