पाठ 36 / 38
Auth, JWT व पासवर्ड हैशिंग
HTTP Basic auth बनाम टोकन-आधारित auth समझें, JWT असल में क्या रखता व साबित करता है, और पासवर्ड को bcrypt से हैश क्यों करना चाहिए, प्लेन टेक्स्ट में कभी नहीं।
Basic auth बनाम टोकन auth
HTTP Basic हर रिक्वेस्ट पर base64 (एन्क्रिप्टेड नहीं!) username:password भेजता है — सरल पर पासवर्ड बार-बार जाता है, कोई session नहीं। टोकन-आधारित auth (JWT) लॉगिन पर एक बार जारी होता है और बाद की रिक्वेस्ट में पासवर्ड की जगह भेजा जाता है, अलग से expire व scope किया जा सकता है।
JWT के अंदर क्या है
JWT तीन base64url भागों को बिंदु से जोड़कर बनता है: header.payload.signature। payload दावों (claims) का सेट है — कोई भी पढ़ सकता है, गोपनीय नहीं। signature ही भरोसे लायक है: यह साबित करता है कि payload से छेड़छाड़ नहीं हुई, जारीकर्ता की गुप्त/निजी कुंजी से हस्ताक्षरित।
// decoded payload — anyone can read this, don't put secrets in it
{
"sub": "user-42",
"roles": ["ROLE_USER"],
"exp": 1893456000
}पासवर्ड कभी प्लेन-टेक्स्ट में न रखें
पासवर्ड का bcrypt hash रखें, पासवर्ड खुद कभी नहीं — bcrypt जानबूझकर धीमा है और हर पासवर्ड के लिए salt रखता है, जो rainbow table को बेकार करता है और brute-force को महँगा बनाता है। लॉगिन प्रयास को दोबारा hash कर तुलना करें, कभी decrypt न करें (bcrypt hash उलटा नहीं होता)।
String hash = BCrypt.hashpw(rawPassword, BCrypt.gensalt()); // store `hash`
// on login:
boolean ok = BCrypt.checkpw(attempt, storedHash);