Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JsonWebToken: activity-based expiration vs issuing time-based expiration

I'm fairly new to token based authorization. I'm trying to find the flaws in a custom expiration/token-refresh scheme.

I have a basic JWT auth setup in an Express API; I'm setting the JWT expiration to 1 hr; However, JWT checks token expiration relative to the time the token was issued. I would prefer that the expiration time gets reset after each successful api call. If my user is actively using the app for more than an hour, I don't want them to have to log back in to refresh the token (and possibly lose whatever data they are working on.)

On the the other hand, I do want the token to expire if they are not responsive for more than an hour.

I have come up with the following approach:

During every successful API request, issue a new JWT and send it in a custom response header. My client side code is responsible for checking this JWT response header and using its value as the new default Authorization request header. Thus, if there is no API request from the user for more than 1 hour, the token will expire and not be refreshed. Login would then be required. In addition, the original issue-date of the token (timestamp of login-authentication) will be stored so that a "hard-expiration" of the token will be enforced after 24 hours.

This seems fairly straightforward and reasonably secure, but I haven't seen any reference to it in my JWT research. Is there a better way to achieve the same goal? Am I missing a major security hole with this approach?

UPDATE: After thinking of this for some time, I realized that the problem with this is that it opens the door to replay attacks that could not be thwarted by token expiration. So there should absolutely be a "hard-expiration" check: hard expiration would invalidate the token at some time after issue date, regardless of recent user activity.

like image 772
rgwozdz Avatar asked Dec 10 '14 18:12

rgwozdz


People also ask

How are JWT expiration dates determined?

var token = jwt. sign({email_id:'[email protected]'}, "Stack", { expiresIn: "10h" // it will be expired after 10 hours //expiresIn: "20d" // it will be expired after 20 days //expiresIn: 120 // it will be expired after 120ms //expiresIn: "120s" // it will be expired after 120s });

Why do JWTS expire?

Why is JWT token expiration important? A JWT token that never expires is dangerous if the token is stolen then someone can always access the user's data. Quoted from JWT RFC (RFC 7519): The “exp” (expiration time) claim identifies the expiration time on or after which the JWT MUST NOT be accepted for processing.

What is default JWT expiration time?

The JWT access token is only valid for a finite period of time. Using an expired JWT will cause operations to fail. As you saw above, we are told how long a token is valid through expires_in . This value is normally 1200 seconds or 20 minutes.

What is IAT and exp in JWT?

exp (expiration time): Time after which the JWT expires. nbf (not before time): Time before which the JWT must not be accepted for processing. iat (issued at time): Time at which the JWT was issued; can be used to determine age of the JWT.


1 Answers

Here you can check my answer for this scenario: implementing refresh-tokens with angular and express-jwt

What I have done is to have a time window where the server checks if the token expiration and the local server time is in this window and then send a response header with the refreshed token.

like image 95
almoraleslopez Avatar answered Sep 27 '22 21:09

almoraleslopez