# Auth, JWT व पासवर्ड हैशिंग — Advanced Java: Streams, Concurrency, JVM और Spring

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

> HTTP Basic और token auth की तुलना करें, JWT में क्या होता है समझें और जानें कि passwords bcrypt से hash क्यों होने चाहिए।

## 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);
```
