Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I add a maximum expiry date to a session cookie?

Tags:

cookies

I have set a session cookie, which doesn't have any expiry date and will therefore be deleted when the browser is closed.

Now I would like to add a maximum expiry date, meaning that

  • if the browser is closed before the maximum expiry date, my cookie is deleted
  • otherwise my cookie will be deleted passed the maximum expiry date

Notice that I don't want to set a "regular" expiry date because that would make my cookie persistent, failing to be deleted when the browser is closed before the expiry date.

The only solution I found is to have a second, persistent, cookie, with the maximum expiry date: I manually delete my first cookie if that second one is not found (expired). Since I would like to write as little information as possible in cookies, I'd prefer if there were another way.

After @CBroe's comment, I'm adding that the cookie is generated on the client side and I don't have an associated server side session where to store a last access timestamp

2018 update

After starting a bounty on this question, I got a couple of answers. Thank you. As a feedback, which could possibly better clarify the purpose of my question, please notice that I am not looking for code to set a persistent cookie or to implement the solution that I already have (set a second persistent cookie). I was hoping for some other creative suggestions. At the moment, I could use Zeeshan's hint and set the timestamp in the value (I would append it to the actual value). That answer is therefore so far the best candidate for being awarded the bounty.

like image 721
Mario Trucco Avatar asked Feb 03 '16 14:02

Mario Trucco


People also ask

What happen if cookie expires max-age is session?

Cookies without an Expires or Max-Age attribute are treated as session cookies, which means they are removed once the browser is closed. Setting a value on either Expires or Max-Age makes them permanent cookies, since they will exist until they hit their expiry date.

How do I extend a cookie expiry date?

You can extend the life of a cookie beyond the current browser session by setting an expiration date and saving the expiry date within the cookie. This can be done by setting the 'expires' attribute to a date and time.

What is Max-age session for cookie?

When cookies are set with an explicit Expires/Max-Age attribute the value will now be capped to no more than 400 days in the future. Previously, there was no limit and cookies could expire as much as multiple millennia in the future.

Is it necessary to write expiry date in cookies?

Cookies can expire. A cookie with no expiration date specified will expire when the browser is closed. These are often called session cookies because they are removed after the browser session ends (when the browser is closed). Cookies with an expiration date in the past will be removed from the browser.


1 Answers

if you want to keep cookie as session cookie you can not set expiry. so you can either set timestamp as cookie value or create new cookie and set value as timestamp.

var timestamp = (new Date()).getTime()
document.cookie = "cookiename=value;  path=/";
document.cookie = "expirycookie="+timestamp+";  path=/";

for only client side solution you can set interval to check cookie timestamp value. add below code to all your pages

   var interval = setInterval(function(){
         var timeStamp = getCookie('expirycookie') 
         if(!timeStamp){clearInterval(interval); return}
         var cookieDuration = 5*60*1000 //expire cookie after 5 min
         if(timeStamp < (new Date()).getTime() - cookieDuration){
           //cookie expired delete here
           document.cookie = 'cookiename=value; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
           document.cookie = 'expirycookie=value; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
          clearInterval(interval)
        }
      },1000)

function getCookie(cname) {
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for (var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') c = c.substring(1);
    if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
  }
  return "";
}
like image 149
Zeeshan Anjum Avatar answered Oct 09 '22 06:10

Zeeshan Anjum