Ontwerp een JWT Strategie voor Beveiligde API-toegang met Gedetailleerde Gebruikerssessiebeheer
description
Met deze prompt kan de gebruiker een geavanceerde JWT-strategie ontwikkelen die het sessiebeheer binnen hun API verbetert, inclusief bescherming tegen sessie-overname en effectieve afhandeling van gelijktijdige sessies. Dit helpt om de veiligheid en gebruikerservaring te verhogen ten opzichte van standaard JWT-implementaties zonder sessiebeheer.
prompt
try_prompt
Help me een JWT strategie te ontwerpen die gedetailleerd gebruikerssessiebeheer mogelijk maakt voor mijn API. Mijn API-type: <voer het type API in, bijvoorbeeld REST of GraphQL>. Ik wil sessiegegevens zoals inlogtijd, apparaat-ID en actieve sessiestatus opnemen i ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Het ontwerpen van een JWT-strategie voor gedetailleerd gebruikerssessiebeheer in een REST API vereist aandacht voor veiligheid, schaalbaarheid en beheerbaarheid. Hier zijn gedetailleerde adviezen en best practices:
1. Generatie van JWTs met sessiegegevens:
- Claims Opname:
- Voeg in de payload van de JWT claims toe zoals:
- `iat` (issued at): tijdstip van uitgifte.
- `device_id`: uniek apparaat-ID (bijvoorbeeld UUID).
- `session_active`: boolean of status indicator.
- Eventueel andere relevante gegevens zoals gebruikers-ID, rol, IP-adres, etc.
- Signering:
- Gebruik een sterke asymmetrische (bijv. RS256) of symmetrische (bijv. HS256) signing key.
- Bewaar de geheime sleutel(s) veilig, bijvoorbeeld in een Key Vault.
2. Veilig genereren en opslaan:
- Bij login:
- Genereer een uniek `device_id`.
- Plaats de sessiegegevens in de JWT.
- Bewaar aanvullende sessie-informatie in een beveiligde database (bijvoorbeeld in-memory store zoals Redis) voor extra controle en validatie.
- Beveiliging:
- Gebruik HTTPS voor alle communicatie.
- Beperk de levensduur van tokens (`exp` claim) passend bij de sessie.
3. Validatie en beheer:
- Bij elke API-aanroep:
- Valideer de JWT (handtekening, niet verlopen, juiste issuer/audience).
- Controleer of de sessie nog actief is door de sessie-informatie in de database te raadplegen.
- Controleer of het `device_id` overeenkomt met de opgeslagen sessie.
- Sessiebewaking:
- Gebruik een centrale database of cache om sessiestatus en andere dynamische gegevens bij te houden.
- Bij het afmelden of inactief worden, markeer de sessie als niet actief.
4. Voorkomen van sessie-overname:
- Dubbele verificatie:
- Bij gevoelige acties, vraag om aanvullende authenticatie.
- Secure cookies:
- Plaats JWTs in HttpOnly, Secure cookies om XSS aanvallen te voorkomen.
- Device binding:
- Bind tokens aan specifieke apparaat-ID’s en controleer dit bij elk verzoek.
- Frequent rotation:
- Implementeer refresh tokens en rotate tokens periodiek.
5. Beheer van gelijktijdige sessies:
- Toestaan van meerdere actieve sessies per gebruiker:
- Sla meerdere sessies per gebruiker op in de database.
- Geef gebruikers de controle om sessies te bekijken en te beëindigen.
- Beperken van gelijktijdige sessies:
- Beperk het aantal actieve sessies en waarschuw gebruikers bij overschrijding.
6. Veilig afhandelen van sessie-expiratie:
- Instellen van `exp` claim:
- Gebruik korte levensduur voor tokens (bijv. 15 minuten) met refresh tokens.
- Refresh tokens:
- Gebruik aparte tokens om nieuwe JWTs te verkrijgen, met strengere beveiliging.
- Verwerking van verlopen sessies:
- Bij verlopen tokens, vraag een nieuwe login of refresh.
- Markeer sessies in de database als verlopen en blokkeer verdere toegang.
7. Extra best practices:
- Logging en monitoring:
- Log sessieactiviteiten en monitor verdachte gedrag.
- Beveiliging van keys:
- Houd signing keys geheim en gebruik rotatiebeleid.
- Validatie op serverniveau:
- Voer altijd aanvullende validaties uit naast JWT-verificatie.
- Documentatie en gebruiksbeleid:
- Informeer gebruikers over sessiebeheer en beveiligingsmaatregelen.
Kort samengevat:
- Voeg relevante sessieclaims toe bij genereren.
- Bewaar dynamische sessiegegevens in een veilige database.
- Valideer JWT en sessie-informatie bij elk verzoek.
- Gebruik korte levensduur, refresh tokens en binding aan apparaat.
- Voorkom sessie-overname door veilige opslag, binding en verificatie.
- Manage gelijktijdige sessies en expiratie consequent en veilig.
Door deze aanpak te volgen, creëer je een robuuste, veilige en beheersbare JWT-strategie voor je REST API.
provider: deepseek
model: deepseek-chat
Zeker, hier is een gedetailleerd ontwerp voor een JWT-sessiebeheerstrategie voor je REST API:
## 1. JWT Claims Structuur
```json
{
"iss": "jouw-api-domein",
"sub": "gebruikers-id",
"iat": 1620000000,
"exp": 1620003600,
"jti": "unieke-sessie-id",
"session": {
"login_time": 1620000000,
"device_id": "hashed-apparaat-fingerprint",
"status": "active",
"last_activity": 1620000000,
"ip_address": "hashed-ip",
"user_agent": "partial-hashed-user-agent"
}
}
```
## 2. Veilige Generatie van Sessiegegevens
### Apparaat-ID Generatie:
```javascript
const crypto = require('crypto');
function generateDeviceId(req) {
const components = [
req.headers['user-agent'],
req.headers['accept-language'],
req.ip
].join('|');
return crypto.createHash('sha256').update(components).digest('hex');
}
```
### JWT Token Generatie:
```javascript
const jwt = require('jsonwebtoken');
function generateToken(user, deviceInfo) {
const payload = {
sub: user.id,
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + (60 * 60), // 1 uur
jti: crypto.randomBytes(16).toString('hex'),
session: {
login_time: Math.floor(Date.now() / 1000),
device_id: generateDeviceId(deviceInfo),
status: 'active',
last_activity: Math.floor(Date.now() / 1000),
ip_address: crypto.createHash('sha256').update(deviceInfo.ip).digest('hex')
}
};
return jwt.sign(payload, process.env.JWT_SECRET, { algorithm: 'HS256' });
}
```
## 3. Validatie Strategie
### Token Validatie Middleware:
```javascript
function validateToken(req, res, next) {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({ error: 'Token vereist' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
// Controleer sessie status in database
if (!await isSessionActive(decoded.jti)) {
return res.status(401).json({ error: 'Sessie verlopen' });
}
// Update laatste activiteit
await updateLastActivity(decoded.jti);
req.user = decoded;
next();
} catch (error) {
return res.status(401).json({ error: 'Ongeldig token' });
}
}
```
## 4. Sessie Database Management
### Sessie Schema:
```sql
CREATE TABLE user_sessions (
id VARCHAR(32) PRIMARY KEY,
user_id VARCHAR(36) NOT NULL,
device_id VARCHAR(64) NOT NULL,
login_time TIMESTAMP NOT NULL,
last_activity TIMESTAMP NOT NULL,
status ENUM('active', 'revoked', 'expired') NOT NULL,
ip_address VARCHAR(64),
user_agent TEXT,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
## 5. Beveiligingsmaatregelen tegen Sessie-overname
### 1. Token Refresh Strategie
```javascript
// Korte access token (15-30 minuten)
// Lange refresh token (7 dagen) opgeslagen in httpOnly cookie
app.post('/refresh-token', async (req, res) => {
const refreshToken = req.cookies.refresh_token;
if (!await isValidRefreshToken(refreshToken)) {
return res.status(401).json({ error: 'Ongeldige refresh token' });
}
const newAccessToken = generateToken(user, deviceInfo);
res.json({ access_token: newAccessToken });
});
```
### 2. Device Fingerprinting
```javascript
function verifyDeviceConsistency(req, decodedToken) {
const currentDeviceId = generateDeviceId(req);
return currentDeviceId === decodedToken.session.device_id;
}
```
### 3. IP Address Monitoring
```javascript
function detectSuspiciousActivity(req, decodedToken) {
const currentIP = crypto.createHash('sha256').update(req.ip).digest('hex');
const tokenIP = decodedToken.session.ip_address;
if (currentIP !== tokenIP) {
await revokeSession(decodedToken.jti);
return true;
}
return false;
}
```
## 6. Gelijktijdige Sessie Beheer
### Sessie Limiet Implementatie:
```javascript
async function enforceSessionLimit(userId, maxSessions = 5) {
const activeSessions = await getActiveSessions(userId);
if (activeSessions.length >= maxSessions) {
// Verwijder oudste sessie
const oldestSession = activeSessions.sort((a, b) =>
a.last_activity - b.last_activity
)[0];
await revokeSession(oldestSession.id);
}
}
```
## 7. Sessie Expiratie en Renewal
### Automatische Cleanup:
```javascript
// Dagelijkse cleanup job
async function cleanupExpiredSessions() {
await db.query(
'UPDATE user_sessions SET status = "expired" WHERE expires_at < NOW()'
);
// Verwijder oude sessies na 30 dagen
await db.query(
'DELETE FROM user_sessions WHERE expires_at < DATE_SUB(NOW(), INTERVAL 30 DAY)'
);
}
```
### Graceful Expiration Handling:
```javascript
app.use((req, res, next) => {
const token = req.headers.authorization?.replace('Bearer ', '');
if (token) {
try {
const decoded = jwt.decode(token);
if (decoded.exp - Date.now() / 1000 < 300) { // 5 minuten over
// Stuur header om client te informeren
res.set('Token-Expiring-Soon', 'true');
}
} catch (error) {
// Negeer decodeerfouten
}
}
next();
});
```
## 8. Best Practices en Aanbevelingen
### Beveiligingsmaatregelen:
1. **Gebruik HTTPS** altijd
2. **JWT Secret** minstens 32 characters, regelmatig roteren
3. **HttpOnly cookies** voor refresh tokens
4. **CORS** correct configureren
5. **Rate limiting** op login en token endpoints
### Sessie Beheer:
```javascript
// Sessie revocatie endpoint
app.post('/logout', validateToken, async (req, res) => {
await revokeSession(req.user.jti);
res.clearCookie('refresh_token');
res.json({ message: 'Uitgelogd' });
});
// Logout overal endpoint
app.post('/logout-all', validateToken, async (req, res) => {
await revokeAllUserSessions(req.user.sub);
res.clearCookie('refresh_token');
res.json({ message: 'Overal uitgelogd' });
});
```
### Monitoring en Logging:
```javascript
// Log verdachte activiteiten
function logSessionActivity(sessionId, action, metadata = {}) {
console.log({
timestamp: new Date().toISOString(),
sessionId,
action,
...metadata
});
}
```
Deze strategie biedt een robuuste basis voor veilig sessiebeheer met JWT tokens, met bescherming tegen veelvoorkomende aanvallen en flexibiliteit voor verschillende gebruiksscenario's.

