Cookie是什么?从web编程角度来说,就是一个通过http协议响应头发送的key=value类型的小文本,Cookie一般由服务器端脚本产生,通过http协议头发送至用户浏览器端,不同品牌的浏览器在接受到这些Cookie后会在硬盘中生产一个小文本记录该Cookie的相关信息,在该Cookie设定的过期时间未到之前用户下次访问该网站时,浏览器会通过http请求头信息将该Cookie发送给服务器端,服务端在接收到这些Cookie后通过一定的安全策略即可判定该用户的各种状态。
Cookie一般用于各大网站的登录鉴权与用户状态标记;当然也能被用于追踪用户、获取用户的一些隐私信息,最常见的一个就是搜索引擎(诸如:百度、谷歌、搜狗)用户记录用户的搜索历史、搜索喜好,因为客户端存在cookie记录这些核心信息,用户在访问某些网站时会显示与这些搜索丽爽、搜索喜好有关的广告,从而可以达到精准广告投送。
Cookie是有作用域、有效时间、作用协议以及限定客户端javascript是否能对保存在客户端的cookie进行操作的,这块网络上有许多了,就不再讨论了。
session与cookie又有区别,传统意义上的session是不会被存放在客户端浏览器中的,而是存放于服务器端的,php中的session在服务器上默认是以文本形式存储的,存储的内容也是key=value形式,只是类型更为广泛。那么在多个用户同时访问的情况下,势必要对session区分不同的用户,这样php中就有了session_id,这个全局唯一性的ID就用来标识不同的用户,session_id就好比一把钥匙,不同的用户使用属于自己的钥匙才能获取属于这个用户的session值,这就需要php启用session时为每个客户端分配一个全局唯一的session_id,而客户端在每次请求服务器端数据时都要附带上该session_id,否则服务器端就傻傻分不清保存在服务器端的session是属于谁了......php在使用session时默认用一个特定的cookie与浏览器进行session_id值的交互,php内部会对这个特定的cookie进行处理,从而为不同的用户读取保存在服务器端的session值。
由此可以看出,Cookie的键值对用户来说是公开的,而session的键值用户就是看不到的;那么cookie里保存的内容就要进行加密存储了.....从这个角度来说session的安全性比cookie高,但这不意味着用session进行用户鉴权就一定安全,因为上述提到php中启用session的时也会有一个标志session全局唯一性的ID被作为特定cookie发送给了浏览器。
====
拿多用户登录鉴权应用场景来分析cookie与session:
1、用cookie进行用户鉴权,那么当同时有多个用户处于登录状态下时,服务器发送的cookie名称是固定的,服务器端傻傻分不清就要依靠cookie中的值来判定是哪个用户了。
2、用session进行用户鉴权,因为在服务器端php自动为每个用户分配一个唯一的ID用以标志该用户,故而php中多个用户同时登录时,用$_SESSION变量获取session值时就可以自动依据这个唯一ID进行区别;这样的话,那么服务器端是如何区别不同的ID是哪个用户的呢?这样来看,不同的浏览器客户端就要在每次请求时附带上该唯一的ID了,否则服务器端依然傻傻分不清保存的这么多session值到底属于谁。
====
以上两个场景中,第一个因为cookie对用户是透明的,用户可以看到cookie内容,故而采用第一种时发送的cookie内容就有讲究了,不要明文这是必须的,还得依据业务逻辑对cookie进行加密处理与鉴定。
而第二个场景中,因为session_id通过cookie发送给了浏览器端,而这个包含session_id值的cookie对用户来说也是透明的,同时cookie也是有作用域、作用时间、安全性限定的,网络中有许多关于http、https协议下以及不同子域下session共享的解决方案,要么将包含session_id值的这个cookie设定作用域为全域作用,比如设置成'.jjonline.cn',那么这个cookie在同一个端口下的'.jjonline.cn'下的所有子域下[均处于一台服务器的情况下]都被发送,服务器自然就依靠这个ID值获取到了相关session值了,自然达到了session共享的目的;而跨协议的session共享,有些是url传递session_id值,有些则是设置了cookie可以作用于https、http协议下。因为php内部会对该包含了session_id值的cookie进行识别,以上session共享方案说白了就是一个cookie作用域、作用目录、作用协议以及安全性设置的问题。
哟嚯,本文评论功能关闭啦~