# Auth, JWT व पासवर्ड हैशिंग — एडवांस्ड जावा

Source: https://www.geekswithgeeks.com/hi/advanced-java/adv-security-basics

> 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 से छेड़छाड़ नहीं हुई, जारीकर्ता की गुप्त/निजी कुंजी से हस्ताक्षरित।

```json
// 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 उलटा नहीं होता)।

```java
String hash = BCrypt.hashpw(rawPassword, BCrypt.gensalt());   // store `hash`

// on login:
boolean ok = BCrypt.checkpw(attempt, storedHash);
```
