JWT (JSON Web Token) हस्ताक्षरित डेटा भेजने के लिए एक संक्षिप्त फ़ॉर्मेट है, जो अक्सर किसी प्रमाणित उपयोगकर्ता की जानकारी होती है। एक टोकन में बिंदुओं से अलग किए गए तीन हिस्से होते हैं: header.payload.signature। भारत में UPI, आधार-आधारित लॉगिन और India Stack से जुड़े कई API इसी फ़ॉर्मेट पर निर्भर करते हैं।
Payload में देवनागरी नाम — दिखने में सामान्य पर आकार में बड़ा
{"name": "राहुल शर्मा", "city": "जयपुर"} जैसा payload बाकी JSON की तरह ही Base64URL में एन्कोड होता है — Base64URL सिर्फ UTF-8 बाइट्स पर काम करता है, चाहे वे लैटिन अक्षर हों या देवनागरी। फ़र्क बाइट-स्तर पर है: हर देवनागरी वर्ण UTF-8 में 3 बाइट लेता है, जबकि ASCII अक्षर सिर्फ़ 1 बाइट। नतीजा यह है कि हिन्दी नाम और पते वाला payload अंग्रेज़ी-केंद्रित payload से काफ़ी बड़ा हो जाता है, जो हर रिक्वेस्ट के साथ भेजे जाने वाले टोकन के आकार पर असर डालता है।
टोकन के तीन हिस्से
- Header — टोकन का प्रकार और हस्ताक्षर एल्गोरिद्म (जैसे HS256 या RS256) वाला JSON, जो Base64URL में एन्कोड होता है।
- Payload — "claims" वाला JSON: उपयोगकर्ता डेटा, जारी करने का समय, समाप्ति, आदि, यह भी Base64URL में।
- Signature — गुप्त या निजी कुंजी का उपयोग करके header और payload पर गणना किया गया हस्ताक्षर, जो पुष्टि करता है कि टोकन में बदलाव नहीं हुआ।
Base64URL, सामान्य Base64 नहीं
JWT, URL के लिए सुरक्षित वर्णमाला वाले Base64 के एक रूप का उपयोग करता है: + और / वर्णों को - और _ से बदल दिया जाता है, और भराव = को आमतौर पर छोड़ दिया जाता है।
एक महत्वपूर्ण अंतर: डिकोड करना ≠ सत्यापित करना
Header और payload केवल Base64URL हैं — कोई भी बिना किसी कुंजी के इन्हें डिकोड करके सामग्री पढ़ सकता है। टोकन डिकोड करना यह साबित नहीं करता कि डेटा में बदलाव नहीं हुआ। टोकन की सामग्री पर भरोसा तभी किया जा सकता है जब उपयुक्त कुंजी से उसके हस्ताक्षर का सत्यापन कर लिया जाए — और यह सत्यापन सर्वर करता है, न कि कोई क्लाइंट जो सिर्फ टोकन के अंदर देखता है।
ख़तरनाक अटैक: एल्गोरिद्म को "none" से बदलना
JWT स्पेसिफिकेशन none एल्गोरिद्म की अनुमति देता है — यानी बिना साइन किया गया टोकन। अगर बैकएंड फिक्स्ड, पहले से तय एल्गोरिद्म से साइन वेरिफ़ाई करने के बजाय टोकन के हेडर में मौजूद alg फ़ील्ड पर भोलेपन से भरोसा कर ले, तो हमलावर alg को none से बदलकर साइन हटा सकता है। भरोसेमंद JWT लाइब्रेरीज़ इसी अटैक से बचाव के लिए वेरिफ़िकेशन के वक़्त अपेक्षित एल्गोरिद्म साफ़ तौर पर बताना ज़रूरी बनाती हैं।
भारतीय बैकएंड इकोसिस्टम में JWT
Java/Spring Boot सरकारी और एंटरप्राइज़ सिस्टम में, वहीं Node.js और PHP/Laravel स्टार्टअप और फ़िनटेक में — दोनों ही भारतीय बैकएंड इकोसिस्टम में आम हैं, और दोनों JWT को लगभग एक जैसे तरीक़े से हैंडल करते हैं। डिबगिंग के दौरान टोकन डिकोड करना अक्सर पहला क़दम होता है, ख़ासकर जब यह समझना हो कि किसी रिक्वेस्ट के साथ कौन-सी भूमिका (role) या अनुमति (permission) भेजी जा रही है।