टी एल; डॉ
JSONP सुरक्षा प्रतिबंध को बायपास करने के लिए आविष्कार की गई एक पुरानी चाल है जो हमें JSON डेटा को एक अलग सर्वर (एक अलग मूल * ) से प्राप्त करने के लिए मना करती है ।
ट्रिक एक <script>
टैग का उपयोग करके काम करता है जो उस स्थान से JSON के लिए पूछता है, जैसे:, { "user":"Smith" }
लेकिन एक फ़ंक्शन में लिपटे, वास्तविक JSONP ("पैडिंग के साथ JSON"):
peopleDataJSONP({"user":"Smith"})
इसे इस रूप में प्राप्त करना हमें अपने peopleDataJSONP
फ़ंक्शन के भीतर डेटा का उपयोग करने में सक्षम बनाता है । JSONP एक बुरा अभ्यास है , इसका उपयोग न करें (नीचे पढ़ें)
समस्या
मान लें कि हम नेविगेट कर रहे हैं ourweb.com
, और हम JSON डेटा (या वास्तव में कोई भी कच्चा डेटा) प्राप्त करना चाहते हैं anotherweb.com
। हम GET अनुरोध उपयोग किया है तो (जैसे XMLHttpRequest
, एक fetch
कॉल, $.ajax
, आदि), हमारे ब्राउज़र हमें बताओ होगा यह इस बदसूरत त्रुटि के साथ अनुमति नहीं है:
हम कैसे डेटा प्राप्त करना चाहते हैं? खैर, <script>
टैग इस पूरे सर्वर (मूल *) प्रतिबंध के अधीन नहीं हैं! इसीलिए हम बिना किसी त्रुटि के किसी भी सर्वर जैसे jnc या गूगल मैप्स जैसे किसी सीडीएन से लाइब्रेरी लोड कर सकते हैं।
महत्वपूर्ण बिंदु : यदि आप इसके बारे में सोचते हैं, तो वे पुस्तकालय वास्तविक, रन करने योग्य जेएस कोड हैं (आमतौर पर सभी तर्क के साथ एक बड़े पैमाने पर कार्य)। लेकिन कच्चे डेटा? JSON डेटा कोड नहीं है । चलाने के लिए कुछ भी नहीं है; यह सिर्फ सादा डेटा है।
इसलिए, हमारे कीमती डेटा को संभालने या हेरफेर करने का कोई तरीका नहीं है। ब्राउज़र हमारे <script>
टैग द्वारा इंगित किए गए डेटा को डाउनलोड करेगा और प्रसंस्करण करते समय यह सही शिकायत करेगा:
wtf क्या यह {"user":"Smith"}
बकवास है? यह कोड नहीं है। मैं गणना नहीं कर सकता, वाक्यविन्यास त्रुटि!
JSONP हैक
उस डेटा का उपयोग करने का पुराना / हैकी तरीका? हमें उस सर्वर को कुछ तर्क के साथ भेजने की आवश्यकता है, इसलिए जब यह लोड हो जाता है, तो ब्राउज़र में आपका कोड उक्त डेटा का उपयोग करने में सक्षम होगा। तो विदेशी सर्वर हमें जेएस फ़ंक्शन के अंदर JSON डेटा भेजता है। डेटा स्वयं उस फ़ंक्शन के इनपुट के रूप में सेट किया गया है। यह इस तरह दिख रहा है:
peopleDataJSONP({"user":"Smith"})
जो इसे JS कोड बनाता है हमारा ब्राउज़र बिना शिकायत के पार्स करेगा! बिल्कुल वैसे ही जैसे यह jQuery लाइब्रेरी के साथ होता है। अब, इसे इस तरह से प्राप्त करने के लिए, क्लाइंट "इसके लिए JSONP- अनुकूल सर्वर" पूछता है, आमतौर पर इस तरह से किया जाता है:
<script src="https://anotherweb.com/api/data-from-people.json?myCallback=peopleDataJSONP"></script>
हमारा ब्राउज़र उस फ़ंक्शन नाम के साथ JSONP प्राप्त करेगा, इसलिए हमें अपने कोड में समान नाम के साथ एक फ़ंक्शन की आवश्यकता है:
const peopleDataJSONP = function(data){
alert(data.user); // "Smith"
}
या इस तरह, एक ही परिणाम:
function peopleDataJSONP(data){
alert(data.user); // "Smith"
}
ब्राउज़र JSONP डाउनलोड करेगा और इसे चलाएगा, जो हमारे फ़ंक्शन को कॉल करता है , जहां तर्क data
हमारा JSON होगा। हम अब अपने डेटा के साथ जो चाहें कर सकते हैं।
JSONP का उपयोग न करें, CORS का उपयोग करें
JSONP कुछ डाउनसाइड के साथ एक क्रॉस-साइट हैक है:
- हम केवल GET अनुरोध कर सकते हैं
- चूंकि यह एक सरल स्क्रिप्ट टैग द्वारा ट्रिगर किया गया GET अनुरोध है, इसलिए हमें सहायक त्रुटियां या प्रगति की जानकारी नहीं मिलती है
- कुछ सुरक्षा चिंताएँ भी हैं, जैसे आपके ग्राहक जेएस कोड में चल रहे हैं जिसे दुर्भावनापूर्ण पेलोड में बदला जा सकता है
- यह केवल JSON डेटा के साथ समस्या को हल करता है, लेकिन समान-मूल सुरक्षा नीति अन्य डेटा (WebFonts, चित्र / वीडियो के साथ drawImage () ...) पर लागू होती है
- यह बहुत सुरुचिपूर्ण और न ही पठनीय है।
Takeaway यह है कि आजकल इसका उपयोग करने की कोई आवश्यकता नहीं है ।
JSONP एक अन्य सर्वर से JSON डेटा प्राप्त करने की चाल है, लेकिन यदि हम अन्य प्रकार के क्रॉस-साइट सामान की आवश्यकता है, तो हम उसी सुरक्षा सिद्धांत (समान-मूल) का उल्लंघन करेंगे।
आपको यहां कोर के बारे में पढ़ना चाहिए , लेकिन इसका सार यह है:
क्रॉस-ऑरिजनल रिसोर्स शेयरिंग (CORS) एक ऐसा तंत्र है जो अतिरिक्त HTTP हेडर का उपयोग करके ब्राउज़र को एक मूल पर चलने वाले वेब एप्लिकेशन को देने के लिए कहता है, एक अलग मूल से चयनित संसाधनों तक पहुंच। एक वेब एप्लिकेशन एक क्रॉस-ऑरिजनल HTTP रिक्वेस्ट पर अमल करता है, जब वह एक ऐसे संसाधन का अनुरोध करता है, जिसका अपना एक अलग मूल (डोमेन, प्रोटोकॉल या पोर्ट) है।
* उत्पत्ति को 3 चीजों से परिभाषित किया गया है: प्रोटोकॉल , पोर्ट और होस्ट । इसलिए, उदाहरण के लिए, (भिन्न प्रोटोकॉल) और (अलग पोर्ट) की https://web.com
तुलना में एक अलग मूल है और जाहिर है (अलग मेजबान)http://web.com
https://web.com:8081
https://thatotherweb.net