我们都知道Session和Cookie的区别就是Session是存储在服务端的,Cookie是存储在浏览器上的。
Cookie技术产生源于HTTP协议在互联网上的急速发展,复杂的互联网交互活动,就必须让服务器保持活动状态。Cookie在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在RAM中发挥作用(Session cookie),一旦用户从该网站或服务器退出,Cookie可以存储在用户本地磁盘上(persistent cookie)。cookie有时效性和使用限制。
Cookie的是为了让无状态的HTTP报文带上一些特殊的数据,让服务端能够辨识请求的身份。简单的说“cookie就是浏览器上的一个key-value存储对象”。
写入数据:Cookie写入数据的方式通过HTTP返回报文的Header部分Set-Cookie字段来设置。
获取数据:浏览器在发送请求时会检查当前域已经设置的Cookie,在HTTP请求报文Header部分的Cookie字段里带上Cookie的信息。
Session是对服务端来说的,客户端没有Session这一说法,Session是服务器在客户端建立连接时添加客户连接标志,最终会在服务器软件(Apache、Tomcat、JBoss)转换为一个临时Cookie发送给客户端,当客户端第一次请求时服务器会检查是否携带了这个Session(临时Cookie)如果没有则会添加Session,如果有就拿出这个Session来左相关操作。Session就是在一次会话中解决两次HTTP的请求的关联,让两个页面都能读取到这个全局的Session信息。同时Session的信息存在于服务端,很好的解决了安全问题。
Session是记录客户端状态的一个存储对象,是同一个客户端请求共享数据的数组。这个存储对象可以是文件、缓存系统、数据库。假设用redis来实现Session的功能,那么要求浏览器每次请求都要带一个相同的字符串作为身份信息,对应redis的key,redis value则为Session数组的序列化内容。
浏览器请求:如何让浏览器每次请求都带一个身份信息,这就是Session和Cookie的关系,通过Cookie传递这个身份信息。
1.客户端求。2.服务端检查Header,发现没有Cookie,于是生成一个UUID。3.服务端处理数据,把部分数据(登录信息)存储到redis里,UUID为key,用户id为value
4.返回报文中,增加Set-Cookie字段,把UUID写进浏览器存储里面。 5.浏览器收到报文,把UUID写进浏览器存储里面。
6.浏览器再次请求,带上当前的域的Cookie,就是这个UUID。7.服务端通过Cookie字段取到UUUID,去redis里面获取用户信息。
流程图禁止Cookie获取Session
从前面知道,Sessionid是通过Cookie来传递的,如果Cookie禁止了,还能获取Sessionid吗?其实是可以的,即使Cookie禁止了,可以使用参数的方法传递Sessionid,后端返回的时候,增加一个返回参数,叫Sessionid,然后前端存储到localstorage里。
前端请求的时候,去localstorage中获取Sessionid,在请求参数里增加一个参数。
后端session处理,先尝试去Cookie中获取Sessionid,如果获取不到,再尝试去请求参数中获取Sessionid。
Token:
Token是用户的身份验证方式,通常叫“令牌”。最简单的Token组成:uid、time、sign。还可以把不变的参数放进Token
应用:
A:用户首次登录成功(注册也一样)后,服务端就会产生一个Token值,这个值会在服务器中保存Token值,再将这个值返回给客户端。
B:客户端拿到Token值之后,进行本地保存。
C:当客户端再次发送请求,就会将这个token值附带到参数中发送给服务器。
D:服务器收到客户端的请求之后,会取出token值与保存在本地的token做对比。
总结:
区别 *Cookie是浏览器端的存储对象,有容量限制,通过HTTP报文与后端交互。cookie不是很安全,别人可以分析放在本地的cookie进行欺骗,考虑到安全应当使用session。
*Session是服务端的存储对象,实现的方式可以有文件系统、缓存系统、数据库。session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能。
联系 *Session和Cookie都是为了实现HTTP请求带上的客户端状态的方法
*Session大多数情况下都是依赖Cookie来传递Session ID
*一般建议登录信息等重要信息保存在session中,其他信息放在cookie中
*token和session并不矛盾,作为身份认证token安全性比session好,因为每一个请求都有签名还能防止监听以及重放攻击。
网友评论