HTTP协议的无状态特性你真的了解吗?

众所周知,http的连接是无状态的。

HTTP无状态协议是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

通俗一点讲就是你每次请求服务器的时候,它并不知道你是谁,但实际上现在的网站并不是这样的,因为它们使用了cookie和session来辅助服务器记住你是谁,简单来讲这两者就是你进入这个网站的钥匙。关于cookie和session的具体内容和差别,可以去找度娘聊聊。

可能有的同学会有疑问,我在做网站开发的时候并没有设置cookie啊,那是怎么识别用户的呢?

其实在你首次登陆某个网站的,没有任何cookie的时候(首次登陆或者清除),服务器会给你返回一个自生成的id(tomcat默认的叫JSESSIONID,百度的叫BAIDUID,简书的叫_session_id,当然每个都可能不一样,这个是可以自定义的)cookie值写入你的浏览器。那这个sessionid(以下都会这么叫)就是你进入网站的钥匙。当你登陆的时候,请求会携带这个cookie值传入后台。

(向后台传递的数据)

一般登陆后台的处理就是如果用户登陆成功,那么就将用户id或者。。。保存至session中,那这样就生成了一条识别链。

(简易的识别链)

大概的解释一下:当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识称为sessionid,如果已包含则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。之后的每次访问都会携带上这个sessionid,然后查找对应的session和session中的值,服务器进行登陆判断和权限判断。

关闭浏览器、长时间没有请求服务器、注销登陆,这个时候服务器会把该sessionid从内存中清除掉,这个时候如果我们再去请求服务器,sessionid已经不存在了,所以服务器并没有在内存中找到对应的 sessionid,所以会再产生一个新的sessionid,这个时候一般我们又要再登录一次。

细心的同学会发现,那么是不是意味着,如果我拿到了你这个sessionid我就可以冒充你来访问这个网站了?没有错,如果网站没有很好的防护,确实可以这么做。具体怎么实现我这就不太方便说了,感兴趣也可以度娘cookie窃取欺骗和攻击。

所以请各位同学保护好自己的cookie,不要轻易被偷窃走哦。