cookie是什么意思需要阻止吗(客户端禁用cookie后有什么影响?)
前言
session和cookie有什么区别在面试中是高频问题,小伙伴们在开发过程中经常使用,但是很多小伙伴对原理还不甚了解。今天就详细聊一聊!
什么是cookie
cookie是由服务器生成,发送给客户端浏览器保存的数据。浏览器再次访问该网站时会携带这个数据,向服务器标明两次请求来自同一个客户端。由于HTTP协议是无状态的,因此cookie主要是为了标记用户的状态而存在的。
什么是session
session同样是服务器生成的一段数据,它保存在服务器端。浏览器访问服务器时,服务器把客户端信息记录在服务器session里。客户端再次访问的时候,就可以从session中取得属于自己的信息。
区别
- 作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
- 存取方式的不同,Cookie 只能保存 ASCII,Session 可以存储任意类型数据。
- 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能;一般来说浏览器关闭即失效,当然也可以设置失效时间。Session 需设失效时间,超时或者服务重启就会失效。
- 隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
- 存储大小不同, 单个Cookie 保存的数据不能超过4K,Session存储数据远高于 Cookie。
客户端浏览器禁用cookie会出现什么情况?
要说清楚这个问题,咱们先得弄清楚二者是怎么配合的。先看下图
当用户第一次请求服务器的时候,服务器创建该用户对应的 Session,请求返回时将此 并把Session的唯一标识信息 SessionID返回给浏览器。浏览器接收到服务器返回的SessionID后,会将此信息存入到 Cookie 中,并记录此 SessionID 属于哪个域名。
当用户第二次访问服务器的时候,请求将 Cookie信息也发送给服务端,服务端会从Cookie中获取 SessionID后查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
根据以上流程可知,SessionID是以cookie的形式存储在客户端,系统根据SessionID来验证用户登录状态。因此禁用了Cookie,Session也会失效。
客户端浏览器禁用cookie怎么办?
- 将SessionID放到URL中,每次页面请求的URL中携带上SesssionID,比较简单粗暴
- 将SessionID放入HTTP请求头上,比如JWT采用这种方式
分布式 Session
大型项目后端往往需要多台服务器共同来支撑前端用户请求,这就造成了登陆可能在A服务器上操作,再次访问的可能就到B服务器上了。如果Session不能共享,就会造成登陆失效问题。一般有以下解决方案:
- Session 复制,任何一个服务器上的 Session 发生改变,该节点会把这个Session广播给所有其它节点进行更新。
- 共享 Session,将用户的 Session 等信息使用缓存中间件来统一管理,每台服务器都在共享Session服务器上操作Session。这种比较常见。
- 使用Nginx代理,把同一来源请求分发到同一服务器上。