三、理解session和cookie

服务器为何需要知道谁在请求

http请求是无状态的,客户端浏览器发送请求到服务端,服务端处理请求并返回就结束了,当该客户端再次请求服务端,是无法知道是否为同一个用户在访问。例如用户在购物网站选择商品加入购物车,下单结算。用户再次访问该网站,是需要获得自己购物车数据,订单中商品数据的。

何为一次会话

我们使用浏览器访问一个网站,不管我们在该网站点击了多少链接,进入过多少页面,直到我们关闭浏览器称之为一次会话。

如何识别是否是同一个用户发送的多次请求

用户使用浏览器第一次请求服务端,服务端如果能产生一个唯一id,并将这个id发送给客户端浏览器,以后用户再在该网站访问其他页面时将这个id携带上一并发送给服务器,服务器不就知道这些请求来自同一个id,即同一个用户。我们提供登录页面,用户输入账户名、密码登录,我们将这个id对应到这个账户名上存储在服务器文件里,用户再发送请求过来时携带上这个id,服务器拿到这个id从文件中寻找,找到对应的用户名,就可以知道这次请求是这个账户了。

session和cookie如何配合维持状态【实现登录】

session就是服务端产生的这个唯一id,并存储在服务端文件中,cookie则保存着这个id,浏览器每次访问服务器都会携带上这个id,cookie存储在本地电脑上。

当我们使用浏览器第一次访问一个网站,服务器发现没有id就会产生一个唯一session id,并存储在服务器上,同时会发出写cookie的指令,用户浏览器接收到写cookie指令就会在用户电脑的临时目录生成cookie文件,并包含键名为PHPSESSID,值为这个id。以后访问该网站,浏览器会自动携带该cookie。

【cookie有有效期,不设置则为会话级别,即关闭浏览器这个cookie就失效了】cookie存储在用户本地电脑,所以安全性很差,不能将敏感信息存入其中,例如密码。

session的过期时间一般为每次访问则延长为当前时间30分钟后的时间。所以用户长时间不操作就会过期,要求重新登录,此时服务端seesion id也会刷新,并发出写cookie指令要求浏览器更改id值。

不同网站要求浏览器写cookie,浏览器访问某网站,只会携带该网站的cookie。cookie有域的概念,如果没有域,浏览器可以携带登录银行网站的cookie到我的网站,我是否可以拿这个cookie访问这个银行网站,结果是登录状态,可以转钱了。

cookie在相同内核的浏览器之间是共享的,不同内核浏览器是不共享的例如火狐和IE【存放位置都不同,当然不共享】

session过期特别说明:

session的过期是发呆时间,假如设置10分钟过期,当9分钟的时候你操作了这个页面则会重新计时。

session配置:

session 可以通过php.ini配置,来修改session存储的位置,默认会以文件形式存储在服务器上,设置成user就可以自定义处理器来存取session数据。企业中一般会存储在redis和数据库中,应对高并发和负载均衡多台服务器间session共享。

vi /usr/local/etc/php/7.2/php.ini 
session.save_handler = files

禁用cookie,还可以登录吗?

服务器端产生的session id,如果cookie被禁用,服务器发送的写cookie指令就无法将session id 写入到客户端电脑cookie中,访问该网站就无法携带cookie过去,也就无法拿到session id。关键问题是cookie不能作为中介携带session id 给服务器,可以换一个,例如浏览器在访问该网站其他页面时,在其url后面自动携带上PHPSESSID=xxxxxxxxxxxxx的参数就可以,服务器获得该参数也一样可以识别是哪个客户端在访问。如何设置url上进行携带,只要在服务器端进行配置。

禁用cookie可以登录,如果不使用session还能登录吗?

实际我们不使用cookie和session依然可以做到维持状态,即登录。只要客户端传入用户名、密码,服务端完成验证,通过之后,即产生一个令牌(唯一随机数),存储令牌对应用户在数据库【mysql或者redis等】并返回给客户端(浏览器或者app等),以后再访问服务器获取数据时,携带上这个令牌,服务器拿到令牌就可以知道对应的哪个用户,然后返回该用户的数据。如果令牌一直不过期,浏览器或者手机app拿到的令牌也一直保留,就永远是登录状态。实际企业项目,这个令牌是有过期时间的,比如一种策略是每访问一下,延长令牌时间,半个月未访问则过期,而且请求数据会进行加密。

浏览器7天自动登录如何实现
现象:

当我们登录一些网站,直接关闭浏览器而非点击退出,再次打开该浏览器则还是登录状态

原因:

点击退出称为安全退出,其实就是点击退出,服务器程序则销毁了我们存储在服务端的session内容和id,直接关闭则没有删除服务器端session,而cookie的过期时间设置一般会比较长,关闭浏览器,访问该网站的cookie还在我们本地电脑上存储着,所以当打开浏览器再次访问该网站的时候就会携带上该网站的cookie,服务器端还存在session id,能够匹配到账户,所以还是登录状态。如果将cookie设置成会话级别,关闭浏览器cookie就过期消失了,打开浏览器再次访问该网站已无该网站cookie携带了,也就不会是登录状态。所以要实现7天自动登录,本地电脑上的cookie7天后才能过期,服务端的session id如果也7天后过期就可以实现7天自动登录,确实session id可以存到数据库等地方。项目中我们会生成一个令牌对应这个登录账户并保存在数据库中,将令牌通过写cookie的方式保存在用户本地电脑上,用户再次访问时携带这个令牌,服务器通过令牌查找对应账户,从而获取该账户信息。
例如还有一种实现逻辑,服务器验证用户名密码通过后,会产生令牌,将令牌和对应用户信息进行加密生成密文,通过写cookie指令将明文令牌和密文返回给浏览器,保存在本地电脑7天。用户以后再访问该网站时,浏览器会携带cookie(明文令牌和密文)给服务器,服务器通过解密获取密文中的用户信息和令牌,比对密文中的令牌和明文令牌完成验证,验证通过则根据密文中用户信息生成当前用户访问session,这样服务不需要存储令牌对应用户信息,完成了自动登录。如果我能拿到张三自动登录网站的cookie,就可以实现登录。所以用户勾选自动登录选项时最好使用自己的私人电脑,不要在公共电脑使用该功能。

你可能感兴趣的:(三、理解session和cookie)