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

Timing-Allow-Origin: Resource Timing API-তে Analytics কী দেখে

Timing-Allow-Origin হেডার নিয়ন্ত্রণ করে যে একটি পেজ ক্রস-অরিজিন টাইমিং সম্পর্কে কতটা বিস্তারিত পড়তে পারে। প্রাইভেসি-ফার্স্ট পারফরম্যান্স পরিমাপের জন্য এর অর্থ কী, তা এখানে বলা হলো।

যে হেডার কেউ ইচ্ছা করে সেট করে না

বেশিরভাগ টিম Timing-Allow-Origin (TAO)-এর সঙ্গে পরিচিত হয় কেবল তখনই, যখন তাদের মনিটরিং টুলের কোনো চার্টে সন্দেহজনক শূন্য দেখা যায়। ক্রস-অরিজিন রিসোর্স — ফন্ট, CDN থেকে আসা ছবি, একটি থার্ড-পার্টি স্ক্রিপ্ট — Resource Timing API-তে দেখা যায়, কিন্তু তাদের বিস্তারিত সাব-টাইমিং 0 হিসেবে পড়া যায়, যদি না রেসপন্স দেওয়া সার্ভার স্পষ্টভাবে এতে সম্মতি দেয়। সেই সম্মতিই হলো TAO হেডার, আর আক্রমণাত্মক ট্র্যাকিং-এর দিকে না ঝুঁকে সৎ পারফরম্যান্স ডেটা চাইলে এটি বোঝা অপরিহার্য।

Resource Timing স্ট্যান্ডার্ড একটি পেজের প্রতিটি ফেচের জন্য একটি PerformanceResourceTiming এন্ট্রি প্রকাশ করে। সেম-অরিজিন রিসোর্সের জন্য আপনি সম্পূর্ণ বিভাজন পান: DNS লুকআপ, TCP কানেক্ট, TLS নেগোশিয়েশন, রিকোয়েস্ট স্টার্ট, এবং রেসপন্স টাইমিং। ক্রস-অরিজিন রিসোর্সের ক্ষেত্রে, স্পেসিফিকেশন ইচ্ছাকৃতভাবে একটি ডকুমেন্ট কী পড়তে পারে তা সীমিত করে, কারণ সেই সূক্ষ্ম টাইমিংগুলো একজন ব্যবহারকারীর নেটওয়ার্ক অবস্থা, ক্যাশে কনটেন্ট, বা অন্য একটি অরিজিনের অভ্যন্তরীণ আচরণ সম্পর্কে তথ্য ফাঁস করতে পারে।

কী শূন্য হয়ে যায়

একটি মিলিত TAO হেডার ছাড়া, একটি ক্রস-অরিজিন PerformanceResourceTiming এন্ট্রির নিম্নলিখিত অ্যাট্রিবিউটগুলো শূন্যে সীমাবদ্ধ করা হয়: redirectStart, redirectEnd, domainLookupStart, domainLookupEnd, connectStart, connectEnd, secureConnectionStart, requestStart, responseStart, transferSize, encodedBodySize, এবং decodedBodySize। আপনি এখনও পান startTime, duration, responseEnd, এবং রিসোর্সের nameinitiatorType। বাস্তবে এর মানে হলো আপনি বলতে পারবেন যে একটি রিসোর্স লোড হয়েছে এবং সামগ্রিকভাবে কতক্ষণ সময় নিয়েছে, কিন্তু কোথায় সময়টা গেল বা কত বাইট নেটওয়ার্ক পার হলো তা নয়।

এই চেকটি Resource Timing স্পেসিফিকেশনের timing allow check অ্যালগরিদম দ্বারা সংজ্ঞায়িত। একটি রিসোর্স উত্তীর্ণ হয় যদি তার রেসপন্স Timing-Allow-Origin বহন করে এমন একটি মান দিয়ে যা হয় রিকোয়েস্ট করা ডকুমেন্টের অরিজিনের সমান, নয়তো ওয়াইল্ডকার্ড *

Timing-Allow-Origin: https://example.com
# or, to allow any origin
Timing-Allow-Origin: *

প্রাইভেসি-ফার্স্ট অ্যানালিটিক্সের জন্য এটি কেন গুরুত্বপূর্ণ

Monoid ফিল্ড থেকে পারফরম্যান্স পরিমাপ করে — বাস্তব ভিজিটরদের বাস্তব নেভিগেশন — কোনো কুকি ছাড়া, localStorage ছাড়া, এবং ফিঙ্গারপ্রিন্টিং ছাড়া। Resource Timing এবং Navigation Timing API হলো এটি করার স্ট্যান্ডার্ড-ভিত্তিক উপায়, আর ক্রস-অরিজিন টাইমিং ডেটা ডিফল্টভাবে গোপন রাখতে প্ল্যাটফর্মটি যে ব্যবস্থা ব্যবহার করে তা হলো TAO।

সেই ডিফল্টটি একটি প্রাইভেসি ফিচার, বাধা নয়। ক্ল্যাম্পিং ঠিক এই কারণেই বিদ্যমান যেন একটি পেজ টাইমিং সাইড চ্যানেলের জন্য থার্ড-পার্টি অরিজিন প্রোব করতে না পারে। আমরা যখন আপনাকে আপনার নিজের স্ট্যাটিক অ্যাসেট ও CDN-এ Timing-Allow-Origin সেট করার পরামর্শ দিই, তখন আমরা আপনাকে অনুরোধ করছি আপনার নিজের পরিকাঠামোকে আপনার নিজের পরিমাপের জন্য দৃশ্যমানতায় সম্মতি দিতে — কারও সুরক্ষা দুর্বল করতে নয়।

Core Web Vitals এই বিষয়টিকে আরও দৃঢ় করে। Largest Contentful Paint প্রায়শই একটি ক্রস-অরিজিন ছবি বা একটি ওয়েব ফন্ট হয়। যদি সেই রেসপন্সগুলোতে TAO হেডার না থাকে, আপনি এখনও Largest Contentful Paint API-এর মাধ্যমে LCP এলিমেন্ট পর্যবেক্ষণ করতে পারবেন, কিন্তু আপনি রিকোয়েস্ট ও রেসপন্স সাব-টাইমিং হারাবেন যা আপনাকে বলত যে ধীর DNS, একটি ঠান্ডা TLS হ্যান্ডশেক, নাকি একটি বড় ট্রান্সফার এই বিলম্বের কারণ। আপনার অ্যাসেট অরিজিনে হেডারটি যোগ করলে একটি অস্পষ্ট সংখ্যা একটি কার্যকর সংখ্যায় পরিণত হয়।

সঠিকভাবে সেট করা

কয়েকটি বাস্তব নোট। প্রথমত, transferSize শূন্য না হওয়া আপনাকে একটি ক্যাশে হিট (ছোট ট্রান্সফার সাইজ) থেকে একটি নেটওয়ার্ক ফেচ আলাদা করতেও সাহায্য করে, যা রিপিট-ভিউ পারফরম্যান্স নির্ণয়ের সময় অমূল্য। দ্বিতীয়ত, আপনি যদি ক্রস-অরিজিন ফন্ট পরিবেশন করেন, তাহলে CSS crossorigin অ্যাট্রিবিউট এবং CORS হলো TAO থেকে আলাদা একটি বিষয় — আপনার উভয়ই প্রয়োজন হতে পারে। তৃতীয়ত, যেখানে সম্ভব সেখানে *-এর চেয়ে নির্দিষ্ট অরিজিন নাম দেওয়াকে অগ্রাধিকার দিন, যাতে কেবল সেই ডকুমেন্টগুলোই ডেটা পায় যাদের বৈধভাবে এটি প্রয়োজন।

Cloudflare-এ, আপনি একটি Transform Rule দিয়ে বা একটি Worker রেসপন্সে এজে হেডারটি যোগ করতে পারেন, এটি আপনার অ্যাসেট পাথে প্রয়োগ করে। যেহেতু Monoid একই এজে চলে, আপনার ভিজিটরদের ব্রাউজার যে টাইমিং ডেটা সংগ্রহ করে তা সরাসরি সমষ্টিগত, পরিচয়-মুক্ত মেট্রিক্সে প্রবাহিত হয় — আপনার হিরো ছবি TLS-এ 400ms ব্যয় করে তা জানতে কোনো প্রতি-ব্যবহারকারী প্রোফাইলের প্রয়োজন নেই।

মূল কথা

Timing-Allow-Origin একটি ছোট হেডার যা ফিল্ড পারফরম্যান্স ডেটা থেকে আপনি কতটা শিখতে পারবেন তার উপর অসামঞ্জস্যপূর্ণ প্রভাব ফেলে। ব্রাউজারের ডিফল্ট — ক্রস-অরিজিন সাব-টাইমিং শূন্য করা — একটি ইচ্ছাকৃত প্রাইভেসি সুরক্ষা, এবং এটি প্রাইভেসি-ফার্স্ট অ্যানালিটিক্স যেভাবে কাজ করা উচিত তার সঙ্গে সুন্দরভাবে সামঞ্জস্যপূর্ণ: স্ট্যান্ডার্ড API থেকে সমষ্টি পরিমাপ করুন, আপনার নিজের অরিজিনকে বিস্তারিত তথ্যের জন্য স্পষ্টভাবে সম্মতি দিন, এবং একজন ব্যবহারকারীর নেটওয়ার্ক ফিঙ্গারপ্রিন্টকে কখনোই সংগ্রহযোগ্য কিছু হিসেবে বিবেচনা করবেন না। আপনার অ্যাসেটে TAO সেট করুন, এবং কোনো ট্র্যাকিং ছাড়াই আপনার Web Vitals ডিবাগিং আরও তীক্ষ্ণ হয়ে উঠবে।

Sources

Comments

Loading comments…