علیرضا
علیرضا
خواندن ۳ دقیقه·۱ سال پیش

ارور cors دیگه چی بود!

زمانی که یک ریکوئست به سمت یه سرور ارسال میشه ( تو مرورگرتون )، SOP که مخفف کلمه ی Same-Origin Policy هست فقط درصورتی که دامنه، پورت و پروتکل مبدا با مقصد یکسان باشه اجازه ی ارسال ریکوئست رو میده.

مثلا اگه سایتی با ادرس https://a.com یه ریکوئست به https://b.com ارسال کنه، سیاست SOP این درخواست رو بلاک خواهد کرد (چون دامنه ی متفاوتی دارن). ولی با ورود مکانیزم CORS که مخفف کلمه ی Cross-Origin-Resource-Sharing هست باعث میشه سخت گیریه سیاست SOP کمتر بشه تا دوتا Origin متفاوت بتونن تحت یک شرایطی به هم درخواست بدن.

پس ارور CORS اساسا زمانی اتفاق میوفته که قرار باشه دوتا Origin متفاوت به هم درخواست بدن. البته برخوردن به این مشکل بستگی به کلاینتی که ازش درخواست میفرستین هم داره که به عنوان مثال مرورگر ها روی این موضوع حساسن ولی ابزار هایی مثل Postman اهمیتی به این موضوع نمیدن و شما به این ارور نخواهید خورد. در واقع کلاینت تصمیم میگیره به این مسئله توجه کنه یا نه.

What are preflight requests?

خب حلا برای اینکه مکانیزم CORS به ما این اجازه رو بده که به یک Origin متفاوت درخواست بدیم، مرورگر قبل از اینکه درخواست اصلی شما رو به سرور بفرسته، خودش یه ریکوئست تحت عنوان OPTION میفرسته تا مطمئن شه درخواست شما از نظر سرور معتبر هست یا نه! به این نوع درخواست که از طرف مرورگر انجام میشه اصطلاحا میگن Preflight Request که اگه رد بشه مرورگر اجازه فرستاد درخواست اصلی رو نمیده و اینجاس که شما با یه ارور رو مخی به نام CORS مواجه میشین :)

CORS Error
CORS Error

Headers that are sent in a preflight request

اینکه تو یه درخواست OPTION مروگر چی میفرسته رو میخوام توضیح بدم که چیزی نیست جزء یکسری هدر!

  • Origin: دامنه ای که ازش درخواست رو ارسال میکنین
  • Access-Control-Request-Headers: هدر هایی که قراره ست کنین
  • Access-Control-Request-Methods: متدی که قرار درخواست ارسال باهاش بشه

و جوابی که سرور به درخواست OPTION میده هم چیزی جزء یه سری هدر نیست :)

  • Access-Control-Allow-Origin: دامنه هایی که مجاز هستن درخواست بدن
  • Access-Control-Allow-Headers: هدر هایی که یک درخواست مجاز هست ارسال کنه
  • Access-Control-Allow-Methods: متد هایی که مجاز هست باهاش ریکوئست ارسال بشه

البته ممکنه که هدر های دیگه ای هم تو جواب ببینم که در ادامه میگم چیا هستن ولی به هر حال تا الان تا حدود خوبی اشنا شدیم.

Which requests require preflight?

همونطور که گفتم مرورگر یک درخواست OPTION میفرسته، اما یکسری شرایط خاص داره که اگه شامل موارد زیر باشه، دیگه خبری از درخواست preflight نخواهد بود.

  • درخواست با یکی از متد های GET, HEAD یا POST باشه.
  • هدر هایی که ارسال میشه محدود به Content-Type, Content-Language, Accept, Accept-Language باشه.
  • و همچنین Content-Type شامل application/x-www-form-urlencoded, text/plain, multipart/form-data باشه.

List of response headers

همونطور که اشاره کردم جوابی که سرور در یک درخواست preflight میده، شامل موارد بیشتری میشن که اینجا یه لیستی از همشون رو براتون اوردم.

  1. Access-Control-Allow-Origin:

شامل دامنه ای که سرور درخواست هارو از اون 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:

مشخص میکنه چه هدر هایی میتونن در معرض کد های ران شده توسط مرورگر باشن.

End of story!

امیدوارم خوندن این پست براتون مفید بوده باشه. اگه جایی اشتباه کردم واقعا معذرت میخوام و اگه تو کامنت بنویسین حتما تصحیح میکنم. شاد و خندون باشین :)

References

developer.mozilla.org

cors
سعی میکنم هرچیز مفیدی که بلدم رو به بقیه هم یاد بدم :)
شاید از این پست‌ها خوشتان بیاید