为什么重启浏览器后,session id变了,却能保持登录状态
发布于 10 年前 作者 AntSworD 30781 次浏览 最后一次编辑是 8 年前 来自 问答

正常登录网站,然后重启浏览器,重新打开网页,发现session id已经变了,但是为什么又能保持登录状态呢? 我看了一些PHP网站可以这样,cnode也是这样,很疑惑这个功能的实现方法 有想过除了session id在cookie中还有其他标志身份的方法,但是这样的话session id存在的意义就没有了

19 回复

cookie 中的还有标识符的

@alsotang 那样的话session id不是要不要都可以,没什么存在意义了

session id 是服务器端产生,给当前的用户一个state。你去掉session id的话,每次系统都认为你是新来的。

@leapon 没错啊,所以我说很多网站关闭浏览器后,重新打开,session id已经变成一个新的了,新的session id服务器连之前的session都找不到了,但是服务器为什么还是知道你是已经登录的。而如果cookie中有其他标识符帮助服务器识别登录状态和找到之前的session的话,那session id就没什么实际用途了,因为它的用途已经被这个“其他标识符”取代了

session id 你看到的一般是代理服务器带的,比如 nginx

cookie是在用户端的,可以伪造。session在服务器端,是安全的。第二次登陆对于服务器来说是新来的。而不是沿用上一个的session

@jx-zhou 我关闭浏览器重新打开网页并没进行登陆操作,是一个新的session id服务怎么知道这就是上一次登录的人呢

我按照你说的试了试,果然有这样的问题,但是我的猜测是这样的,sessionID的生成,应该是有一套专门的加密解密算法,你看到的,应该只是加密之后的sessionID,解析之后有可能根本就没变化,所以之前的cookie存储的信息还是能和现在的session匹配,你的登录状态就不会变(我是菜鸟,说的不对清自动忽略。。。)

session表示一次性的会话,打开浏览器---->关闭浏览器-----这一次的会话就结束了

cnodejs里有个connect.sid, 这个是一个server端存贮的sessionId,会被存在client,即使关闭browser,下次打开,发送request的时候,也会在cookie里找到,并发送到server, server端检查到这个session expire date后返回登录及相关信息

首先,你要搞清楚sessionId为什么会变? sessionId是由服务端生成的,所以,它变是服务器主动的,即然服务器主动,那当然能关联上变之前的会话了。。。。

你说的场景是“重启浏览器”后sessionId就变了,正常情况下,重启后是不会变的,就算将sessionid的生存周期设为浏览器关掉就失效,它也只会被销毁,而不是变,一般是重启后第二次访问才发现变了(第一次访问会下发新的sessionId)…你如果真的发现重启后第一次就变了,那有可能你不重启它都会变,也就是说有可能设置成每访问一次,服务器都会生成新的sessionId

结论:你描述的现象如果没有错,那有两种可能 1.sessionId每次都会变(服务器会自动关联旧的session内容,登录状态自然能保存) 2.这个sessionID并不是真正用作会话的sessionId(话话标识其它可以任意命名,比如可以叫abc而不叫sessionId,这样的话,无论sessionId怎么变,都不会影响登录),

@shuson 你可以查下,这个connect.sid的expire是说关闭浏览器就被销毁,仅仅只是保存在浏览器内存而已,下次打开,浏览器是找不到这个connect.sid的

@tim1020 我觉得可能是第二种原因了,因为正常访问没发现session id会变化,重新打开后传的cookie里也没有session id了

@CocaCola183 我看过一些生成session id的源代码,只是根据时间生成的一些随机值而已,而且就算他可以根据这个识别,但是重新打开浏览器后,原先生成的session id已经被销毁了,也就是说他并没有session id可以传给服务器,也无从说服务器识别出他是谁

web.png 不知道这个是否能帮到你,我又按照你的思路走了一遍,关闭浏览器,打开发送原来的请求,发现此时页面是有cookie的,我删掉cookie,然后访问,就弹出登录页面,如果不删掉cookie,页面就直接跳转了。至于为什么关闭浏览器,cookie还存在,可能是因为设置了cookie生存时间(具体在哪里设置的我不是很清楚,貌似在服务端可以设置),设置这个之后,cookie就不会在关闭浏览器的时候就消失了。cookie存在,也就可以直接登录的,回到刚开始的问题,sessionID会变化问什么还可以找到对应的信息,我也不是很明白。。。再学习下吧

在cnodejs.org环境中connect.sid就是你登录成功后server 返回的当时的sessionId,这个connect.sid同时也存入了专门的session storage区域,还包括一个expire date,当browser关闭再打开,sessionId是换了,但server依然会从之前存起来的connect.sid去对照client发过来的connect.sid,如果一致并且expire date没到,就返回登录状态

session id改变,还能登录这貌似不科学啊?

abc网站上有保存登陆10天的checkbox,选了以后,客户端会在登陆成功后,在cookie里存一个10天后expire的,针对abc网站的cookie。

用户下次登陆abc网站时,客户端会把相应cookie送出,服务器端会产生一个新的session id,但是会根据cookie信息让用户自动登陆。

回到顶部