JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information is digitally signed, making it tamper-proof. JWTs are commonly used to authenticate users and authorize access to resources on a server.
Structure of a JWT
A JWT consists of three parts, separated by dots (.), each encoded using Base64Url:
-
- Header: Contains the type of token (JWT) and the signing algorithm used (e.g., HS256, RS256).
- Payload: Contains the claims (statements about an entity). This can include user information (ID, username, roles), expiration time, and other relevant data.
- Signature: Ensures the integrity of the token. It’s generated using the header, payload, and a secret key (or private key).
Example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Using JWT with Node.js
Node.js offers many libraries for working with JWTs. A popular one is jsonwebtoken
. Here’s a simple example demonstrating token creation and verification:
const jwt = require('jsonwebtoken'); // Secret key - KEEP THIS SECURE! Never hardcode in production. const secretKey = 'your-very-secret-key'; // Create a token const token = jwt.sign({ userId: 123, username: 'john.doe' }, secretKey); console.log('Token:', token); // Verify a token jwt.verify(token, secretKey, (err, decoded) => { if (err) { console.error('Error verifying token:', err); } else { console.log('Decoded token:', decoded); }});
Security Considerations
-
- Secret Key Management: Never hardcode your secret key directly in your code. Use environment variables or a secure secret management service.
-
- Algorithm Selection: Choose a strong signing algorithm like HS256 (HMAC SHA256) or RS256 (RSA SHA256). Avoid using weak algorithms.
-
- Token Expiration: Set a reasonable expiration time for your tokens to limit the impact of compromised tokens.
-
- HTTPS: Aways use HTTPS to protect your tokens during transmission.
-
- Token Revocation: Implement a mechanism to revoke tokens if necessary (e.g., blacklist or use short-lived tokens).
-
- Input Validation: Sanitize and validate all user inputs before including them in the JWT payload to prevent injection attacks.
-
- Rate Limiting: Implement rate limiting to mitigate brute-force attacks.
Remember, security is paramount. Thoroughly consider these aspects when implementing JWTs in your application.