Cookie详解
Cookie是什么?
Cookie是一段可以标识用户的信息,由服务器产生发送给客户端保存
为什么需要使用Cookie?
Http是无状态的,即服务器没有记忆能力,所以在完成有关联性操作时会非常麻烦。例如网购时,登录->添加购物车->下单->结算->支付,这系列操作都要知道用户的身份才行,但服务器不知道这些请求是有关联的,每次都要验证用户身份信息。因此为了解决这个问题,Cookie技术应运而生。
Cookie工作流程
- 客户端第一次请求服务器时,服务器会产生包含用户信息的Cookie并发送给客户端
- 客户端收到Cookie后根据Cookie的过期时间将Cookie保存在浏览器或者本地
- 客户端在之后的请求中都会带上Cookie,让服务器验证自己身份
Cookie生命周期
服务器生成Cookie时就设定好了其有效时间,一般有三种情况:
- 在指定时间后过期
- 立即删除Cookie
- 客户端关闭后过期
Cookie的缺陷
- 不安全,存在Cookie欺骗,因为Cookie是存储在客户端的,所以可以被别有用心者盗取,虽然Cookie是被加密的,但是非法者不用知道具体Cookie的内容,直接将其发送给服务器,并且可以通过验证,就可以冒充他人身份登录网站。
- 数量受限,一个浏览器最多能够创建的Cookie数量为300个,每个Cookie大小不超过4KB,且单个站点保存的Cookie不能超过20个
- Cookie可以被浏览器禁用
Cookie被禁用后如何验证用户身份
- 可以直接在每次请求URI后带上SessionID 参数
- 使用token技术,类似于Cookie,在客户端第一次请求服务器时,服务器产生一个token(一段字符串)并送给客户端,客户端之后的每次请求带上token即可
Session详解
Session是什么?
Session就是会话,它是用来维护客户端和服务器之间关联的一种技术。
会话:用户打开浏览器->访问web资源->关掉浏览器。这个过程被称为一个会话。
为什么需要Session?
相信聪明的你一定知道~,因为Http是无状态的,从而使得服务器无法记住用户(理由同Cookie)。
Session的工作流程
- 客户端在第一请求服务器时,服务器为其产生Session对象存在服务器,并将SessionId放入Cookie发送至客户端
- 客户端后面访问浏览器时,都会带上Cookie,服务器从Cookie中获取SessionId,通过SessionId就可以找到对应的Session对象,获取用户信息
Session的生命周期
Session的生命周期一般可以被设置为两种
- 指定时间后过期
- 永不过期(比较少见,因为Session是存在服务器的会增加服务器负担)
Session的优缺点
优点:Session是存放在服务器的,因此不容被获取,较安全
缺点:正因为是放在服务器,所以会增加服务器负担
Cookie与Session的区别
我认为Cookie与Session最大的区别就是Cookie保存在客户端,而Session保存在服务器。其他的略微差异都是来源于它。如因为Cookie是存在客户端,所以更容易被获取从而造成安全问题,而Session就不会被轻易获取,故Session相较于Cookie更安全。因为Session存于服务器,所以会占用服务器性能,而Cookie就不会。因为Cookie存于客户端,所以只能存一些简单的字符串,而Session由于存在于服务器,所以可以存一些复杂的对象。因为Cookie存于客户端,所以会存在一些存储大小限制,而Session就没有大小限制。
Cookie与Session的结合使用
用Cookie保存用户的sessionId,用户每次请求时,服务器可以从Cookie中获取sessionId,并通过sessionId找到对应用户的身份信息
如何解决分布式Session问题
分布式会带来什么样的Session问题呢?分布式系统中,我们有多台服务器同时工作,假如用户第一次请求登录被分配到了服务器A,那么A就会生成一个对应的Session,并将sessionId返回,此时Session是存在于服务器A的,用户第二次请求被分配到了服务器B,此时服务器B上并没有该用户的Session,因此该用户又得重新登录,服务器B生成了对应的Session,并将sessionId返回。用户第三次请求又被分配到了服务器A,但是A并不能通过该sessionId找到对应的Session,因为该sessionId是服务器B产生的,所以用户又得重新登录。。。
对于分布式Session问题,一般有三种解决方案
- Nginx ip_hash策略,服务端使用Nginx代理,每个请求按照访问IP的hash分配,这样同一个IP会固定访问同一个服务器,避免了服务器A创建了Session,第二次分发到服务器B的现象
- Session复制,每一台服务器上Session的变动(增加,删除,更新)都会广播到其他服务器
- 共享Session,每台服务器不将Session存在自己身上,而是存在一个共享的缓存中间件上(如redis)