Apa sebenarnya yang dilakukan header Akses-Kontrol-Bolehkan-Kredensial?

167

Saya mencoba memahami cara menggunakan CORS dan bingung tentang apa yang dilakukan Access-Control-Allow-Credentialsheader.

Dokumentasi mengatakan

Menunjukkan apakah respons terhadap permintaan dapat diekspos ketika bendera kredensial benar.

Tapi saya tidak mengerti apa artinya respons "diekspos".

Adakah yang bisa menjelaskan apa header ini disetel ke true (dalam hubungannya dengan flag kredensial diatur ke true) sebenarnya?

Nate
sumber
xhr.withCredential doc pada sisi klien developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
Weishi Zeng

Jawaban:

264

Secara default, CORS tidak menyertakan cookie pada permintaan lintas asal. Ini berbeda dari teknik lintas asal lainnya seperti JSON-P. JSON-P selalu menyertakan cookie dengan permintaan, dan perilaku ini dapat menyebabkan kelas kerentanan yang disebut pemalsuan permintaan lintas situs , atau CSRF.

Untuk mengurangi kemungkinan kerentanan CSRF di CORS, CORS membutuhkan server dan klien untuk mengakui bahwa tidak masalah untuk memasukkan cookie pada permintaan. Melakukan hal ini menjadikan cookie keputusan aktif, daripada sesuatu yang terjadi secara pasif tanpa kendali apa pun.

Kode klien harus menyetel withCredentialsproperti pada XMLHttpRequestke trueuntuk memberikan izin.

Namun, tajuk ini saja tidak cukup. Server harus merespons dengan Access-Control-Allow-Credentialstajuk. Menanggapi dengan tajuk ini trueberarti server mengizinkan cookie (atau kredensial pengguna lain) untuk dimasukkan pada permintaan lintas-asal.

Anda juga perlu memastikan browser Anda tidak memblokir cookie pihak ketiga jika Anda ingin agar permintaan kredensial lintas-asal berfungsi.

Perhatikan bahwa terlepas dari apakah Anda membuat permintaan yang sama-asal atau lintas-asal, Anda harus melindungi situs Anda dari CSRF (terutama jika permintaan Anda termasuk cookie).

monsur
sumber
1
Saya mengklarifikasi jawaban untuk menjawab pertanyaan Anda. Pada dasarnya JSON-P melakukan kesalahan, dan kurang aman.
monsur
28
Hanya ingin menambahkan ini sedikit untuk mengomentari arti "terbuka." Spesifikasi tidak memerlukan pra-penerbangan (bolak-balik tambahan untuk memeriksa apakah server akan mengizinkan kredensial) untuk mendapatkan permintaan. Alih-alih preflighting, browser hanya akan selalu membuat permintaan, mengirimkan cookie jika withCredentialsdiatur, tetapi kemudian ketika menerima respons, jika withCredentials diatur, itu hanya akan mengirimkan / memaparkan hasilnya ke panggilan javascript jika respons memiliki Akses Kumpulan header -Control-Allow-Credentials. Jika tidak ada tajuk, itu tidak memaparkan respons, secara efektif menghapusnya.
heavi5ide
4
@ heavi5ide, Ya, bahkan jika browser tidak mengekspos respons terhadap kode klien, permintaan dengan cookie masih dikirim (untuk permintaan yang tidak disorot). Jadi CSRF akan tetap dilakukan.
Pacerier
7
Karena ini adalah jawaban yang begitu populer, saya akan menambahkan satu lagi informasi penting: selain mengonfigurasi permintaan dan tajuk tanggapan dengan benar, Anda juga perlu memastikan peramban Anda tidak memblokir cookie pihak ketiga jika Anda ingin permintaan kredensial lintas-asal berfungsi. Lihat stackoverflow.com/a/16634887/2970321
alexw
5
Ini adalah jawaban yang jelas sehingga siapa pun yang membacanya pertama kali dapat memahami dan memperbaiki kode mereka yang tampaknya tidak berfungsi dengan baik dengan cookie. Terima kasih!
asgs