基础网络详解4--HTTP Cookie&&Session 思考

一、cookie技术思考

    一台多用户浏览器发起了三笔请求,将某款产品放入购物车中,A一次,选择了篮球;B两次,第一次选了足球,第二次选了钢笔。如何确认选择篮球、足球、钢笔的请求属于谁呢?如果不确认属于谁,请求将没有意义。
    如果每次请求都带一个用户标识,比如用户名,这样服务器就会知道该请求属于谁,也会知道请求的商品属于谁,也就知道了该如何记录。于是cookie诞生了,使得无状态的http服务,变成了有状态的http服务。

1、加入购物车需要验证密码或者登陆状态吗?

    我们先来看不需要的情况,因为用户名是很容易获取到的,如果别人获取了你的用户名,他们也可以在你的购物车中添加东西,这样来看是很不安全的。所以验证密码或者验证登陆状态时有必要的。
    需要验证密码。如果采用验证密码的方案,就需要在cookie中携带密码,这是很不安全的,并且在每次请求的时候都要验证一下密码是否正确,这样会降低处理效率。 那选另一种方案验证登陆状态呢?

2、如何确保登陆状态的唯一性。

    当客户登陆的时候我们可以在服务器的内存或者文件中存储客户登陆的状态,比如用户名和过期时间等,但是只存储这些同样是不安全的,因为其他用户会很轻松的获取你的用户(因为用户是有规律的),所以就需要确保登陆状态的唯一性,于是seesion诞生了。

二、session技术思考

    当客户登陆的时候,服务端会生成一个session,该session有一个全局唯一的sessionid,并且该sessionid会存储客户的相关信息,登陆状态,以及过期时间,并会将sessionid设置在cookie中,并返回给客户端。这样客户每次发起请求的时候都会带着该sessionid, 该sessionid可以使http服务变成有状态的,并且保证了唯一性和确保登陆状态,sessionid很难被其他用户获取。
    从上述来看session机制是依赖cookie的,如果禁用cookie,session的作用就失去了大半,虽然可以把sessionid放在请求的头部,但是这样会不方便。
java服务器中的sessionid JSESSIONID=xxxxxxxxxxxx
PHP服务器中的PHPSESSIONID=xxxxxxxxxxxxxxxxxxxxxx

三、两者的区别

1、存储位置

cookie存储在客户端、最大为4kb,网站的免密登陆就是在cookie里面存储密码;
session存储在服务器端,大小没限制,作用域可以共享;

2、大小限制

cookie的大小有限制,最大为4kb;
session大小没限制;

3、作用域

cookie由于浏览器的同源策略,只有同源的情况下才会发送;
session在服务端理论上可以进行多域共享

一般来说,cookie与session是相辅相成,是http服务器认证中的两个部分,是同一种技术中的两部分,两者并没有区别之分。

四、session的限制

当用户越来越多,seesion也会越来越多,会增加服务器的负担, 并且扩展性低,在微服务架构中,因为seesion只存在一台服务器上,如何确保所有的服务都能访问到该session呢?

1、session复制

2、session粘连

当session在机器A生成之后,之后所有的请求都会到机器A

3、seesion共享

可以将seesion存储在redis中,这样服务就都可以访问到。

猜你喜欢

转载自blog.csdn.net/qq_41768644/article/details/132416454
今日推荐