Secure Authentication: JWT, Refresh Tokens, and OAuth 2.0
A deep dive into implementing secure authentication flows that protect user data without compromising UX.
Authentication is where many applications fail security audits. Here's how I implement secure authentication that protects users without creating friction.
JWT Best Practices
JSON Web Tokens are powerful but easy to misuse. Follow these practices:
- **Short Expiration**: Access tokens expire in 15 minutes
- **Refresh Tokens**: Longer-lived tokens stored securely
- **HttpOnly Cookies**: Prevent XSS token theft
- **Strong Secrets**: Use cryptographically secure random strings
Token Rotation
Implement refresh token rotation to limit the impact of token theft. Each refresh generates a new refresh token and invalidates the old one.
OAuth 2.0 Integration
For social login, OAuth 2.0 is the standard. The authorization code flow is most secure:
- Redirect user to provider (Google, GitHub)
- User authenticates and grants permissions
- Provider redirects back with authorization code
- Exchange code for tokens server-side
Never expose client secrets to the browser.
Protecting Against Common Attacks
- **CSRF**: Use SameSite cookies and CSRF tokens
- **XSS**: Sanitize inputs, use Content Security Policy
- **Brute Force**: Rate limiting and account lockout
- **Session Fixation**: Regenerate session on login
Password Security
If using passwords:
- Hash with bcrypt or Argon2 (never MD5 or SHA1)
- Enforce minimum complexity
- Check against breach databases
- Implement password reset securely
Multi-Factor Authentication
Add MFA for sensitive applications. TOTP (Time-based One-Time Password) is widely supported. Libraries like speakeasy make implementation straightforward.
Security is a process, not a feature. Regular security audits and staying updated on vulnerabilities is essential.
David Sampson
Senior Full Stack Engineer