IETF-এর ‘ইনক্রিমেন্টালি বেটার কুকিজ’ প্রস্তাবনার সাথে সঙ্গতি রেখে Chrome , Firefox , Edge এবং অন্যান্য ব্রাউজারগুলো তাদের ডিফল্ট আচরণ পরিবর্তন করছে, যাতে:
-
SameSiteঅ্যাট্রিবিউট ছাড়া কুকিগুলোকেSameSite=Laxহিসেবে গণ্য করা হয়, যার অর্থ হলো ডিফল্ট আচরণ হলো কুকিগুলোকে শুধুমাত্র ফার্স্ট পার্টি কনটেক্সটে সীমাবদ্ধ রাখা। - তৃতীয় পক্ষের প্রেক্ষাপটে অন্তর্ভুক্তিকরণ সক্ষম করতে, ক্রস-সাইট ব্যবহারের জন্য কুকিগুলিতে অবশ্যই
SameSite=None; Secureনির্দিষ্ট করতে হবে।
আপনি যদি ইতিমধ্যে তা না করে থাকেন, তাহলে আপনার থার্ড-পার্টি কুকিগুলোর অ্যাট্রিবিউট আপডেট করে নিন, যাতে ভবিষ্যতে সেগুলো ব্লক না হয়।
Browser Support
ক্রস-সাইট বা থার্ড-পার্টি কুকির ব্যবহারের ক্ষেত্রসমূহ
এমন অনেক সাধারণ ব্যবহারের ক্ষেত্র ও ধরণ রয়েছে যেখানে তৃতীয় পক্ষের প্রেক্ষাপটে কুকি পাঠানোর প্রয়োজন হয়। আপনি যদি এই ধরনের কোনো ব্যবহারের ক্ষেত্র প্রদান করেন বা তার উপর নির্ভর করেন, তবে পরিষেবাটি সঠিকভাবে চালু রাখার জন্য নিশ্চিত করুন যে আপনি বা পরিষেবা প্রদানকারী উভয়েই তাদের কুকি আপডেট করছেন।
<iframe> এর ভেতরের বিষয়বস্তু
একটি <iframe> এ প্রদর্শিত ভিন্ন সাইটের কন্টেন্ট একটি থার্ড-পার্টি কনটেক্সটে থাকে। এর সাধারণ ব্যবহারগুলোর মধ্যে রয়েছে:
- অন্যান্য সাইট থেকে শেয়ার করা এমবেডেড কন্টেন্ট, যেমন ভিডিও, মানচিত্র, কোড স্যাম্পল এবং সোশ্যাল পোস্ট।
- পেমেন্ট, ক্যালেন্ডার, বুকিং এবং রিজার্ভেশন ফিচারের মতো বাহ্যিক পরিষেবা থেকে আসা উইজেটসমূহ।
- সোশ্যাল বাটন বা অ্যান্টি-ফ্রড সার্ভিসের মতো উইজেট, যেগুলো কম স্পষ্ট
<iframes>তৈরি করে।
এখানে কুকি ব্যবহার করা হতে পারে, অন্যান্য বিষয়ের পাশাপাশি, সেশন স্টেট বজায় রাখতে, সাধারণ পছন্দসমূহ সংরক্ষণ করতে, পরিসংখ্যান চালু করতে, অথবা বিদ্যমান অ্যাকাউন্টধারী ব্যবহারকারীদের জন্য কন্টেন্ট ব্যক্তিগতকরণ করতে।

যেহেতু ওয়েব স্বভাবতই কম্পোজেবল, তাই টপ-লেভেল বা ফার্স্ট-পার্টি প্রেক্ষাপটে দেখা কন্টেন্ট এমবেড করার জন্যও <iframes> ব্যবহৃত হয়। iframe-এ প্রদর্শিত সাইটটি যে কুকিগুলো ব্যবহার করে, সেগুলোকে থার্ড-পার্টি কুকি হিসেবে গণ্য করা হয়। আপনি যদি এমন সাইট তৈরি করেন যা অন্য সাইট এমবেড করুক বলে আপনি চান, এবং সেগুলোকে সচল রাখার জন্য কুকির প্রয়োজন হয়, তাহলে আপনাকে এটাও নিশ্চিত করতে হবে যে সেগুলো ক্রস-সাইট ব্যবহারের জন্য চিহ্নিত করা আছে অথবা আপনি সেগুলো ছাড়াই নির্বিঘ্নে ফলব্যাক করতে পারবেন।
সাইট জুড়ে "অনিরাপদ" অনুরোধ
এখানে "অনিরাপদ" শব্দটি উদ্বেগজনক মনে হতে পারে, কিন্তু এটি এমন যেকোনো অনুরোধকে বোঝায় যার উদ্দেশ্য হতে পারে কোনো অবস্থা পরিবর্তন করা। ওয়েবে, এটি মূলত POST অনুরোধ। SameSite=Lax হিসেবে চিহ্নিত কুকিগুলো নিরাপদ টপ-লেভেল নেভিগেশনের ক্ষেত্রে পাঠানো হয়, যেমন অন্য কোনো সাইটে যাওয়ার জন্য লিঙ্কে ক্লিক করা। তবে, POST ব্যবহার করে অন্য কোনো সাইটে <form> জমা দেওয়ার মতো কাজে কুকি অন্তর্ভুক্ত থাকে না।

এই প্যাটার্নটি এমন সাইটগুলির জন্য ব্যবহৃত হয় যেগুলি ব্যবহারকারীকে ফিরে আসার আগে কোনও অপারেশন সম্পাদন করার জন্য একটি রিমোট পরিষেবাতে রিডাইরেক্ট করতে পারে, উদাহরণস্বরূপ, কোনও তৃতীয় পক্ষের পরিচয় প্রদানকারীর কাছে রিডাইরেক্ট করা। ব্যবহারকারী সাইট ছেড়ে যাওয়ার আগে, একটি কুকি সেট করা হয় যাতে একটি একক-ব্যবহারের টোকেন থাকে, এই প্রত্যাশায় যে ক্রস সাইট রিকোয়েস্ট ফরজেরি (CSRF) আক্রমণ প্রতিরোধ করার জন্য ফিরে আসা অনুরোধে এই টোকেনটি পরীক্ষা করা যেতে পারে। যদি সেই ফিরে আসা অনুরোধটি POST এর মাধ্যমে আসে, তাহলে আপনাকে কুকিগুলিকে SameSite=None; Secure হিসাবে চিহ্নিত করতে হবে।
দূরবর্তী সম্পদ
পৃষ্ঠার যেকোনো দূরবর্তী রিসোর্স, যেমন <img> ট্যাগ বা <script> ট্যাগ থেকে আসা রিসোর্স, অনুরোধের সাথে কুকি পাঠানোর ওপর নির্ভর করতে পারে। এর সাধারণ ব্যবহারগুলোর মধ্যে রয়েছে ট্র্যাকিং পিক্সেল এবং কন্টেন্ট ব্যক্তিগতকরণ।
এটি আপনার জাভাস্ক্রিপ্ট থেকে fetch বা XMLHttpRequest ব্যবহার করে পাঠানো অনুরোধের ক্ষেত্রেও প্রযোজ্য। যদি fetch() credentials: 'include' অপশন দিয়ে কল করা হয়, তাহলে সেই অনুরোধগুলিতে কুকি অন্তর্ভুক্ত থাকার সম্ভাবনা থাকে। XMLHttpRequest এর ক্ষেত্রে, প্রত্যাশিত কুকি সাধারণত withCredentials এর ` true ভ্যালু দ্বারা নির্দেশিত হয়। ক্রস-সাইট অনুরোধে অন্তর্ভুক্ত হওয়ার জন্য সেই কুকিগুলিকে যথাযথভাবে চিহ্নিত করতে হবে।
একটি ওয়েবভিউ-এর ভেতরের বিষয়বস্তু
প্ল্যাটফর্ম-নির্দিষ্ট অ্যাপের একটি ওয়েবভিউ ব্রাউজার দ্বারা চালিত হয়। ডেভেলপারদের পরীক্ষা করে দেখতে হবে যে, যে সীমাবদ্ধতা বা সমস্যাগুলো তাদের নিজেদের অ্যাপকে প্রভাবিত করে, সেগুলো তাদের অ্যাপের ওয়েবভিউগুলোর ক্ষেত্রেও প্রযোজ্য কি না।
অ্যান্ড্রয়েড তার প্ল্যাটফর্ম-নির্দিষ্ট অ্যাপগুলোকে CookieManager API ব্যবহার করে সরাসরি কুকি সেট করার সুযোগও দেয়। হেডার বা জাভাস্ক্রিপ্ট ব্যবহার করে সেট করা কুকির মতোই, যদি এগুলি ক্রস-সাইট ব্যবহারের জন্য উদ্দিষ্ট হয়, তবে SameSite=None; Secure অন্তর্ভুক্ত করার কথা বিবেচনা করুন।
আজই কীভাবে SameSite বাস্তবায়ন করবেন
আপনার প্রয়োজন অনুযায়ী, শুধুমাত্র ফার্স্ট-পার্টি প্রেক্ষাপটে দরকারি কুকিগুলোকে SameSite=Lax বা SameSite=Strict হিসেবে চিহ্নিত করুন। আপনি যদি এই কুকিগুলোকে চিহ্নিত না করেন এবং সেগুলোর পরিচালনার জন্য ব্রাউজারের ডিফল্ট আচরণের উপর নির্ভর করেন, তাহলে সেগুলো বিভিন্ন ব্রাউজারে অসামঞ্জস্যপূর্ণ আচরণ করতে পারে এবং সম্ভাব্যভাবে প্রতিটি কুকির জন্য কনসোলে সতর্কবার্তা দেখাতে পারে।
Set-Cookie: first_party_var=value; SameSite=Lax
তৃতীয় পক্ষের প্রেক্ষাপটে প্রয়োজনীয় যেকোনো কুকিকে অবশ্যই SameSite=None; Secure হিসেবে চিহ্নিত করুন। উভয় অ্যাট্রিবিউটই আবশ্যক। আপনি যদি Secure ছাড়া শুধু None উল্লেখ করেন, তাহলে কুকিটি প্রত্যাখ্যাত হবে। ব্রাউজারের বাস্তবায়নের ভিন্নতার কথা মাথায় রাখতে, আপনাকে ‘Handle incompatible clients’ অংশে বর্ণিত কিছু প্রতিকারমূলক কৌশল ব্যবহার করতে হতে পারে।
Set-Cookie: third_party_var=value; SameSite=None; Secure
অসঙ্গত ক্লায়েন্টদের পরিচালনা করুন
যেহেতু None অন্তর্ভুক্ত করা এবং ডিফল্ট আচরণ আপডেট করার এই পরিবর্তনগুলো এখনও তুলনামূলকভাবে নতুন, তাই বিভিন্ন ব্রাউজার এগুলোকে ভিন্ন ভিন্ন উপায়ে পরিচালনা করে। পরিচিত সমস্যাগুলোর তালিকার জন্য আপনি chromium.org-এর আপডেট পৃষ্ঠাটি দেখতে পারেন, কিন্তু এই তালিকাটি সম্পূর্ণ নাও হতে পারে।
এর একটি সম্ভাব্য সমাধান হলো প্রতিটি কুকিকে নতুন এবং পুরোনো উভয় স্টাইলেই সেট করা:
Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure
যেসব ব্রাউজার নতুন আচরণটি প্রয়োগ করে, তারা SameSite ভ্যালু দিয়ে কুকি সেট করে। যেসব ব্রাউজার নতুন আচরণটি প্রয়োগ করে না, তারা সেই ভ্যালুটি উপেক্ষা করে এবং 3pcookie-legacy কুকি সেট করে। অন্তর্ভুক্ত কুকি প্রসেস করার সময়, আপনার সাইটের প্রথমে নতুন ধরনের কুকির উপস্থিতি পরীক্ষা করা উচিত এবং নতুন কোনোটি খুঁজে না পেলে পুরোনো কুকিতে ফিরে যাওয়া উচিত।
নিম্নলিখিত উদাহরণে দেখানো হয়েছে কিভাবে Node.js-এ Express ফ্রেমওয়ার্ক এবং এর cookie-parser মিডলওয়্যার ব্যবহার করে এটি করা যায়:
const express = require('express');
const cp = require('cookie-parser');
const app = express();
app.use(cp());
app.get('/set', (req, res) => {
// Set the new style cookie
res.cookie('3pcookie', 'value', { sameSite: 'none', secure: true });
// And set the same value in the legacy cookie
res.cookie('3pcookie-legacy', 'value', { secure: true });
res.end();
});
app.get('/', (req, res) => {
let cookieVal = null;
if (req.cookies['3pcookie']) {
// check the new style cookie first
cookieVal = req.cookies['3pcookie'];
} else if (req.cookies['3pcookie-legacy']) {
// otherwise fall back to the legacy cookie
cookieVal = req.cookies['3pcookie-legacy'];
}
res.end();
});
app.listen(process.env.PORT);
এই পদ্ধতিতে আপনাকে অপ্রয়োজনীয় কুকি সেট করতে এবং কুকি সেট ও রিড করার উভয় পর্যায়েই পরিবর্তন আনতে অতিরিক্ত কাজ করতে হবে। তবে, এটি ব্রাউজারের আচরণ নির্বিশেষে সবগুলোর ক্ষেত্রেই প্রযোজ্য হওয়া উচিত এবং থার্ড-পার্টি কুকিগুলোকে সচল রাখবে।
বিকল্প হিসেবে, যখন একটি Set-Cookie হেডার পাঠানো হয়, তখন আপনি ইউজার এজেন্ট স্ট্রিং ব্যবহার করে ক্লায়েন্টকে শনাক্ত করতে পারেন। অসামঞ্জস্যপূর্ণ ক্লায়েন্টদের তালিকাটি দেখুন এবং আপনার প্ল্যাটফর্মের জন্য একটি উপযুক্ত ইউজার এজেন্ট ডিটেকশন লাইব্রেরি ব্যবহার করুন, যেমন Node.js-এর ua-parser-js লাইব্রেরি। এই পদ্ধতিতে আপনাকে কেবল একটি পরিবর্তন করতে হবে, কিন্তু ইউজার এজেন্ট স্নিফিং হয়তো সব প্রভাবিত ব্যবহারকারীকে ধরতে পারবে না।
ভাষা, লাইব্রেরি এবং ফ্রেমওয়ার্কগুলিতে SameSite=None এর জন্য সমর্থন
বেশিরভাগ ভাষা এবং লাইব্রেরি কুকির জন্য SameSite অ্যাট্রিবিউট সমর্থন করে। তবে, যেহেতু SameSite=None এর সংযোজন এখনও তুলনামূলকভাবে নতুন, তাই আপাতত আপনাকে কিছু স্ট্যান্ডার্ড আচরণের বিকল্প ব্যবস্থা করতে হতে পারে। এই আচরণগুলো গিটহাবে থাকা SameSite উদাহরণ রিপোজিটরিতে নথিভুক্ত করা আছে।
সাহায্য পাওয়া
ওয়েবের সর্বত্র কুকি ব্যবহৃত হয়, এবং কোনো ডেভেলপমেন্ট টিমের পক্ষে তাদের সাইট কোথায় কুকি সেট ও ব্যবহার করে সে সম্পর্কে সম্পূর্ণ জ্ঞান থাকা বিরল, বিশেষ করে ক্রস-সাইট ব্যবহারের ক্ষেত্রে। আপনি যখন কোনো সমস্যার সম্মুখীন হন, তখন হতে পারে যে অন্য কেউ প্রথমবারের মতো সেটির সম্মুখীন হচ্ছে, তাই যোগাযোগ করতে দ্বিধা করবেন না:
- গিটহাবে
SameSiteউদাহরণ রিপোজিটরিতে একটি সমস্যা উত্থাপন করুন। - স্ট্যাকওভারফ্লো-তে 'samesite' ট্যাগে একটি প্রশ্ন করুন।
- ক্রোমিয়ামের আচরণ সংক্রান্ত সমস্যার জন্য, ক্রোমিয়াম ইস্যু ট্র্যাকারে একটি বাগ রিপোর্ট করুন।
-
SameSiteআপডেট পেজে Chrome-এর অগ্রগতি অনুসরণ করুন।