Web Sockets প্রোটোকলটি রিয়েল-টাইম ডেটা আদান-প্রদান করতে ব্যবহৃত হয় এবং এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি দীর্ঘস্থায়ী কানেকশন স্থাপন করে। তবে, যখন Web Socket কানেকশন একটি ডোমেইন থেকে অন্য ডোমেইনে তৈরি করার চেষ্টা করা হয়, তখন Cross-Origin Resource Sharing (CORS) সম্পর্কিত কিছু সমস্যা দেখা দিতে পারে। CORS হল একটি নিরাপত্তা ফিচার যা ব্রাউজারকে বিভিন্ন ডোমেইন থেকে সরাসরি রিসোর্স এক্সেস নিষিদ্ধ করে, যাতে ওয়েব অ্যাপ্লিকেশনগুলির মধ্যে অপ্রত্যাশিত বা ক্ষতিকর ক্রস-অরিজিন কমিউনিকেশন বন্ধ করা যায়।
Web Sockets এ CORS এর সমস্যা HTTP প্রোটোকলের মতো সহজে সমাধান করা যায় না, কারণ Web Sockets এর কানেকশন স্টার্ট হয় HTTP হ্যান্ডশেকের মাধ্যমে, কিন্তু কানেকশন সম্পূর্ণ হলে এটি TCP ভিত্তিক হয়ে যায়। তবে, Web Sockets এর জন্য কিছু নির্দিষ্ট পদ্ধতি আছে যার মাধ্যমে Cross-Origin সমস্যা সমাধান করা যায়।
Web Sockets এবং CORS সমস্যা
Web Socket কানেকশন যখন এক ডোমেইন থেকে অন্য ডোমেইনে তৈরি হয়, তখন ক্লায়েন্ট ব্রাউজার একটি HTTP Upgrade Request পাঠায়। এই রিকোয়েস্টে একটি Origin হেডার থাকে, যেটি উত্স ডোমেইনকে নির্দেশ করে। সার্ভার এই রিকোয়েস্ট গ্রহণ করে, এবং যদি সার্ভারটি ওই Origin ডোমেইন থেকে কানেকশন অনুমোদন না করে, তাহলে কানেকশনটি প্রত্যাখ্যাত হয়।
CORS সমস্যা সমাধানের পদ্ধতি
১. সার্ভারে Origin যাচাই করা
Web Sockets এর ক্ষেত্রে, ক্লায়েন্ট থেকে আসা Origin হেডার যাচাই করা এবং অনুমোদিত Origins-এ কানেকশন নিশ্চিত করা অন্যতম প্রধান নিরাপত্তা ব্যবস্থা। যদি ক্লায়েন্টের Origin হেডার সার্ভারের অনুমোদিত তালিকায় না থাকে, তাহলে কানেকশনটি বন্ধ করা উচিত।
Node.js (ws লাইব্রেরি): Node.js এ
wsলাইব্রেরি ব্যবহার করে CORS সমস্যা সমাধান করা যেতে পারে। নিচে একটি উদাহরণ দেওয়া হলো, যেখানেOriginযাচাই করা হচ্ছে:const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws, req) => { const origin = req.headers.origin; // এখানে ক্লায়েন্টের Origin যাচাই করা হচ্ছে if (origin !== 'http://alloweddomain.com') { console.log('Rejected connection from: ' + origin); ws.close(); // অননুমোদিত Origin থেকে কানেকশন বন্ধ করা return; } ws.on('message', (message) => { console.log('Received: ' + message); }); }); console.log('WebSocket server is running at ws://localhost:8080');এখানে,
req.headers.originদিয়ে ক্লায়েন্টেরOriginহেডার চেক করা হচ্ছে। যদি এটি অনুমোদিত ডোমেইন না হয়, তবে কানেকশন বন্ধ করা হয়।
২. WebSocket প্রটোকলের জন্য CORS পলিসি কনফিগার করা
সার্ভার সাইডে CORS পলিসি কনফিগার করার জন্য, কিছু নির্দিষ্ট হেডার যেমন Access-Control-Allow-Origin ব্যবহার করা যেতে পারে। তবে, HTTP প্রোটোকলের মতো সরাসরি Access-Control-Allow-Origin হেডার ব্যবহারের সুবিধা Web Sockets এ নেই, কারণ Web Sockets HTTP হ্যান্ডশেকের পরে TCP কনেকশন ব্যবহার করে। তবে, কিছু সার্ভারে CORS সমর্থন করার জন্য এই ধরনের কনফিগারেশন ব্যবহার করা যেতে পারে।
Nginx-এ CORS কনফিগারেশন: যদি Nginx প্রাক্সি সার্ভার হিসেবে ব্যবহৃত হয়, তবে
Upgradeহেডার এবংOriginযাচাই করতে হবে:server { listen 80; server_name yourdomain.com; location /ws { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header Origin $http_origin; # Origin হেডার প্রেরণ proxy_cache_bypass $http_upgrade; } }এখানে,
proxy_set_header Origin $http_origin;দিয়ে প্রাক্সি সার্ভার ক্লায়েন্টেরOriginহেডার সার্ভারে পাঠাচ্ছে, যা পরে যাচাই করা যাবে।
৩. WebSocket ক্লায়েন্ট সাইডে CORS সমস্যা সমাধান
ক্লায়েন্ট সাইডে, CORS সম্পর্কিত সমস্যা হ্যান্ডল করার জন্য কিছু সাধারণ কৌশল ব্যবহার করা যেতে পারে। যেমন:
withCredentialsএর মাধ্যমে ক্লায়েন্ট সাইডে কুকি পাঠানো: যদি আপনার Web Socket সার্ভার কুকি বা টোকেন যাচাই করে, তবে ক্লায়েন্ট সাইডেwithCredentialsপ্যারামিটার ব্যবহার করতে পারেন:const socket = new WebSocket('ws://yourdomain.com/ws'); socket.withCredentials = true; // ক্রেডেনশিয়ালসহ সংযোগ পাঠানোএটি CORS পলিসি অনুসারে
cookiesএবং অন্যান্য ক্রেডেনশিয়াল তথ্য প্রেরণ করতে সক্ষম করে।
৪. সার্ভারে Access-Control-Allow-Origin হেডার ব্যবহার করা
যদিও HTTP হেডারের মত Web Sockets এর ক্ষেত্রে সরাসরি Access-Control-Allow-Origin হেডার ব্যবহার করা যায় না, তবে কিছু সার্ভারে CORS পলিসি সমর্থন করার জন্য বিশেষভাবে কনফিগারেশন থাকতে পারে। উদাহরণস্বরূপ, যদি আপনার WebSocket সার্ভার Node.js এ চলে, তবে আপনি এর কনফিগারেশন ফাইলে কিছু এইভাবে সেট করতে পারেন:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080,
handleProtocols: (protocols, request) => {
// Origin হেডার যাচাই
if (request.headers.origin === 'http://alloweddomain.com') {
return protocols[0];
}
return false;
}
});
সারাংশ
Web Sockets এর ক্ষেত্রে Cross-Origin সমস্যা সমাধান করতে হলে, Origin হেডার যাচাই করা এবং অনুমোদিত ডোমেইন থেকে কানেকশন অনুমোদন করা অপরিহার্য। এটি Web Sockets প্রোটোকলের জন্য নিরাপত্তার একটি গুরুত্বপূর্ণ দিক। CORS সমস্যা সমাধান করতে প্রাক্সি সার্ভার কনফিগারেশন, সঠিক হেডার সেটিংস এবং ক্লায়েন্ট সাইডে ক্রেডেনশিয়াল সাপোর্ট ব্যবহৃত হতে পারে। সবশেষে, Web Sockets এর জন্য CORS পলিসি কার্যকরভাবে প্রয়োগ করলে Cross-Origin সমস্যা কমানো সম্ভব।
Read more