زمانی که یک ریکوئست به سمت یه سرور ارسال میشه ( تو مرورگرتون )، SOP که مخفف کلمه ی Same-Origin Policy هست فقط درصورتی که دامنه، پورت و پروتکل مبدا با مقصد یکسان باشه اجازه ی ارسال ریکوئست رو میده.
مثلا اگه سایتی با ادرس https://a.com یه ریکوئست به https://b.com ارسال کنه، سیاست SOP این درخواست رو بلاک خواهد کرد (چون دامنه ی متفاوتی دارن). ولی با ورود مکانیزم CORS که مخفف کلمه ی Cross-Origin-Resource-Sharing هست باعث میشه سخت گیریه سیاست SOP کمتر بشه تا دوتا Origin متفاوت بتونن تحت یک شرایطی به هم درخواست بدن.
پس ارور CORS اساسا زمانی اتفاق میوفته که قرار باشه دوتا Origin متفاوت به هم درخواست بدن. البته برخوردن به این مشکل بستگی به کلاینتی که ازش درخواست میفرستین هم داره که به عنوان مثال مرورگر ها روی این موضوع حساسن ولی ابزار هایی مثل Postman اهمیتی به این موضوع نمیدن و شما به این ارور نخواهید خورد. در واقع کلاینت تصمیم میگیره به این مسئله توجه کنه یا نه.
خب حلا برای اینکه مکانیزم CORS به ما این اجازه رو بده که به یک Origin متفاوت درخواست بدیم، مرورگر قبل از اینکه درخواست اصلی شما رو به سرور بفرسته، خودش یه ریکوئست تحت عنوان OPTION میفرسته تا مطمئن شه درخواست شما از نظر سرور معتبر هست یا نه! به این نوع درخواست که از طرف مرورگر انجام میشه اصطلاحا میگن Preflight Request که اگه رد بشه مرورگر اجازه فرستاد درخواست اصلی رو نمیده و اینجاس که شما با یه ارور رو مخی به نام CORS مواجه میشین :)
اینکه تو یه درخواست OPTION مروگر چی میفرسته رو میخوام توضیح بدم که چیزی نیست جزء یکسری هدر!
و جوابی که سرور به درخواست OPTION میده هم چیزی جزء یه سری هدر نیست :)
البته ممکنه که هدر های دیگه ای هم تو جواب ببینم که در ادامه میگم چیا هستن ولی به هر حال تا الان تا حدود خوبی اشنا شدیم.
همونطور که گفتم مرورگر یک درخواست OPTION میفرسته، اما یکسری شرایط خاص داره که اگه شامل موارد زیر باشه، دیگه خبری از درخواست preflight نخواهد بود.
همونطور که اشاره کردم جوابی که سرور در یک درخواست preflight میده، شامل موارد بیشتری میشن که اینجا یه لیستی از همشون رو براتون اوردم.
شامل دامنه ای که سرور درخواست هارو از اون origin میپذیره.
2. Access-Control-Allow-Methods:
نشون میده سرور از کدوم متدها های HTTP پشتیبانی میکنه.
3. Access-Control-Allow-Headers:
هدر های مجاز هستن در یک درخواست ست بشن.
4. Access-Control-Allow-Credentials:
اگه مقدارش True باشه به این معنیه که کد های ران شده توسط مرورگر به cookie ها، authorization header ها و یا به TLS client certification ها دسترسی خواهند داشت.
5. Access-Control-Max-Age:
درخواست های preflight توسط مرورگر کش میشن، که این هدر مدت زمان کش رو مشخص میکنه.
6. Access-Control-Expose-Headers:
مشخص میکنه چه هدر هایی میتونن در معرض کد های ران شده توسط مرورگر باشن.
امیدوارم خوندن این پست براتون مفید بوده باشه. اگه جایی اشتباه کردم واقعا معذرت میخوام و اگه تو کامنت بنویسین حتما تصحیح میکنم. شاد و خندون باشین :)