Ontwerp een JWT Beleid voor Beveiligde Cross-Origin API Toegang
description
Met deze prompt kan ik een specifiek beleid opstellen dat mijn API beschermt tegen risico's bij cross-origin toegang, zoals CSRF-aanvallen en tokendiefstal. Het helpt mij veilige methoden te implementeren voor tokenbeheer en CORS-configuraties, waardoor mijn API robuuster wordt en gebruiksvriendelijk blijft voor externe clients.
prompt
Help mij een JWT-beveiligingsbeleid te ontwerpen voor mijn API die cross-origin verzoeken ondersteunt. Mijn API-type: <voer het type API in, bijvoorbeeld REST of GraphQL>. Mijn cross-origin beveiligingsvereisten: <beschrijf vereisten zoals toegestane domeinen, CORS-i ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een voorstel voor een JWT-beveiligingsbeleid voor jouw REST API met cross-origin ondersteuning:
**1. Beveiligingsdoelstellingen en basisprincipes:**
- Alleen toestaan van verzoeken afkomstig van https://mijnwebsite.nl.
- Gebruik van HttpOnly cookies voor het opslaan van JWT's.
- Bescherming tegen CSRF-aanvallen.
- Waarborgen van integriteit en vertrouwelijkheid van tokens.
- Voorkomen van tokenlekken via XSS en andere kwetsbaarheden.
**2. CORS-beleid instellen:**
- Sta alleen verzoeken toe vanaf https://mijnwebsite.nl.
- Configureer CORS headers zodanig dat alleen deze origin toegestaan is:
- `Access-Control-Allow-Origin: https://mijnwebsite.nl`
- `Access-Control-Allow-Credentials: true`
- `Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS`
- `Access-Control-Allow-Headers: (bijvoorbeeld: Content-Type, X-CSRF-Token)`
**3. JWT-opslag en overdracht:**
- **Opslag:** Plaats de JWT in een HttpOnly, Secure cookie:
- `Set-Cookie: token=<JWT>; HttpOnly; Secure; SameSite=Strict; Path=/`
- **Overdracht:** Verzend de JWT automatisch via de cookie bij elke request.
- Dit voorkomt XSS-gerelateerde tokenlekken omdat JavaScript geen toegang heeft tot de cookie.
**4. Authenticatie en autorisatie:**
- Bij elk verzoek controleer je de geldigheid van de JWT uit de cookie.
- Verifieer de token op handtekeningen en claims.
- Gebruik scopes of rollen in de token voor autorisatie.
**5. CSRF-bescherming:**
- Gebruik een CSRF-token dat in een niet-HttpOnly, niet-secure cookie wordt gezet of als header wordt meegestuurd.
- Bij elke mutatie (POST, PUT, DELETE) vraag je de client om het CSRF-token mee te sturen, bijvoorbeeld in een header: `X-CSRF-Token`.
- Validatie van het CSRF-token op de server.
- Omdat de JWT in een HttpOnly cookie staat, kan JavaScript het token niet lezen, waardoor CSRF-aanvallen via XSS worden bemoeilijkt. Maar omdat cookies automatisch worden meegestuurd, is bescherming nodig via CSRF-tokens.
**6. Veilige opslag en overdracht:**
- **Opslag:** Gebruik HttpOnly en Secure flags voor cookies.
- **Overdracht:** Cookies worden automatisch meegezonden met verzoeken, zonder dat JavaScript toegang heeft, waardoor XSS-gevaar vermindert.
- **Verbinding:** Gebruik altijd HTTPS om onderschepte tokens te voorkomen.
**7. Extra beveiligingsmaatregelen:**
- Implementeer korte vervaltijden voor JWT’s (bijvoorbeeld 15-30 minuten).
- Gebruik refresh tokens, opgeslagen in HttpOnly cookies, om nieuwe JWT’s te verkrijgen zonder in te loggen.
- Beperk CORS-access via strikte origin en methoden.
- Regulariseer en log de authenticatiepogingen en monitor verdachte activiteiten.
**Samenvatting:**
Door JWT in HttpOnly, Secure cookies te plaatsen, CORS strikt te configureren, CSRF-tokens te gebruiken en HTTPS te waarborgen, creëer je een robuust beveiligingsbeleid voor je API dat goed beschermt tegen CSRF, XSS, en tokenlekken bij cross-origin toegang.
Heeft u nog specifieke vragen of wensen voor verdere details?
provider: deepseek
model: deepseek-chat
Zeker, hier is een gedetailleerd JWT-beveiligingsbeleid voor jouw REST API met cross-origin ondersteuning:
## 1. JWT Configuratie
```javascript
// Aanbevolen JWT instellingen
{
"alg": "RS256", // Gebruik asymmetrische encryptie
"typ": "JWT",
"exp": "15m", // Korte levensduur access token
"iss": "https://mijnwebsite.nl"
}
```
## 2. Cross-Origin Beveiliging (CORS)
```javascript
// CORS configuratie
app.use(cors({
origin: 'https://mijnwebsite.nl',
credentials: true, // Sta cookies toe
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization', 'X-CSRF-Token']
}));
```
## 3. JWT Opslag en Overdracht
### HttpOnly Cookie Configuratie:
```javascript
// Cookie instellingen voor JWT
res.cookie('jwt', token, {
httpOnly: true,
secure: true, // Alleen HTTPS
sameSite: 'strict', // Cross-origin bescherming
domain: '.mijnwebsite.nl',
maxAge: 15 * 60 * 1000 // 15 minuten
});
```
## 4. CSRF Bescherming
### Double Submit Cookie Pattern:
```javascript
// CSRF token generatie en verificatie
const csrf = require('csurf');
const csrfProtection = csrf({
cookie: {
httpOnly: true,
secure: true,
sameSite: 'strict'
}
});
// CSRF token endpoint
app.get('/api/csrf-token', csrfProtection, (req, res) => {
res.json({ csrfToken: req.csrfToken() });
});
```
## 5. Authenticatie Flow
### Login Proces:
```http
POST /api/login
Content-Type: application/json
{
"username": "gebruiker",
"password": "wachtwoord"
}
Response:
Set-Cookie: jwt=<token>; HttpOnly; Secure; SameSite=Strict
Set-Cookie: csrf-token=<token>; Secure; SameSite=Strict
```
### API Verzoeken:
```javascript
// Voorbeeld API call met CSRF bescherming
fetch('https://api.mijnwebsite.nl/data', {
method: 'POST',
credentials: 'include', // Stuur cookies mee
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken // Van CSRF endpoint
}
});
```
## 6. JWT Verificatie Middleware
```javascript
const authenticateJWT = (req, res, next) => {
const token = req.cookies.jwt;
if (!token) {
return res.status(401).json({ error: 'Toegang geweigerd' });
}
try {
const decoded = jwt.verify(token, publicKey);
req.user = decoded;
next();
} catch (error) {
res.status(403).json({ error: 'Ongeldig token' });
}
};
```
## 7. Refresh Token Strategie
```javascript
// Secure refresh token flow
app.post('/api/refresh', (req, res) => {
const refreshToken = req.cookies.refreshToken;
// Verifieer refresh token (opgeslagen in database)
if (isValidRefreshToken(refreshToken)) {
const newAccessToken = generateJWT(req.user);
res.cookie('jwt', newAccessToken, {
httpOnly: true,
secure: true,
sameSite: 'strict',
maxAge: 15 * 60 * 1000
});
res.json({ success: true });
}
});
```
## 8. Beveiligingsheaders
```javascript
// Extra security headers
app.use(helmet({
hsts: {
maxAge: 31536000,
includeSubDomains: true,
preload: true
},
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "https://mijnwebsite.nl"]
}
}
}));
```
## 9. Aanvullende Beveiligingsmaatregelen
### Token Introspectie:
- Valideer JWT signature bij elke request
- Controleer issuer (`iss`) en audience (`aud`)
- Implementeer token intrekking voor logout
### Rate Limiting:
```javascript
const rateLimit = require('express-rate-limit');
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minuten
max: 5, // Max 5 login pogingen
message: 'Te veel authenticatiepogingen'
});
```
## 10. Best Practices Samenvatting
1. **JWT in HttpOnly cookies** - Voorkomt XSS token diefstal
2. **CSRF tokens** - Bescherming tegen cross-site request forgery
3. **Korte token levensduur** - Beperk impact van token compromittering
4. **SameSite cookies** - Extra cross-origin bescherming
5. **HTTPS verplicht** - Encryptie in transit
6. **CORS restrictief** - Alleen toegestane origins
7. **Regelmatige token refresh** - Beperk exposure tijd
Deze configuratie biedt een robuuste beveiliging voor cross-origin API toegang terwijl gebruikerservaring behouden blijft.