JWTs के संदर्भ में , स्टॉर्मपथ ने उन्हें संग्रहीत करने के संभावित तरीकों को रेखांकित करते हुए एक काफी मददगार लेख लिखा है, और प्रत्येक विधि से संबंधित (डिस) लाभ।
इसमें XSS और CSRF हमलों का एक संक्षिप्त अवलोकन भी है, और आप उनका मुकाबला कैसे कर सकते हैं।
मैंने नीचे लेख के कुछ छोटे स्निपेट संलग्न किए हैं, यदि उनका लेख ऑफ़लाइन है / उनकी साइट नीचे जाती है।
स्थानीय भंडार
समस्या:
वेब संग्रहण (लोकलस्टोरेज / सेशनस्टोरेज) उसी डोमेन पर जावास्क्रिप्ट के माध्यम से सुलभ है। इसका मतलब है कि आपकी साइट पर चलने वाले किसी भी जावास्क्रिप्ट का उपयोग वेब स्टोरेज तक होगा, और इसकी वजह से क्रॉस-साइट स्क्रिप्टिंग (XSS) हमलों की चपेट में आ सकते हैं। संक्षेप में XSS एक प्रकार की भेद्यता है जहां एक हमलावर जावास्क्रिप्ट को इंजेक्ट कर सकता है जो आपके पृष्ठ पर चलेगा। बेसिक XSS अटैक जावास्क्रिप्ट को फॉर्म इनपुट के माध्यम से इंजेक्ट करने का प्रयास करता है, जहां हमलावर अलर्ट डालता है ('आप हैक हो गए हैं'); यह देखने के लिए कि यह ब्राउज़र द्वारा चलाया जाता है या अन्य उपयोगकर्ताओं द्वारा देखा जा सकता है।
रोकथाम:
XSS को रोकने के लिए, सामान्य प्रतिक्रिया सभी अविश्वसनीय डेटा से बचना और एनकोड करना है। लेकिन यह पूरी कहानी से बहुत दूर है। 2015 में, आधुनिक वेब ऐप सीडीएन या बाहर के बुनियादी ढांचे पर होस्ट किए गए जावास्क्रिप्ट का उपयोग करते हैं। आधुनिक वेब ऐप में ए / बी परीक्षण, फ़नल / मार्केट विश्लेषण और विज्ञापनों के लिए 3 पार्टी जावास्क्रिप्ट लाइब्रेरी शामिल हैं। हम अपने एप्लिकेशन में अन्य लोगों के कोड को आयात करने के लिए Bower जैसे पैकेज प्रबंधकों का उपयोग करते हैं।
क्या होगा यदि आपके द्वारा उपयोग की जाने वाली सभी लिपियों में से केवल एक में समझौता किया जाए? दुर्भावनापूर्ण जावास्क्रिप्ट को पेज पर एम्बेड किया जा सकता है, और वेब स्टोरेज से समझौता किया जाता है। इस प्रकार के एक्सएसएस हमलों से हर किसी का वेब स्टोरेज मिल सकता है जो आपकी साइट पर जाता है, बिना उनकी जानकारी के। शायद यही कारण है कि संगठनों का एक समूह वेब स्टोरेज में किसी भी जानकारी को महत्व नहीं देने या किसी भी जानकारी पर भरोसा नहीं करने की सलाह देता है। इसमें सत्र पहचानकर्ता और टोकन शामिल हैं।
भंडारण तंत्र के रूप में, वेब संग्रहण स्थानांतरण के दौरान किसी भी सुरक्षित मानकों को लागू नहीं करता है। जो कोई भी वेब स्टोरेज को पढ़ता है और इसका उपयोग करता है, उन्हें यह सुनिश्चित करने के लिए अपनी मेहनत करनी चाहिए कि वे हमेशा HTTPS पर JWT भेजें और कभी HTTP न करें।
कुकीज़
समस्या:
कुकीज़, जब HttpOnly कुकी ध्वज के साथ उपयोग किया जाता है, तो जावास्क्रिप्ट के माध्यम से सुलभ नहीं हैं, और XSS के लिए प्रतिरक्षा हैं। आप कुकी की गारंटी देने के लिए सिक्योर कुकी फ्लैग भी सेट कर सकते हैं, केवल HTTPS पर भेजा जाता है। यह एक मुख्य कारण है कि टोकन या सत्र डेटा संग्रहीत करने के लिए कुकीज़ को अतीत में लिया गया है। आधुनिक डेवलपर्स कुकीज़ का उपयोग करने में संकोच करते हैं क्योंकि उन्हें पारंपरिक रूप से सर्वर पर संग्रहीत होने की आवश्यकता होती है, इस प्रकार रेस्टफुल सर्वोत्तम प्रथाओं को तोड़ते हैं। यदि आप कुकी में JWT स्टोर कर रहे हैं तो स्टोरेज मैकेनिज्म के रूप में कुकीज़ को सर्वर पर संग्रहीत होने की आवश्यकता नहीं है। ऐसा इसलिए है क्योंकि JWT सर्वर को अनुरोध को पूरा करने के लिए आवश्यक सभी चीजों को एन्क्रिप्ट करता है।
हालांकि, कुकीज़ एक अलग प्रकार के हमले की चपेट में हैं: क्रॉस-साइट अनुरोध जालसाजी (सीएसआरएफ)। CSRF हमला एक प्रकार का हमला है जो तब होता है जब कोई दुर्भावनापूर्ण वेब साइट, ईमेल या ब्लॉग किसी उपयोगकर्ता के वेब ब्राउज़र पर किसी विश्वसनीय साइट पर अवांछित कार्रवाई करने का कारण बनता है, जिस पर उपयोगकर्ता वर्तमान में प्रमाणित होता है। यह एक तरीका है कि ब्राउज़र कुकीज़ कैसे संभालता है। एक कुकी केवल उन्हीं डोमेन को भेजी जा सकती है जिसमें उसे अनुमति है। डिफ़ॉल्ट रूप से, यह वह डोमेन है जो मूल रूप से कुकी सेट करता है। कुकी को अनुरोध के लिए भेजा जाएगा, भले ही आप galaxies.com या hahagonnahackyou.com पर हों।
रोकथाम:
आधुनिक ब्राउज़र SameSite
ध्वज का समर्थन करते हैं , इसके अलावा HttpOnly
और Secure
। इस ध्वज का उद्देश्य कुकी को क्रॉस-साइट अनुरोधों में स्थानांतरित करने से रोकना है, जिससे कई प्रकार के सीएसआरएफ हमले को रोका जा सके।
जो ब्राउज़र समर्थन नहीं करते हैं SameSite
, उनके लिए CSRF को सिंक्रनाइज़ टोकन पैटर्न का उपयोग करके रोका जा सकता है। यह जटिल लगता है, लेकिन इसके लिए सभी आधुनिक वेब फ्रेमवर्क का समर्थन है।
उदाहरण के लिए, AngularJS के पास यह पुष्टि करने का समाधान है कि कुकी आपके डोमेन द्वारा ही सुलभ है। AngularJS डॉक्स से सीधे:
XHR अनुरोधों को निष्पादित करते समय, $ http सेवा कुकी से एक टोकन पढ़ती है (डिफ़ॉल्ट रूप से, XSRF-TOKEN) और इसे HTTP हेडर (X-XSRF-TOKEN) के रूप में सेट करता है। चूँकि केवल जावास्क्रिप्ट जो आपके डोमेन पर चलता है, कुकी को पढ़ सकता है, आपके सर्वर को यह आश्वासन दिया जा सकता है कि आपके डोमेन पर चल रहे जावास्क्रिप्ट से XHR आया था। आप एक xsrfToken
JWT दावे को शामिल करके इस CSRF सुरक्षा को स्टेटलेस बना सकते हैं :
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
अपने वेब ऐप ढांचे की CSRF सुरक्षा का लाभ उठाते हुए JWT को संचय करने के लिए कुकीज़ को ठोस बनाता है। CSRF को आपके API से HTTP रेफरर और ओरिजिन हेडर की जाँच करके आंशिक रूप से रोका जा सकता है। CSRF हमलों में रेफरर और ऑरिजनल हेडर होंगे जो आपके आवेदन से संबंधित नहीं हैं।
पूरा लेख यहां पाया जा सकता है:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
उनके पास टोकन की संरचना के संबंध में JWTs को सर्वश्रेष्ठ डिजाइन और कार्यान्वित करने के बारे में एक उपयोगी लेख भी है:
https://stormpath.com/blog/jwt-the-right-way/