چرا توسعهدهندگان CORS را درک نمیکنند
CORS یکی از ابزارهای امنیتی است که در توسعه وب بیش از حد اشتباه درک میشود. بسیاری از توسعهدهندگان فکر میکنند که CORS از سرور آنها محافظت میکند. اما اینطور نیست.
CORS از کاربر محافظت میکند.
مرورگر سیاست Same-Origin Policy (SOP) را اعمال میکند. این سیاست مانع از آن میشود که یک سایت مخرب از طرف شما به سایت دیگری درخواست ارسال کند. CORS صرفاً روشی است که سرور به مرورگر میگوید آن قانون را برای سایتهای خاصی تسهیل کند.
اگر درخواست شما در Postman کار میکند اما در مرورگر با خطا مواجه میشود، با مشکل CORS روبرو هستید. Postman یک مرورگر نیست، بنابراین این قوانین را اعمال نمیکند.
اشتباهات رایجی که باید از آنها دوری کنید:
- استفاده از CORS به عنوان تنها لایه امنیتی. CORS جایگزین احراز هویت (authentication) نیست. شما همچنان به توکنها، رمز عبورها و محدودسازی نرخ درخواست (rate limiting) نیاز دارید.
- تلهی wildcard. اگر نیاز دارید کوکیها یا اعتبارنامهها (credentials) را ارسال کنید، نمیتوانید از
Access-Control-Allow-Origin: *استفاده کنید. باید دامنه دقیق را لیست کنید. - نادیده گرفتن درخواستهای preflight. مرورگرها قبل از بسیاری از فراخوانیهای API، یک درخواست خودکار
OPTIONSارسال میکنند. اگر سرور شماOPTIONSرا مسدود کند، درخواست اصلی شما با شکست مواجه خواهد شد. - نبودِ هدرهای خطا. اگر API شما خطای 401 یا 500 را بدون هدرهای CORS برگرداند، مرورگر خطای واقعی را پنهان میکند. شما فقط یک پیام عمومی CORS خواهید دید.
چگونه آن را رفع کنیم:
- مدیریت درخواستهای
OPTIONS. مطمئن شوید که سرور شما برای فراخوانیهای preflight، وضعیت 200 یا 204 را برمیگرداند. - استفاده از middleware. CORS را در سطح middleware پیکربندی کنید تا مطمئن شوید تمام پاسخها، از جمله خطاها را پوشش میدهد.
- تنظیم هدر
Vary. اگر چندین origin را به صورت پویا مجاز میدانید، بایدVary: Originرا به پاسخ خود اضافه کنید. - استفاده از ابزارهای مناسب. برای Node.js از پکیج
corsاستفاده کنید. برای Django ازdjango-cors-headersاستفاده کنید.
از تلاش برای دور زدن CORS با افزونههای مرورگر دست بردارید. در عوض، پیکربندی سرور خود را اصلاح کنید.
منبع: https://dev.to/onsen/why-developers-dont-understand-cors-and-how-to-fix-it-19d5
انجمن یادگیری اختیاری: https://t.me/GyaanSetuAi