در توسعهی وباپلیکیشنها، بهویژه زمانی که کلاینت و سرور در دامنهها یا پورتهای مختلف قرار دارند، توسعهدهندگان با مشکلی به نام CORS یا «اشتراکگذاری منابع بین مبداها» روبهرو میشوند. این مکانیزم امنیتی که توسط مرورگرها پیادهسازی میشود، با وجود ضرورت و اهمیتش، گاهی باعث ایجاد خطاهایی میشود که درک و رفع آنها برای توسعهدهندگان بهخصوص در فریمورک جنگو میتواند چالشبرانگیز باشد. در این مقاله قصد داریم نگاهی عمیق و تحلیلی به مفهوم CORS، دلایل وقوع خطاهای مرتبط با آن و راهکارهای مدیریت این خطاها در جنگو داشته باشیم.
CORS چیست؟
CORS مخفف Cross-Origin Resource Sharing است. به زبان ساده، این استاندارد امنیتی مرورگرها مشخص میکند که آیا یک منبع تحت دامنهای خاص (origin) اجازه دارد به منابع دامنهای دیگر دسترسی داشته باشد یا خیر.
به عنوان مثال، فرض کنید یک اپلیکیشن فرانتاند در دامنهی frontend.example.com بخواهد به یک API در دامنهی api.example.com درخواست ارسال کند. چون این دو مبدا متفاوتاند، مرورگر پیش از انجام درخواست بررسی میکند که آیا سرور مقصد این دسترسی را مجاز دانسته است یا خیر. در غیر این صورت، مرورگر درخواست را مسدود کرده و خطای CORS رخ میدهد.
با وجود اینکه CORS بخشی از تنظیمات سمت سرور است، بسیاری از توسعهدهندگان در ابتدا آن را مشکلی در سمت کلاینت تلقی میکنند. اما در واقع، این اشتباهات و خطاها معمولاً به دلیل تنظیمات ناقص یا اشتباه در سرور (بهویژه جنگو) به وجود میآید.
در ادامه مهمترین دلایل وقوع خطاهای CORS در جنگو را مرور میکنیم:
۱. عدم نصب و پیکربندی صحیح کتابخانه django-cors-headers
این کتابخانه رایجترین راه برای مدیریت CORS در جنگو است. اگر این کتابخانه نصب نشده باشد یا در تنظیمات پروژه به درستی اضافه نشده باشد، سرور هدرهای مورد نیاز برای مجوز CORS را به پاسخها اضافه نخواهد کرد.
۲. اشتباه در مقداردهی به تنظیمات
بعضی از متداولترین اشتباهات در این بخش عبارتند از:
قرار ندادن نام دامنهی کلاینت در لیست CORS_ALLOWED_ORIGINS
استفادهی اشتباه از CORS_ALLOW_ALL_ORIGINS = True در محیط تولید
ناهماهنگی در تنظیمات HTTPS و HTTP
۳. فراموش کردن Middleware
در جنگو، ترتیب قرارگیری middlewareها اهمیت دارد. اگر CorsMiddleware بعد از middlewareهایی مانند CommonMiddleware یا CsrfViewMiddleware قرار گیرد، ممکن است به درستی عمل نکند.
۴. درخواستهای پیشپرواز (Preflight Request)
برای برخی درخواستها که شامل متدهایی غیر از GET و POST ساده یا هدرهای سفارشی هستند، مرورگر ابتدا یک درخواست OPTIONS ارسال میکند تا بررسی کند که آیا سرور این درخواست را مجاز میداند یا خیر. اگر سرور این درخواست را پشتیبانی نکند یا پاسخ مناسبی برنگرداند، مرورگر درخواست اصلی را ارسال نخواهد کرد و خطای CORS ظاهر میشود.
۵. اشتباه در مدیریت هدرهای مجاز
در جنگو باید هدرهایی که از سمت کلاینت ارسال میشود در تنظیمات CORS_ALLOW_HEADERS مشخص شود. در غیر این صورت، درخواست رد خواهد شد.
خطاهای CORS معمولاً توسط مرورگر در کنسول توسعهدهنده نمایش داده میشوند. این خطاها میتوانند به شکلهای مختلف ظاهر شوند:
No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
یعنی سرور هدر لازم برای مجاز کردن مبدا درخواست را برنگردانده است.
The CORS policy does not allow access from the specified origin.
یعنی مبدا درخواست در لیست مبداهای مجاز در تنظیمات سرور وجود ندارد.
Response to preflight request doesn’t pass access control check.
یعنی پاسخ به درخواست OPTIONS مناسب نبوده است.
برای رفع خطاهای CORS، بهتر است یک رویکرد مرحلهبهمرحله داشته باشید:
گام اول: نصب کتابخانه
bash
CopyEdit
pip install django-cors-headers
گام دوم: اضافه کردن به INSTALLED_APPS
python
CopyEdit
INSTALLED_APPS = [
…
‘corsheaders’,
…
]
گام سوم: افزودن Middleware
باید CorsMiddleware را در ابتدای لیست middlewareها قرار دهید:
python
CopyEdit
MIDDLEWARE = [
‘corsheaders.middleware.CorsMiddleware’,
‘django.middleware.common.CommonMiddleware’,
…
]
گام چهارم: تعریف دامنههای مجاز
python
CopyEdit
CORS_ALLOWED_ORIGINS = [
“http://localhost:3000”,
“https://frontend.example.com”,
]
گام پنجم: بررسی درخواستهای پیشپرواز
اطمینان حاصل کنید که سرور پاسخ مناسبی برای درخواستهای OPTIONS میدهد. معمولاً نصب و پیکربندی درست django-cors-headers این کار را انجام میدهد.
نکات امنیتی در استفاده از CORS
هرگز در محیط تولید از CORS_ALLOW_ALL_ORIGINS = True استفاده نکنید.
در صورت نیاز به مجاز کردن هدرها یا متدهای خاص، فقط موارد ضروری را در تنظیمات اضافه کنید.
در صورت کار با احراز هویت مبتنی بر کوکی، تنظیمات CORS_ALLOW_CREDENTIALS = True را در نظر بگیرید و از انتقال کوکیها بین دامنهها آگاه باشید.
جمعبندی
خطاهای CORS از رایجترین خطاهایی هستند که توسعهدهندگان وب با آن مواجه میشوند. در جنگو، این مشکل اغلب با تنظیمات دقیق و استفاده از کتابخانهی قدرتمند django-cors-headers قابل مدیریت است. مهمتر از همه، درک صحیح مکانیزم CORS و علت رخ دادن خطاها کمک میکند تا در آینده از بروز این خطاها پیشگیری کنید.
با رعایت اصول امنیتی و دقت در تنظیمات، میتوانید تجربهی کاربری بهتری برای کاربران فراهم کرده و امنیت و عملکرد پروژهی خود را تضمین کنید.
منبع: وبسایت آژانس دیجیتال مارکتینگ آقای کدنویس mr-coder ir