Κοινή χρήση πόρων μεταξύ προέλευσης
Το CORS είναι μια από τις πιο συγκεχυμένες τεχνολογίες ιστού, επειδή έχει να κάνει με το να λέει στα προγράμματα περιήγησης τι να επιτρέπουν — όχι να εμποδίζει τις επιθέσεις στον διακομιστή. Μόλις καταλάβετε αυτή τη διάκριση, οι κανόνες έχουν νόημα. Το CORS επιτρέπει στους διακομιστές να εκχωρούν επιλεκτικά δικαιώματα cross-origin. Η πολιτική ίδιας προέλευσης είναι ο προεπιλεγμένος αριθ.
Το πλήρες κείμενο του άρθρου παρέχεται στα Αγγλικά παρακάτω.
Κοινή χρήση πόρων διασταυρούμενης προέλευσης (CORS) Το είναι ένας μηχανισμός προγράμματος περιήγησης που επιτρέπει σε έναν διακομιστή να δηλώνει σε ποιες άλλες πηγές επιτρέπεται να έχει πρόσβαση στις απαντήσεις του. Σε συνδυασμό με την πολιτική ίδιας προέλευσης (η προεπιλογή του προγράμματος περιήγησης "μην αφήνετε μια πηγή να διαβάζει τις απαντήσεις της άλλης"), το CORS παρέχει τον μηχανισμό για επιλεκτική χαλάρωση. "Origin" σημαίνει σχήμα + κεντρικός υπολογιστής + θύρα. Τα https://a.example.com και https://b.example.com είναι διαφορετικής προέλευσης.
Η πολιτική εμποδίζει τη JavaScript ενός ιστότοπου να διαβάζει τα δεδομένα σας σε έναν άλλο ιστότοπο στον οποίο είστε συνδεδεμένοι. τα cookie σας αυτόματα, οπότε ο προορισμός θα ανταποκρινόταν ευχαρίστως και το JS του εισβολέα θα έβλεπε την απάντηση.
Τι προσθέτει η CORS
Πολλές περιπτώσεις νόμιμων χρήσεων απαιτούν αναγνώσεις διασταυρούμενης προέλευσης — γραμματοσειρές από ένα CDN, κλήσεις API από μια διεπαφή σε ένα σύστημα υποστήριξης μέσω embed σε διαφορετικό τομέα κοινωνικής δικτύωσης. Το CORS επιτρέπει στον αποκρινόμενο διακομιστή να πει ρητά "ναι, αυτή η άλλη προέλευση μπορεί να διαβάσει τις απαντήσεις μου."
Ο διακομιστής περιλαμβάνει την κεφαλίδα Access-Control-Allow-Origin στην απόκρισή του. Το πρόγραμμα περιήγησης ελέγχει: εάν η προέλευση αιτήματος ταιριάζει με την τιμή (ή είναι ο χαρακτήρας μπαλαντέρ *), η απάντηση εκτίθεται σε JavaScript. Εάν όχι, το πρόγραμμα περιήγησης αποκλείει την ανάγνωση της JavaScript. Το αίτημα still πήγε, ο διακομιστής ακόμα έλαβε και το επεξεργάστηκε — είναι περιορισμένη μόνο η ορατότητα JavaScript.
Απλές αιτήσεις έναντι αιτημάτων πριν από τον πτήση
Για "απλούς τύπους προγράμματος περιήγησης, ADPO, τα βασικά αιτήματα" το αίτημα και ελέγχει το CORS για την απάντηση. Εάν το CORS δεν το επιτρέπει, η JavaScript δεν μπορεί να το διαβάσει.
Για "σύνθετα" αιτήματα (PUT, DELETE, προσαρμοσμένες κεφαλίδες, τύπος περιεχομένου JSON), το πρόγραμμα περιήγησης στέλνει πρώτα ένα αίτημα preflight OPTIONS ρωτώντας "μπορεί η προέλευση X να υποβάλει αυτό το αίτημα σε εσάς;" Ο διακομιστής αποκρίνεται με επιτρεπόμενες μεθόδους και κεφαλίδες. Μόνο εάν εγκριθεί, το πρόγραμμα περιήγησης στέλνει το πραγματικό αίτημα.
// Preflight
ΕΠΙΛΟΓΕΣ /api/χρήστες HTTP/1.1
Προέλευση: https://app.example.com
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: Εξουσιοδότηση
// Απόκριση διακομιστή
HTTP/1.1 204 Χωρίς περιεχόμενο
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: DELETE, GET, POST
Access-Control-Allow-Headers: Εξουσιοδότηση, Περιεχόμενο-Τύπος
Access-Control-Max-Age: 86400Η προκαταρκτική πτήση αποτρέπει τα προγράμματα περιήγησης από το να στέλνουν σύνθετα αιτήματα αλλαγής κατάστασης σε διακομιστές που δεν τα αναμένουν — μια βασική άμυνα ακόμη και έναντι διακομιστών που δεν έχουν ρυθμιστεί σωστά. Οι κεφαλίδες ελέγχου ταυτότητας ("διαπιστευτήρια") δεν αποστέλλονται σε αιτήματα πολλαπλής προέλευσης από προεπιλογή. Για να τα συμπεριλάβει, η JavaScript πρέπει να ζητήσει:
fetch('https://api.example.com/data', { credentials: 'include' })Και ο διακομιστής πρέπει να ανταποκρίνεται με Access-CZPLred1t allow-Allow μπαλαντέρ *) στο Access-Control-Allow-Origin. Αυτή είναι η κοινή λέξη: Access-Control-Allow-Origin: * + διαπιστευτήρια = τίποτα δεν λειτουργεί.
Συνήθεις παρεξηγήσεις CORS
- CORS δεν είναι μια δυνατότητα ασφαλείας για διακομιστές. Το αίτημα φτάνει στον διακομιστή ανεξάρτητα από το CORS. Το πρόγραμμα περιήγησης αποκλείει τη JavaScript από το reading την απάντηση. Οι διακομιστές πρέπει να εξακολουθούν να ελέγχουν ταυτότητα και να εξουσιοδοτούν. Το
- CORS δεν ισχύει για όλα τα αιτήματα. Τα αιτήματα ίδιας προέλευσης δεν ενεργοποιούν το CORS. Ούτε τα αιτήματα από διακομιστή σε διακομιστή δεν κάνουν. Η διασταυρούμενη προέλευση από πρόγραμμα περιήγησης σε διακομιστή είναι το μόνο μέρος που ζει η CORS.
- Ο χαρακτήρας μπαλαντέρ * είναι επικίνδυνος όταν συνδυάζεται με cookies. Πολλοί οδηγοί προτείνουν το
Access-Control-Allow-Origin: *ως γρήγορη λύση. Για δημόσια API χωρίς διαπιστευτήρια, εντάξει. Για οτιδήποτε με auth, σπασμένα.Τα σφάλματα - CORS είναι προβλήματα από την πλευρά του διακομιστή. Όταν βλέπετε σφάλματα CORS στην κονσόλα του προγράμματος περιήγησης, η επιδιόρθωση βρίσκεται στον διακομιστή που αποκρίνεται και όχι στον κωδικό που ζητά. μπερδεμένος. Το CORS ελέγχει τι εκθέτει το πρόγραμμα περιήγησης σε JavaScript. Το CSRF (δείτε το άρθρο CSRF ) αφορά το εάν το πρόγραμμα περιήγησης στέλνει καθόλου το αίτημα. Το CORS δεν αποτρέπει το CSRF — το αίτημα μπορεί να σταλεί και να υποβληθεί σε επεξεργασία ακόμη και όταν η JavaScript δεν μπορεί να δει την απάντηση. Το CORS δεν τα αντικαθιστά.
Η κρυφή μνήμη πριν την πτήση
Αποκρίσεις πριν από την πτήση μπορούν να αποθηκευτούν προσωρινά μέσω του
Access-Control-Max-Age. Οι μεγάλες μέγιστες ηλικίες (24+ ώρες) μειώνουν τα γενικά έξοδα — κάθε ξεχωριστός συνδυασμός (μέθοδος, URL, κεφαλίδες) δεν προηγείται ξανά μέχρι τη λήξη. Οι σύντομες μέγιστες ηλικίες μπορούν να συσσωρεύσουν σημαντικό λανθάνοντα χρόνο.Κοινά μοτίβα CORS στα 2026
- Δημόσια API:
Access-Control-Allow-Endpoints χωρίς endpoints4X: authentication. - Authenticated API: επαναφέρει την προέλευση κλήσης, εάν βρίσκεται σε λίστα επιτρεπόμενων, με
Access-Control-Allow-Credentials: true. 3XaXPLZ5 APIs: λίστες επιτρεπόμενων παραμέτρων ανά πελάτη που έχουν διαμορφωθεί από τον πελάτη.
- Δημόσια API:
- JS Παράδοση SDK: στατικά αρχεία με ευρεία CORS, συχνά το μοτίβο δημόσιου API.
Συχνές ερωτήσεις
- Γιατί η ανάκτησή μου αποτυγχάνει με ένα σφάλμα CORS;
- Ο διακομιστής που καλείτε δεν περιλάμβανε την κατάλληλη κεφαλίδα Access-Control-Allow-Origin για την προέλευσή σας. Είτε ο διακομιστής πρέπει να ρυθμιστεί ώστε να σας επιτρέπει, είτε πρέπει να τον καλέσετε από την ίδια προέλευση (συνήθως μέσω διακομιστή μεσολάβησης υποστήριξης).
- Μπορώ να παρακάμψω το CORS ως προγραμματιστής;
- Από τον δικό σας κωδικό στο πρόγραμμα περιήγησης, όχι — επιβάλλεται από το πρόγραμμα περιήγησης. Από τον δικό σας διακομιστή (κωδικός υποστήριξης), ναι, επειδή το CORS δεν ισχύει για αιτήματα διακομιστή σε διακομιστή. Η κοινή λύση είναι ένας διακομιστής υποστήριξης: το frontend σας καλεί το backend σας. Το backend σας καλεί το API τρίτου μέρους.
- Το CORS προστατεύει το API μου;
- Όχι άμεσα. Το API είναι προσβάσιμο ανεξάρτητα από το CORS — το πρόγραμμα περιήγησης εξακολουθεί να στέλνει το αίτημα. Η προστασία είναι ότι η JavaScript σε άλλους ιστότοπους δεν μπορεί να διαβάσει απαντήσεις. Για να προστατεύσετε πραγματικά το API, χρησιμοποιήστε έλεγχο ταυτότητας και εξουσιοδότηση στον διακομιστή.
- Πρέπει να χρησιμοποιήσω Access-Control-Allow-Origin: *;
- Μόνο για δημόσια API που δεν δέχονται διαπιστευτήρια. Για οτιδήποτε έχει cookie ή κεφαλίδες εξουσιοδότησης, χρησιμοποιήστε συγκεκριμένες προελεύσεις ή επαναλάβετε την προέλευση κλήσης (με επικύρωση). Τα διαπιστευτήρια μπαλαντέρ + δεν επιτρέπονται από τα προγράμματα περιήγησης.
- Γιατί το CORS προκαταλαμβάνει μόνο ορισμένα αιτήματα;
- Τα απλά αιτήματα (GET, HEAD, POST με βασικούς τύπους περιεχομένου και χωρίς προσαρμοσμένες κεφαλίδες) εξαιρούνται — αυτά είναι ισοδύναμα με αυτά που μπορούσαν να κάνουν οι φόρμες HTML πριν από την ύπαρξη του CORS. Τα σύνθετα αιτήματα δεν έχουν αναλογική φόρμα HTML, επομένως προηγούνται για να δώσουν στον διακομιστή την ευκαιρία να τα απορρίψει πριν από οποιαδήποτε αλλαγή κατάστασης.