زمانی که شما با تکنولوژی وبسوکتها سر و کار دارید، معمولاً با مسائلی چون ارتباط دایمی و بلادرنگ بین مرورگر و سرور مواجه میشوید. وبسوکتها یکی از بهترین انتخابها برای ایجاد ارتباطات دوطرفه و بهینه در وب هستند که در بسیاری از پروژهها، از بازیهای آنلاین گرفته تا چتهای اینترنتی، استفاده میشوند.
یکی از اجزای کلیدی پروتکل وبسوکت، هدرهای HTTP ویژهای است که در حین برقراری ارتباطهای اولیه استفاده میشود. یکی از این هدرها، هدر Sec-WebSocket-Accept
است. این هدر نقش مهمی در تکمیل ارتقاء اتصال HTTP به یک اتصال وبسوکت واقعی و تأیید اعتبار از سوی سرور دارد.
زمانی که یک client، مانند مرورگر، درخواست WebSocket میفرستد، معمولاً باید ابتدا یک هدر Sec-WebSocket-Key
ارسال شود. سرور این مقدار را دریافت و آن را با یک مقدار ثابت ترکیب میکند و سپس از آن یک اثر انگشت (hash) میسازد. نتیجهی این فرآیند به عنوان هدر Sec-WebSocket-Accept
برمیگردد تا نشان دهد که سرور قادر به پشتیبانی از WebSocket است و اتصال تایید شده است.
درک نحوه کارکرد این هدر و نحوه ایجاد آن در کد نه تنها برای ایجاد و مدیریت WebSocket ها ضروری است، بلکه برای درک امنیت و چگونگی جلوگیری از اتصالهای نامطمئن و جعلی نیز بسیار مهم است.
حال به یک نمونه کد نگاه میکنیم که نشان میدهد چطور میتوان از Sec-WebSocket-Accept
در سرور استفاده کرد:
const crypto = require('crypto');
const key = 'dGhlIHNhbXBsZSBub25jZQ=='; // مقدار نمونه
const magicString = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
const acceptKey = crypto.createHash('sha1')
.update(key + magicString)
.digest('base64');
console.log(acceptKey);
در این قطعهکد، ما:
const crypto = require('crypto');
این خط کتابخانهی crypto را که برای انجام عملیاتهای رمزنگاری استفاده میشود، اضافه میکند.
const key = 'dGhlIHNhbXBsZSBub25jZQ==';
این خط یک کلید نمونه که از طرف کلاینت ارسال میشود را تعریف میکند.
const magicString = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
این خط رشتهی ثابت که در URL پروتکل تعریف شده است را مشخص میکند.
const acceptKey = crypto.createHash('sha1').update(key + magicString).digest('base64');
در این خط، ترکیب کلید و رشتهی ثابت با استفاده از الگوریتم SHA-1 هش شده و به base64 تبدیل میشود.
console.log(acceptKey);
این خط مقدار نهایی
Sec-WebSocket-Accept
تولید شده را به کنسول چاپ میکند.