Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

Managing JWT Expiration and Refresh

1. Introduction

In modern web applications, JWT (JSON Web Tokens) are frequently used for authentication. Managing the expiration of JWTs and implementing a refresh mechanism is crucial for maintaining security and a seamless user experience.

2. JWT Overview

JWT is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure.

A typical JWT consists of three parts:

  • Header
  • Payload
  • Signature

3. JWT Expiration

JWTs often include an expiration claim (`exp`) that specifies the time after which the token is no longer valid. This is important for security as it limits the time frame in which a stolen token can be used.

Important: Always set a reasonable expiration time to minimize security risks.

4. Refresh Tokens

To enhance user experience while maintaining security, refresh tokens are used. A refresh token allows the application to obtain a new access token without requiring the user to log in again.

Typically, refresh tokens have a longer expiration time than access tokens. When an access token expires, the application can use the refresh token to request a new access token from the server.

5. Implementation

Here’s a step-by-step guide to implementing JWT expiration and refresh in a front-end application:

Step 1: Obtain JWT and Refresh Token


        // Sample API call to authenticate and receive tokens
        async function login(username, password) {
            const response = await fetch('/api/login', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ username, password })
            });
            const data = await response.json();
            if (response.ok) {
                localStorage.setItem('accessToken', data.accessToken);
                localStorage.setItem('refreshToken', data.refreshToken);
            }
        }
        

Step 2: Use Access Token


        // Function to make an authenticated API request
        async function fetchData() {
            const token = localStorage.getItem('accessToken');
            const response = await fetch('/api/data', {
                method: 'GET',
                headers: {
                    'Authorization': `Bearer ${token}`
                }
            });
            return response.json();
        }
        

Step 3: Handle Token Expiration


        // Check for token expiration
        function isTokenExpired(token) {
            const payload = JSON.parse(atob(token.split('.')[1]));
            return payload.exp * 1000 < Date.now();
        }
        

Step 4: Refresh Access Token


        // Function to refresh the access token
        async function refreshAccessToken() {
            const refreshToken = localStorage.getItem('refreshToken');
            const response = await fetch('/api/refresh', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ refreshToken })
            });
            const data = await response.json();
            if (response.ok) {
                localStorage.setItem('accessToken', data.accessToken);
            }
        }
        

6. Best Practices

  • Always use HTTPS to prevent token interception.
  • Set short expiration times for access tokens.
  • Implement secure storage for refresh tokens, such as HttpOnly cookies.
  • Regularly rotate refresh tokens to enhance security.
  • Log out users and invalidate tokens when necessary.

7. FAQ

What happens if a refresh token is stolen?

If a refresh token is stolen, an attacker could obtain new access tokens indefinitely. Implementing rotation and revocation mechanisms is essential to mitigate this risk.

How can I securely store JWTs in the browser?

Use secure cookies with the HttpOnly and Secure flags to store JWTs, which prevents JavaScript access and ensures transmission over HTTPS.

How often should refresh tokens be rotated?

Refresh tokens should be rotated on each use. This practice limits the time a stolen refresh token can be used.