जावास्क्रिप्ट में सुरक्षित प्रमाणीकरण: पासवर्ड कैसे न बचाएं

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

पासवर्ड "qwerty123" अब काम नहीं करता: क्यों सुरक्षा उबाऊ नहीं है

\n\n

कल्पना करें: आपने एक शानदार वेब एप्लिकेशन बनाया है। सुंदर इंटरफ़ेस, रिएक्टिव कोड, सब कुछ तेज़ चलता है। आप इसे लॉन्च करते हैं, पहले उपयोगकर्ता को पंजीकृत करते हैं - और एक घंटे के भीतर आपका डेटाबेस सार्वजनिक रूप से लीक हो जाता है। परिचित कहानी? दुर्भाग्य से, जावास्क्रिप्ट में सुरक्षित प्रमाणीकरण एक ऐसा विषय है जिसे कई डेवलपर्स बाद के लिए टाल देते हैं। और यह गलत है।

\n\n

इस लेख में, हम चर्चा करेंगे कि आप अपने एप्लिकेशन को सबसे सामान्य हमलों से कैसे बचाएं: टोकन इंटरसेप्शन, XSS, CSRF और पासवर्ड लीक। हम "अच्छा करना चाहिए" पर व्याख्यान नहीं देंगे - हम वह कोड दिखाएंगे जिसे आप अभी उपयोग कर सकते हैं।

\n\n

तैयार हैं? चलिए शुरू करते हैं।

\n\n

जावास्क्रिप्ट में प्रमाणीकरण: क्लाइंट युद्ध का मैदान क्यों है

\n\n

जब हम वेब में प्रमाणीकरण के बारे में बात करते हैं, तो हम अक्सर बैकएंड के बारे में सोचते हैं: डेटाबेस, सत्र, हैशिंग। लेकिन JavaScript प्रमाणीकरण क्लाइंट पर शुरू होता है। और यहाँ हमारे लिए जाल हैं।

\n\n

ब्राउज़र में जो कुछ भी चलता है, उसे पढ़ा, बदला या चुराया जा सकता है। आपका JavaScript कोड एक हमलावर के लिए एक खुली किताब है, अगर उसे कोई कमजोरी मिल जाए। इसलिए सुरक्षित प्रमाणीकरण का पहला नियम: कभी भी क्लाइंट पर भरोसा न करें। कभी नहीं।

\n\n

क्लाइंट साइड पर मुख्य खतरे

\n\n
    \n
  • XSS (क्रॉस-साइट स्क्रिप्टिंग) — हमलावर एक स्क्रिप्ट इंजेक्ट करता है जो localStorage से टोकन चुराता है।
  • \n
  • CSRF (क्रॉस-साइट रिक्वेस्ट फोर्जरी) — उपयोगकर्ता प्रमाणित है, और एक दुर्भावनापूर्ण साइट उसकी ओर से अनुरोध भेजती है।
  • \n
  • मैन-इन-द-मिडिल — यदि HTTPS का उपयोग नहीं किया जाता है तो ट्रैफ़िक का इंटरसेप्शन।
  • \n
  • पासवर्ड लीक — पासवर्ड को सादे टेक्स्ट में भेजना या कोड में संग्रहीत करना।
  • \n
\n\n

डरावना लगता है? वास्तव में, इससे बचाव करना उतना मुश्किल नहीं है। मुख्य बात यह जानना है कि किन उपकरणों का उपयोग करना है।

\n\n

JWT: सुविधाजनक, लेकिन एक चाल के साथ

\n\n

JWT (JSON वेब टोकन) एक्सेस टोकन बनाने का एक मानक है। यह हल्का है, सर्वर पर भंडारण की आवश्यकता नहीं है, और SPA के लिए एकदम सही है। लेकिन लोकप्रियता इसे निशाना बनाती है।

\n\n

कई डेवलपर्स JWT को localStorage में संग्रहीत करते हैं। यह एक गलती है। localStorage पेज पर किसी भी JavaScript कोड के लिए सुलभ है। यदि आपके पास कम से कम एक XSS कमजोरी है - टोकन चोरी हो जाता है।

\n\n

JWT को सही तरीके से कैसे संग्रहीत करें

\n\n

सबसे अच्छा तरीका है httpOnly कुकी। httpOnly फ़्लैग वाली कुकीज़ JavaScript के लिए सुलभ नहीं हैं। XSS उन्हें चुरा नहीं सकता। लेकिन एक बारीक बात है: कुकीज़ हर अनुरोध के साथ स्वचालित रूप से भेजी जाती हैं, जो एप्लिकेशन को CSRF के प्रति संवेदनशील बनाती है। समाधान - SameSite और CSRF टोकन का उपयोग करें।

\n\n

बैकएंड पर httpOnly कुकी सेट करने का एक उदाहरण यहाँ दिया गया है (Node.js Express के साथ):

\n\n
// सर्वर (Node.js / Express)\nres.cookie('token', jwtToken, {\n  httpOnly: true,       // JavaScript के लिए सुलभ नहीं\n  secure: true,         // केवल HTTPS पर\n  sameSite: 'strict',   // CSRF से सुरक्षा\n  maxAge: 3600000       // 1 घंटा\n});
\n\n

क्लाइंट पर आप बस अनुरोध भेजते हैं - कुकीज़ स्वचालित रूप से संलग्न हो जाएंगी:

\n\n
// क्लाइंट (JavaScript)\nfetch('/api/profile', {\n  method: 'GET',\n  credentials: 'include' // अनिवार्य!\n})\n.then(res => res.json())\n.then(data => console.log(data));
\n\n

ध्यान दें: credentials: 'include' — इसके बिना कुकीज़ दूसरे origin पर नहीं भेजी जाएंगी।

\n\n

पासवर्ड हैशिंग: bcrypt आपकी मदद करेगा

\n\n

पासवर्ड को सादे टेक्स्ट में संग्रहीत करना ऐसा है जैसे घर की चाबियाँ दरवाजे के नीचे चटाई के नीचे छोड़ देना। भले ही आपकी साइट हैक हो जाए, पासवर्ड हमलावर के लिए बेकार होने चाहिए।

\n\n

bcrypt एक हैशिंग एल्गोरिदम है जिसे विशेष रूप से धीमा बनाया गया है। क्योंकि उपयोगकर्ता के लिए पासवर्ड हैश करना एक सेकंड का अंश है, लेकिन अनुमान लगाने के लिए वर्षों लगते हैं। JavaScript (Node.js) में b

ब्लॉग

पुस्तक अनुशंसाएँ