Cross-Origin Web Sockets (CORS for Web Sockets) একটি গুরুত্বপূর্ণ বিষয় যখন Web Socket কানেকশনগুলো এক সাইট থেকে অন্য সাইটে পাঠানো হয়। CORS সাধারণত HTTP রিকোয়েস্টের জন্য ব্যবহৃত একটি নিরাপত্তা বৈশিষ্ট্য, তবে Web Sockets এর ক্ষেত্রে এটি কিছুটা আলাদা। যদিও Web Socket প্রোটোকল HTTP এর উপর ভিত্তি করে কাজ করে, কিন্তু HTTP এর মতোই এর জন্য CORS নীতি রয়েছে, যার মাধ্যমে ব্রাউজার নির্ধারণ করে যে একটি ডোমেইন অন্য একটি ডোমেইন থেকে ডেটা গ্রহণ বা পাঠাতে পারে কিনা।
১. Cross-Origin Web Socket কি?
Cross-Origin Web Socket হলো এমন একটি পরিস্থিতি, যেখানে একটি ওয়েব অ্যাপ্লিকেশন এক ডোমেইন (origin) থেকে অন্য ডোমেইনে Web Socket কানেকশন স্থাপন করার চেষ্টা করে। এটি মূলত নিরাপত্তার দৃষ্টিকোণ থেকে গুরুত্বপূর্ণ, কারণ অন্য ডোমেইন থেকে আনা ডেটা নিরাপত্তার জন্য ঝুঁকিপূর্ণ হতে পারে, বিশেষ করে যদি সেটা ব্যবহারকারীর তথ্য বা সংবেদনশীল ডেটা হয়।
ধরা যাক, আপনার ওয়েব অ্যাপ্লিকেশনটি https://example1.com ডোমেইনে রয়েছে, এবং এটি Web Socket কানেকশন করতে চাচ্ছে ws://example2.com ডোমেইনের সার্ভারের সাথে। এটি একটি Cross-Origin কানেকশন হবে এবং ব্রাউজারের CORS নীতি এর অনুমতি দেওয়ার জন্য কিছু বিশেষ কনফিগারেশন প্রয়োজন।
২. Cross-Origin Web Socket এর নিরাপত্তা
Web Socket প্রোটোকলটি HTTP/HTTPS প্রোটোকলের উপর ভিত্তি করে, তাই ব্রাউজারগুলির নিরাপত্তা ব্যবস্থা Web Socket কানেকশনের ক্ষেত্রে CORS নীতি প্রয়োগ করে। মূলত, CORS হলো একটি নিরাপত্তা বৈশিষ্ট্য যা ব্রাউজারকে একটি ডোমেইন থেকে অন্য ডোমেইনে রিকোয়েস্ট বা ডেটা পাঠাতে বাধা দেয়, যদি না সেটি উল্লিখিত (explicitly allowed) হয়।
তবে, HTTP এর মত, Web Sockets এও Access-Control-Allow-Origin হেডারের মাধ্যমে Cross-Origin অনুমতি প্রদান করা হয়। কিন্তু Web Sockets CORS-অংশে কিছু ভিন্নতা থাকে। HTTP রিকোয়েস্টের মতো Web Sockets প্রাথমিকভাবে এক্সপ্লিসিট CORS হেডার চেক করে না। পরিবর্তে, যখন ব্রাউজার একটি Web Socket কানেকশন পাঠায়, তখন এটি সার্ভারের কাছে একটি "Origin" হেডার পাঠায়।
৩. CORS হেডার এবং Web Socket
যতবার একটি Web Socket কানেকশন ওপেন হয়, ততবার ব্রাউজার একটি Origin হেডার পাঠায়, যা এক ডোমেইন থেকে আরেক ডোমেইনে যোগাযোগের চেষ্টা করে। উদাহরণস্বরূপ:
- Origin:
https://example1.com
সার্ভারের জন্য গুরুত্বপূর্ণ হলো, যে Web Socket ক্লায়েন্টের Origin হেডারটি তাদের অনুমোদিত ডোমেইনগুলির সাথে মেলাতে হবে। যদি এটি মেলে, তাহলে কানেকশন অনুমোদিত হবে, অন্যথায় এটি ব্যর্থ হবে।
৩.১. Web Socket সার্ভারে CORS কনফিগারেশন
যতটুকু সম্ভব, সেরা অভ্যাস হলো শুধুমাত্র বিশ্বাসযোগ্য বা নির্দিষ্ট ডোমেইনগুলিকে Web Socket কানেকশনের অনুমতি দেয়া। উদাহরণস্বরূপ, যদি আপনি Node.js ব্যবহার করে Web Socket সার্ভার পরিচালনা করেন, তাহলে আপনাকে CORS কনফিগারেশন করতে হবে। নীচে একটি উদাহরণ দেওয়া হলো যেখানে শুধুমাত্র নির্দিষ্ট ডোমেইন থেকে কানেকশন অনুমতি দেয়া হয়।
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
handleProtocols: (protocols, request) => {
// Origin চেক করা
const origin = request.headers.origin;
if (origin === 'https://example1.com') {
return true; // Origin মিলে গেলে কানেকশন অনুমোদন
} else {
return false; // Origin না মেললে কানেকশন অস্বীকার
}
}
});
wss.on('connection', function connection(ws) {
console.log('Client connected');
ws.send('Hello, this is a cross-origin WebSocket!');
});
এখানে, handleProtocols ফাংশনে ব্রাউজারের Origin হেডার পরীক্ষা করা হচ্ছে, এবং যদি তা অনুমোদিত ডোমেইনের সাথে মেলে, তবে কানেকশন গ্রহণ করা হচ্ছে।
৪. ব্রাউজার সাইডে Cross-Origin Web Socket কানেকশন
ক্লায়েন্ট সাইডে, Cross-Origin Web Socket কানেকশন স্বাভাবিকভাবেই কাজ করে যদি সার্ভার CORS অনুমতি দেয়। একটি সাধারণ Web Socket কানেকশন ক্লায়েন্ট সাইডে এভাবে তৈরি করা যায়:
const socket = new WebSocket('ws://example2.com/socket');
// কানেকশন ওপেন হলে
socket.onopen = function(event) {
console.log('Connection established!');
socket.send('Hello Server!');
};
// মেসেজ গ্রহণ করা
socket.onmessage = function(event) {
console.log('Received message:', event.data);
};
যদি সার্ভার CORS নীতি মেনে না চলে (অর্থাৎ, নির্দিষ্ট Origin অনুমতি না দেয়), তখন কানেকশন ব্যর্থ হবে এবং ব্রাউজার ত্রুটি দেখাবে।
৫. CORS সমস্যা সমাধান
যেহেতু CORS সুরক্ষা হেডারের মাধ্যমে নিয়ন্ত্রিত, Web Sockets এর Cross-Origin সমস্যা মোকাবিলা করার জন্য কয়েকটি কৌশল গ্রহণ করা যেতে পারে:
৫.১ সার্ভারে CORS হেডার কনফিগারেশন
কিছু Web Socket সার্ভারে CORS হেডার কনফিগারেশন সরাসরি নিয়ন্ত্রণ করা যায়। আপনি CORS হেডারগুলোর মাধ্যমে Web Socket কানেকশনের অনুমতি দিতে পারেন। উদাহরণস্বরূপ, যদি Node.js এর ws প্যাকেজ ব্যবহার করেন, তবে উপরের মতো handleProtocols মেথড ব্যবহার করা যেতে পারে।
৫.২ ws বা wss এর নিরাপত্তা
যেহেতু Web Socket সার্ভারটি HTTP বা HTTPS এর মাধ্যমে কানেক্ট হয়, তাই সার্ভারে নিরাপত্তা নিশ্চিত করতে HTTPS (secure WebSocket - wss://) ব্যবহার করা সবচেয়ে ভালো। এটি ডেটা এনক্রিপ্ট করার মাধ্যমে নিরাপত্তা নিশ্চিত করে।
const WebSocket = require('ws');
const fs = require('fs');
const https = require('https');
// HTTPS সার্ভার তৈরি
const server = https.createServer({
key: fs.readFileSync('private-key.pem'),
cert: fs.readFileSync('certificate.pem')
});
// Web Socket সার্ভার
const wss = new WebSocket.Server({ server });
wss.on('connection', function connection(ws) {
console.log('Secure WebSocket connection established');
});
server.listen(8080);
এখানে, wss:// প্রোটোকল ব্যবহার করা হয়েছে, যা Web Socket কানেকশনে নিরাপত্তা এনক্রিপশন যোগ করে।
সারাংশ
Cross-Origin Web Socket এর ক্ষেত্রে, ব্রাউজার সার্ভারকে একটি Origin হেডার পাঠায়, যা দ্বারা সার্ভার নির্ধারণ করতে পারে কোন ডোমেইন থেকে কানেকশন গ্রহণ করা হবে। সার্ভার সাইডে CORS কনফিগারেশন প্রক্রিয়াটি Web Socket কানেকশন গ্রহণ করার ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে। নিরাপত্তার জন্য CORS চেকের মাধ্যমে একটি নির্দিষ্ট ডোমেইনের কানেকশন অনুমোদন করা যেতে পারে, এবং wss:// নিরাপদ কানেকশনের মাধ্যমে ডেটা এনক্রিপ্ট করা যায়। Cross-Origin Web Socket ব্যবহারের সময় সতর্কতা অবলম্বন করা উচিত, যাতে নিরাপত্তার কোনো সমস্যা সৃষ্টি না হয়।
Cross-Origin Resource Sharing (CORS) একটি নিরাপত্তা বৈশিষ্ট্য যা মূলত HTTP রিকোয়েস্টের জন্য ব্যবহৃত হয়, কিন্তু এটি Web Sockets এর ক্ষেত্রেও প্রযোজ্য। CORS মূলত ব্রাউজারকে একটি সাইট থেকে অন্য সাইটে রিসোর্স অ্যাক্সেসের অনুমতি দিতে বা আটকাতে ব্যবহৃত হয়। যেখানে HTTP রিকোয়েস্টে CORS হেডারগুলি সহজেই চেক করা হয়, Web Sockets এর ক্ষেত্রে CORS এর কাজ কিছুটা আলাদা এবং নীতিগতভাবে Web Socket কানেকশনগুলি প্রাথমিকভাবে CORS-এর মতো হেডার চেক করে না।
তবে, Web Sockets ব্যবহারে Cross-Origin সমস্যাগুলি সমাধান করতে কিছু কনফিগারেশন এবং নিরাপত্তা ব্যবস্থা প্রয়োজন। এই টিউটোরিয়ালে, আমরা CORS এবং Web Sockets এর সম্পর্ক, তাদের নিরাপত্তা বৈশিষ্ট্য এবং কিভাবে CORS সমস্যাগুলি মোকাবিলা করা যায় তা আলোচনা করব।
১. CORS এবং Web Sockets
CORS (Cross-Origin Resource Sharing) মূলত ওয়েব ব্রাউজারের নিরাপত্তা ফিচার যা ক্রস-ডোমেইন রিকোয়েস্টকে নিয়ন্ত্রণ করে। যখন একটি ওয়েব পেজ এক ডোমেইন থেকে অন্য ডোমেইনে রিকোয়েস্ট পাঠায়, তখন ব্রাউজার এই রিকোয়েস্টকে নিরাপদ করতে CORS নীতির মাধ্যমে যাচাই করে।
যদিও Web Sockets HTTP প্রোটোকলের মাধ্যমে কানেক্ট হয়, তবে এটি TCP ভিত্তিক একটি প্রটোকল এবং সরাসরি CORS নীতির আওতায় পড়ে না। তবে, ব্রাউজার Web Socket কানেকশন তৈরির সময় একটি Origin হেডার পাঠায়, যা সঠিকভাবে যাচাই করা দরকার।
১.১ Web Sockets এবং CORS: প্রকৃত অবস্থান
ব্রাউজার যখন একটি Web Socket কানেকশন তৈরি করে, তখন এটি প্রাথমিকভাবে একটি HTTP হ্যান্ডশেক (এটি একটি HTTP রিকোয়েস্ট) তৈরি করে। এই রিকোয়েস্টের মধ্যে Origin হেডার থাকে, যা ক্লায়েন্টের ডোমেইন সম্পর্কে সার্ভারকে জানায়। উদাহরণস্বরূপ:
- Origin:
https://example.com
এটি Web Socket কানেকশনের জন্য নির্দিষ্ট ডোমেইনকে অনুমতি দেবে। কিন্তু এখানে CORS নীতি HTTP রিকোয়েস্টের মতো কঠোরভাবে প্রয়োগ হয় না। তার মানে হল যে Web Socket কানেকশনটি শুধু ক্লায়েন্টের Origin হেডার পরীক্ষা করে এবং সার্ভার সেই হেডার মেনে কানেকশন অনুমোদন বা অস্বীকার করতে পারে।
২. CORS হেডার এবং Web Socket কানেকশন
যখন একটি ব্রাউজার Web Socket কানেকশন তৈরির জন্য একটি HTTP হ্যান্ডশেক পাঠায়, তখন এটি Origin হেডার পাঠায়। উদাহরণস্বরূপ:
- Origin:
https://example1.com
এখানে Origin হেডারটি ব্যবহার করা হয়, যা সার্ভারকে জানিয়ে দেয় কোন ডোমেইন থেকে রিকোয়েস্ট আসছে। এই হেডারটি সার্ভারের পক্ষ থেকে চেক করা হয় এবং কেবলমাত্র নির্দিষ্ট ডোমেইনগুলোকে অনুমতি দেওয়া হয় Web Socket কানেকশন স্থাপনের জন্য।
২.১ CORS হেডার চেক করা
Web Socket কানেকশনে CORS হেডার চেক করার জন্য সার্ভারে কিছু নির্দিষ্ট কনফিগারেশন প্রয়োজন। উদাহরণস্বরূপ, যদি আপনি Node.js এবং ws লাইব্রেরি ব্যবহার করেন, তবে CORS কনফিগারেশন করতে হবে:
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
handleProtocols: (protocols, request) => {
// Origin হেডার চেক করা
const origin = request.headers.origin;
if (origin === 'https://example1.com') {
return true; // Origin মেলে, কানেকশন অনুমোদিত
} else {
return false; // Origin মেলে না, কানেকশন অস্বীকার
}
}
});
wss.on('connection', function connection(ws) {
console.log('Client connected');
ws.send('Hello Client!');
});
এখানে, handleProtocols মেথডের মাধ্যমে Origin হেডার যাচাই করা হচ্ছে। যদি এটি অনুমোদিত ডোমেইনের সাথে মেলে, তাহলে কানেকশন গ্রহণ করা হবে।
৩. CORS সমস্যা এবং Web Socket এর জন্য নিরাপত্তা
Web Sockets এর ক্ষেত্রে CORS-এর কিছু নির্দিষ্ট সমস্যা হতে পারে। কারণ যখন Web Socket কানেকশন স্থাপিত হয়, তখন এটি একটি TCP কানেকশন হিসেবে তৈরি হয়, যার ফলে ঐ সময় CORS হেডারগুলির সাথে কোনো নির্দিষ্ট নিয়ন্ত্রণ ব্যবস্থা থাকে না। তবে, সার্ভার সাইডে নিরাপত্তা ব্যবস্থা ও কনফিগারেশন নিশ্চিত করে Cross-Origin সমস্যাগুলি সহজেই সমাধান করা যায়।
৩.১ Cross-Origin Web Socket ত্রুটি
যদি Web Socket সার্ভার ক্লায়েন্টের Origin হেডার গ্রহণ না করে বা একটি ভুল Origin থাকে, তাহলে ব্রাউজার বা সার্ভার এই কানেকশনকে ব্লক করে। এর ফলে একটি CORS ত্রুটি দেখা দিতে পারে। উদাহরণস্বরূপ:
- Error:
Origin 'https://example1.com' is not allowed by Access-Control-Allow-Origin
৩.২ Web Socket সার্ভার সাইড কনফিগারেশন
Web Socket সার্ভারের CORS কনফিগারেশন যথাযথভাবে করা প্রয়োজন যাতে অনুমোদিত Origin থেকে Web Socket কানেকশন করা যায়। উদাহরণস্বরূপ, সার্ভারে Origin হেডার চেক করতে পারেন এবং অনুমোদিত ডোমেইনগুলি কোডে ম্যানুয়ালি নির্ধারণ করতে পারেন।
৪. নিরাপত্তার জন্য HTTPS এবং WSS
যেহেতু Web Sockets-এর উপর নির্ভরশীল সুরক্ষা ব্যবস্থা মূলত Origin চেকের মাধ্যমে করা হয়, তাই এটি আরও সুরক্ষিত করতে wss:// (WebSocket over HTTPS) ব্যবহার করা উচিত। এতে ডেটা এনক্রিপ্ট করা হবে এবং নিরাপত্তার ঝুঁকি কমে যাবে।
const WebSocket = require('ws');
const https = require('https');
const fs = require('fs');
const server = https.createServer({
key: fs.readFileSync('private-key.pem'),
cert: fs.readFileSync('certificate.pem')
});
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
console.log('Secure WebSocket connection established');
});
server.listen(8080);
এখানে wss:// প্রোটোকল ব্যবহার করা হয়েছে যা TLS/SSL এনক্রিপশন ব্যবহার করে নিরাপদ কানেকশন প্রদান করে। এটি সুরক্ষা নিশ্চিত করতে সাহায্য করে।
৫. সার্ভার সাইডে CORS কনফিগারেশন
Web Socket সার্ভার CORS হেডার ব্যবহার করে নিরাপত্তা নিশ্চিত করতে পারে। যদি Web Socket সার্ভারটি ক্লায়েন্টের Origin হেডার চেক না করে, তবে এটি কোনও সংক্রমণের ঝুঁকি সৃষ্টি করতে পারে। সুতরাং, CORS সঠিকভাবে কনফিগার করা জরুরি।
সারাংশ
Web Sockets এর ক্ষেত্রে CORS সমস্যাগুলির মোকাবিলায়, সার্ভারে Origin হেডার যাচাই করা অত্যন্ত গুরুত্বপূর্ণ। CORS হেডারগুলির মাধ্যমে সার্ভার কোন ডোমেইন থেকে কানেকশন গ্রহণ করবে তা নির্ধারণ করা যায়। Web Socket কানেকশনের জন্য নিরাপত্তা নিশ্চিত করতে wss:// (WebSocket over HTTPS) ব্যবহার করা উচিত। সঠিক কনফিগারেশন এবং নিরাপত্তা ব্যবস্থা প্রয়োগ করে, Cross-Origin Web Socket কানেকশন নিরাপদ এবং কার্যকর করা সম্ভব।
Cross-Origin WebSocket সংযোগের নিরাপত্তা একটি গুরুত্বপূর্ণ বিষয়, বিশেষ করে যখন আপনার ওয়েব অ্যাপ্লিকেশন বা সার্ভার একাধিক ডোমেইনের মধ্যে যোগাযোগ করছে। সাধারণত, Cross-Origin Resource Sharing (CORS) সংক্রান্ত নিরাপত্তা নিয়মাবলী HTTP রিকোয়েস্টের জন্য প্রযোজ্য, কিন্তু Web Sockets এ এর ব্যবহার কিছুটা আলাদা।
Cross-Origin WebSocket সংযোগের ঝুঁকি
Cross-Origin WebSocket সংযোগের মাধ্যমে যখন এক ডোমেইন থেকে অন্য ডোমেইনে ডেটা আদান-প্রদান করা হয়, তখন কিছু নিরাপত্তাজনিত ঝুঁকি তৈরি হতে পারে, যেমন:
- Data Interception (ডেটা ইন্টারসেপশন): একটি তৃতীয় পক্ষ যদি কানেকশনের মাঝখানে অবস্থান করে, তবে তারা ডেটা সংগ্রহ করতে পারে যদি যোগাযোগ এনক্রিপ্টেড না হয়।
- Cross-Site WebSocket Hijacking (CSWSH): এ ধরনের আক্রমণে, আক্রমণকারী অন্যের WebSocket কানেকশন হাইজ্যাক করতে পারে এবং তাতে অবৈধভাবে ডেটা পাঠাতে পারে।
- Denial of Service (DoS): Cross-Origin WebSocket কানেকশনের মাধ্যমে একটি সার্ভারে অতিরিক্ত লোড ফেলা হতে পারে, যা সার্ভারের কার্যক্ষমতা কমিয়ে দিতে পারে।
WebSocket ব্যবহার করার সময় এই ধরনের ঝুঁকি থেকে নিরাপদ থাকার জন্য কিছু কৌশল অবলম্বন করা যেতে পারে।
১. WebSocket সংযোগের নিরাপত্তা নিশ্চিত করা
WebSocket সংযোগের নিরাপত্তা নিশ্চিত করার জন্য প্রথমেই গুরুত্বপূর্ণ হল HTTPS (Secure WebSocket - wss://) ব্যবহার করা, যা সংযোগটি এনক্রিপ্ট করবে এবং নিরাপত্তা বাড়াবে। ws:// (অ্যাডহক WebSocket) এর পরিবর্তে, wss:// ব্যবহার করা উচিত, কারণ এটি TLS/SSL এনক্রিপশন প্রোটোকল ব্যবহার করে, যা তথ্য ট্রান্সমিশনের সময় হ্যাকিং বা ম্যান-ইন-দ্য-মিডল (MITM) আক্রমণ প্রতিরোধ করে।
১.১ TLS/SSL এনক্রিপশন (wss://)
const WebSocket = require('ws');
const fs = require('fs');
const https = require('https');
// HTTPS সার্ভার তৈরি
const server = https.createServer({
key: fs.readFileSync('private-key.pem'),
cert: fs.readFileSync('certificate.pem')
});
// WebSocket সার্ভার সেটআপ
const wss = new WebSocket.Server({ server });
wss.on('connection', function connection(ws) {
console.log('Secure WebSocket connection established');
ws.send('Welcome to the secure WebSocket server!');
});
// সার্ভার চালু করা
server.listen(8080, () => {
console.log('Server is listening on https://localhost:8080');
});
এখানে wss:// প্রোটোকল ব্যবহার করা হয়েছে, যা WebSocket কানেকশনের মধ্যে এনক্রিপশন প্রবর্তন করবে এবং আক্রমণের ঝুঁকি কমাবে।
২. Origin চেক করা
WebSocket কানেকশনের সময় ব্রাউজার একটি Origin হেডার পাঠায়, যা সার্ভারকে জানায় যে, কোন ডোমেইন থেকে কানেকশন আসছে। সার্ভারকে অবশ্যই এই Origin হেডারটি চেক করতে হবে, এবং শুধুমাত্র অনুমোদিত ডোমেইন থেকেই কানেকশন গ্রহণ করতে হবে।
২.১ Origin চেকের মাধ্যমে Cross-Origin WebSocket কানেকশন নিয়ন্ত্রণ
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
handleProtocols: (protocols, request) => {
const origin = request.headers.origin;
// Origin চেক করা
if (origin === 'https://trusted-domain.com') {
return true; // Origin অনুমোদিত হলে কানেকশন গ্রহণ
} else {
return false; // Origin না মেললে কানেকশন অস্বীকার
}
}
});
wss.on('connection', function connection(ws) {
console.log('Connected to trusted domain');
});
এখানে, সার্ভার request.headers.origin হেডারটি চেক করে এবং শুধুমাত্র নির্দিষ্ট ডোমেইন থেকে আসা কানেকশনগুলিকে অনুমতি দেয়। এভাবে, আপনি Cross-Origin WebSocket সংযোগে নিরাপত্তা নিশ্চিত করতে পারেন।
৩. WebSocket সংযোগে Authentication ও Authorization
WebSocket কানেকশনের মাধ্যমে অনুপ্রবেশকারী বা অবৈধ ব্যবহারকারী দ্বারা আক্রমণ রোধ করার জন্য Authentication এবং Authorization অত্যন্ত গুরুত্বপূর্ণ। যদি কানেকশনটি সংবেদনশীল ডেটার সাথে সম্পর্কিত হয়, তবে সার্ভারের কাছে Token-based Authentication বা Session-based Authentication ব্যবহার করা উচিত।
৩.১ Authentication এর মাধ্যমে নিরাপত্তা
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws, request) {
const token = request.headers['authorization']; // Token পাঠানো হতে পারে HTTP হেডারে
if (!token || !isValidToken(token)) {
ws.close(4000, 'Unauthorized'); // অননুমোদিত টোকেন থাকলে কানেকশন বন্ধ করুন
} else {
console.log('Authorized connection');
}
});
function isValidToken(token) {
// টোকেন যাচাই করার ফাংশন
return token === 'valid-token';
}
এখানে, authorization হেডারের মাধ্যমে সার্ভার ক্লায়েন্টের টোকেন যাচাই করছে। যদি টোকেন বৈধ না হয়, তাহলে কানেকশন বন্ধ হয়ে যাবে।
৪. WebSocket এবং CORS (Cross-Origin Resource Sharing)
যদিও CORS মূলত HTTP রিকোয়েস্টের জন্য ব্যবহৃত হয়, তবে কিছু WebSocket সার্ভারে CORS নীতি প্রয়োগ করা যেতে পারে। এর মাধ্যমে সার্ভারটি কোন Origin থেকে আসা WebSocket কানেকশন অনুমোদিত তা নির্ধারণ করতে পারে।
৪.১ WebSocket CORS কনফিগারেশন
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws, request) {
const origin = request.headers.origin;
if (origin === 'https://trusted-origin.com') {
console.log('Connection from trusted origin');
} else {
ws.close(4000, 'Invalid origin');
}
});
এখানে, যদি Origin হেডারটি একটি নির্দিষ্ট ডোমেইন (যেমন https://trusted-origin.com) থেকে আসে, তাহলে WebSocket কানেকশনটি অনুমোদিত হবে, অন্যথায় এটি বন্ধ করা হবে।
৫. Rate Limiting এবং DoS প্রতিরোধ
Cross-Origin WebSocket সংযোগের মাধ্যমে একাধিক কানেকশন আসতে পারে, যা সিস্টেমের ওপর অতিরিক্ত চাপ ফেলতে পারে। এর ফলে Denial of Service (DoS) আক্রমণ হতে পারে, যেখানে সার্ভার অনুপস্থিত হয়ে যায়। তাই, Rate Limiting বা সীমাবদ্ধতা প্রয়োগ করা জরুরি। এর মাধ্যমে সার্ভার ক্লায়েন্টকে একটিভ কানেকশন গড় সীমার মধ্যে রাখতে বাধ্য করতে পারে।
সারাংশ
Cross-Origin WebSocket সংযোগের নিরাপত্তা নিশ্চিত করার জন্য একাধিক পদক্ষেপ নেয়া প্রয়োজন। প্রথমত, TLS/SSL এনক্রিপশন ব্যবহার করে WebSocket কানেকশনের নিরাপত্তা বাড়াতে হবে (যেমন wss://)। দ্বিতীয়ত, Origin চেকিং ব্যবহার করে শুধুমাত্র অনুমোদিত ডোমেইন থেকে কানেকশন গ্রহণ করতে হবে। তৃতীয়ত, Authentication ও Authorization প্রক্রিয়া কার্যকর করা উচিত যাতে শুধুমাত্র অনুমোদিত ব্যবহারকারীরা সংযোগ স্থাপন করতে পারে। অবশেষে, Rate Limiting এবং DoS আক্রমণ প্রতিরোধ কৌশল প্রয়োগ করলে WebSocket সংযোগ আরও নিরাপদ ও কার্যকরী হবে।
WebSocket একটি দুইমুখী (full-duplex) যোগাযোগ প্রোটোকল যা সার্ভার এবং ক্লায়েন্টের মধ্যে রিয়েল-টাইম ডেটা ট্রান্সফারের সুযোগ তৈরি করে। WebSocket ব্যবহার করার জন্য, প্রথমে সার্ভার এবং ক্লায়েন্ট উভয়ের সঠিক কনফিগারেশন প্রয়োজন। নিচে WebSocket সার্ভার এবং ক্লায়েন্ট সাইড কনফিগারেশনের বিস্তারিত আলোচনা করা হলো।
সার্ভার সাইড কনফিগারেশন
WebSocket সার্ভার সাইড কনফিগারেশনের জন্য বিভিন্ন প্রযুক্তি ব্যবহার করা যেতে পারে। এখানে Node.js ব্যবহার করে WebSocket সার্ভার কনফিগারেশন করার একটি সাধারণ উদাহরণ দেওয়া হলো।
১. Node.js WebSocket সার্ভার কনফিগারেশন
Node.js ব্যবহার করে WebSocket সার্ভার তৈরি করতে ws লাইব্রেরি ব্যবহৃত হয়। ws একটি জনপ্রিয় WebSocket লাইব্রেরি যা WebSocket সার্ভার তৈরি করতে সহজতর করে।
// server.js
const WebSocket = require('ws');
const http = require('http');
// HTTP সার্ভার তৈরি করা
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('WebSocket server is running');
});
// WebSocket সার্ভার তৈরি করা
const wss = new WebSocket.Server({ server });
// WebSocket কানেকশনের জন্য ইভেন্ট হ্যান্ডলার
wss.on('connection', (ws) => {
console.log('A new client connected!');
// ক্লায়েন্টকে স্বাগতম বার্তা পাঠানো
ws.send('Welcome to the WebSocket server!');
// ক্লায়েন্ট থেকে মেসেজ পাওয়া গেলে
ws.on('message', (message) => {
console.log('Received:', message);
// সার্ভার থেকে রিপ্লাই পাঠানো
ws.send('Server received: ' + message);
});
// ক্লায়েন্ট ডিসকানেক্ট হলে
ws.on('close', () => {
console.log('A client disconnected.');
});
});
// HTTP সার্ভার চালু করা
server.listen(8080, () => {
console.log('HTTP server listening on port 8080');
});
এখানে, প্রথমে http মডিউল দিয়ে HTTP সার্ভার তৈরি করা হচ্ছে এবং পরে ws লাইব্রেরি দিয়ে WebSocket সার্ভার তৈরি করা হচ্ছে। wss.on('connection') ইভেন্টে ক্লায়েন্টের সাথে সংযোগ হলে, সার্ভার ক্লায়েন্টকে একটি স্বাগতম বার্তা পাঠাচ্ছে এবং ক্লায়েন্টের থেকে মেসেজ পেলে সার্ভার তার রিপ্লাই পাঠাচ্ছে।
২. সার্ভার সাইড কনফিগারেশন পরামর্শ
- কনফিগারেশন অপশন: সার্ভারের জন্য বিভিন্ন কনফিগারেশন অপশন নির্ধারণ করা যায়, যেমন:
maxPayload: প্রতিটি মেসেজের সর্বাধিক সাইজ নির্ধারণ করা।clientTracking: ক্লায়েন্ট ট্র্যাকিং সক্ষম করা (যাতে সার্ভার জানে কতজন ক্লায়েন্ট সংযুক্ত আছে)।
- সিকিউরিটি: যদি HTTPS (WSS) ব্যবহার করতে চান, তাহলে সার্ভারকে SSL/TLS কনফিগারেশন সহ তৈরি করতে হবে, যাতে সংযোগ সুরক্ষিত হয়।
ক্লায়েন্ট সাইড কনফিগারেশন
WebSocket ক্লায়েন্ট সাইডে সাধারণত JavaScript ব্যবহার করে WebSocket কানেকশন তৈরি করা হয়। এটি একটি ব্রাউজার ভিত্তিক সংযোগ, যা সহজেই JavaScript দিয়ে পরিচালিত হতে পারে।
১. ক্লায়েন্ট সাইড কোড (JavaScript)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebSocket Client</title>
</head>
<body>
<h1>WebSocket Client</h1>
<div id="messages"></div>
<input type="text" id="messageInput" placeholder="Type a message">
<button id="sendButton">Send Message</button>
<script>
// WebSocket কানেকশন তৈরি করা
const socket = new WebSocket('ws://localhost:8080'); // সার্ভারের URL
// WebSocket কানেকশন স্থাপিত হলে
socket.onopen = function() {
console.log('Connected to the WebSocket server.');
};
// সার্ভার থেকে মেসেজ পাওয়ার পর
socket.onmessage = function(event) {
const messagesDiv = document.getElementById('messages');
messagesDiv.innerHTML += `<p>Server: ${event.data}</p>`;
};
// ক্লায়েন্টের মেসেজ পাঠানোর জন্য
document.getElementById('sendButton').onclick = function() {
const message = document.getElementById('messageInput').value;
socket.send(message); // মেসেজ সার্ভারে পাঠানো
document.getElementById('messageInput').value = ''; // ইনপুট ফিল্ড পরিষ্কার করা
};
// WebSocket সংযোগের ত্রুটি হলে
socket.onerror = function(error) {
console.log('WebSocket Error:', error);
};
// WebSocket সংযোগ বন্ধ হলে
socket.onclose = function() {
console.log('Disconnected from WebSocket server.');
};
</script>
</body>
</html>
এখানে, new WebSocket('ws://localhost:8080') দিয়ে WebSocket কানেকশন তৈরি করা হচ্ছে। এর পর, onopen, onmessage, onerror, এবং onclose ইভেন্ট হ্যান্ডলার ব্যবহার করা হয়েছে।
২. ক্লায়েন্ট সাইড কনফিগারেশন পরামর্শ
কানেকশন টাইমআউট: কখনো কখনো WebSocket কানেকশন সঠিকভাবে শুরু না হতে পারে। এ ক্ষেত্রে, কানেকশন টাইমআউট সেট করে দেওয়া উচিত, যেমন:
const socket = new WebSocket('ws://localhost:8080'); socket.timeout = 5000; // 5 সেকেন্ড পরে টাইমআউট হবে- রিওট্রাই লজিক: কানেকশন না থাকলে পুনরায় চেষ্টা করার জন্য অটো-রিকানেক্ট লজিক ব্যবহার করা যেতে পারে। WebSocket কানেকশন বন্ধ হয়ে গেলে স্বয়ংক্রিয়ভাবে পুনঃসংযোগের চেষ্টা করা উচিত।
- অথেনটিকেশন: যদি সার্ভার সাইডে অথেনটিকেশন প্রয়োজন হয়, তবে ক্লায়েন্ট সাইডে অথেনটিকেশন হেডার বা টোকেন পাঠানোর ব্যবস্থা থাকতে হবে।
সার্ভার এবং ক্লায়েন্ট কনফিগারেশনের সারাংশ
WebSocket সার্ভার এবং ক্লায়েন্ট সাইড কনফিগারেশন নির্ভর করে ব্যবহৃত প্রযুক্তি এবং প্রজেক্টের প্রয়োজনীয়তার উপর। সার্ভার সাইডে, Node.js এর মতো প্রযুক্তি ব্যবহার করে সহজেই WebSocket সার্ভার কনফিগার করা যায়, যেখানে ক্লায়েন্ট সাইডে JavaScript ব্যবহার করে সরাসরি সংযোগ তৈরি করা হয়। সঠিক কনফিগারেশন এবং নিরাপত্তা ব্যবস্থা নিশ্চিত করলে, WebSocket কার্যকরভাবে ডেটা ট্রান্সফার করতে সক্ষম হয়।
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