Know-How
JWT best practices — JSON Web Tokens správně
JWT je všude — ale špatně implementovaný JWT je horší než žádný. 'None' algoritmus, klíče v kódu, tokeny bez expirace.
Bezpečné vytvoření
import jwt
from datetime import datetime, timedelta
def create_token(user_id, role):
return jwt.encode({
'sub': user_id, 'role': role,
'iss': 'myapp', 'aud': 'myapp-api',
'exp': datetime.utcnow() + timedelta(minutes=15),
}, PRIVATE_KEY, algorithm='RS256')
def verify_token(token):
return jwt.decode(token, PUBLIC_KEY,
algorithms=['RS256'], # ⚠️ Explicitně!
issuer='myapp', audience='myapp-api')
Typické chyby
- alg: none — nepodepsaný token přijat
- HS256 se sdíleným secret
- Token bez expirace
- Citlivá data v payloadu (JWT není šifrovaný!)
- Token v localStorage (zranitelný XSS)
Refresh token rotation
@app.post('/api/refresh')
async def refresh(request):
old_refresh = request.cookies.get('refresh_token')
payload = verify_refresh_token(old_refresh)
invalidate_refresh_token(old_refresh) # Rotation!
new_access = create_access_token(payload['sub'])
new_refresh = create_refresh_token(payload['sub'])
response = JSONResponse({'access_token': new_access})
response.set_cookie('refresh_token', new_refresh,
httponly=True, secure=True, samesite='strict')
return response
Klíčový takeaway
RS256, explicitní algoritmus, krátká expirace, refresh token rotation. JWT je podpis, ne šifrování.