应该根据什么条件来生成cookie的token

我看到youtube之类的网站的登录cookie有3年之久,换了ip也能同样不退出。我现在是根据密码的MD5值加ip来生成token的,想问一下应该根据什么样的条件来生成cookie的token比较好,现在的弊端是换了ip就要重新登录,在家和在公司切换很麻烦

阅读 3.8k
6 个回答

不是单纯的加密就可以了,这个里面需要很重要的cookie被篡改的问题,下面的一个示例是我见过的一个系统是这么设计的。

CookieValue = Base64(创建时间+ "@" + 过期时间+ "@" + 用户名+ "#" + md5(创建时间+ "@" + 过期时间+ "@" + 用户名 + solt))

说明:
1:加不加ip都可以,看实际需求。
2:这里使用Base64,你可以换成其他的可逆的加密方式。(Base64严格来说,不能算是一种加密方式,只能说是一种编码的方式。)
3:solt是加盐字符串,比如后台保存的solt="578u90o%^&*";
4:保存过期时间,用户的登录不依赖cookie的生命值,依赖你设置的这个过期时间,你可以把cookie的生命值设置的很长。
怎么防止篡改的:
即使用户可以解密出创建时间+ "@" + 过期时间+ "@" + 用户名+ "#" + md5(创建时间+ "@" + 过期时间+ "@" + 用户名 + solt)的值,因为不知道solt的值,即使用户篡改,后台也能根据md5的生成的防止篡改的验证码判断出被修改过。如果
用户solt的值也知道了,知道怎么生成防止篡改的验证码,你后台只有改下solt的值, 用户就需要重新登录了。

后台判断用户是否登录的流程,给出一个大概的流程。


    String cookieValue = 解析出cookie的value;
    if(null == cookieValue){
        跳转到登录页面;
    }    
   cookieValue = Base64.decrypt(cookieValue);//解密
   String[] array = cookieValue.split("#");//按照"#"拆开
   String[]userInfo = array[0].split("@");//按照"@"拆开,userInfo[0]:创建时间,userInfo[1]:过期时间 ,userInfo[2]:用户名
   if(userInfo[1] < now){
     已经过期,跳转到登录页面;
   }
   String solt = 从配置文件或者缓存中读到保存的solt。
   //验证是否被篡改
   var validCode = md5(array[0] + solt);
   if(array[1].equals(validCode)){//如果从前台传过来的验证码和后台生成能的验证码一致的就认为该用户已经登录。
        进行后续流程
   }else{//cookie被篡改
    跳转到登录页面或者给出提示信息;
   }
   

如果有什么不对的地方,欢迎指出。

既然是cookies,那是保存本地的,跟IP没有多大关系。如果你cookie做判断登录,用户名+token+时间戳。
token的值其实随意,只要你去服务器上面可以组装判断到就可以了,比如说token=md5(用户名+密码+时间戳),密码为数据库的值。
只要保证服务器可以通过cookies上除token以外的值组装得到token即可。

登录cookie有3年之久:

session_set_cookie_params(3*365*86400, '/');
session_start();

token可以是任意随机字符串,只要不重复,服务端维持好一个能映射到相关用户的关系就可以了

我觉得加密就行了.

加密我觉得ok啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题