session意思为回话,是相对服务端来说的。当服务端给客户端派发一个标识的时候,服务器也需要自己存一份信息。所以session是一个用在服务器保存自己给客户端标识信息的地方,是一个键值对的map。
const sesstion = {sessionId: {name:xxx,id:111}}
cookie,是用来保存服务端生成的session对象后,给予客户端的标识,也就是sessionId。当客户端每次请求服务端的时候,浏览器会在请求头上request head上会很多键值对,其中就包含了cookie。cookie包含了sessionId,从而服务端能找到session对应的数据。所以很多网站如果一旦禁用了cookie后,就无法保持登陆状态,从而进入登陆死循环。
百度云盘 登陆来举例
-
我们先把https://pan.baidu.com/下的cookie全部删除,在重新刷新下页面,发现就需要登陆了。从而我们可以推测,百度云盘是使用cookie+session的登陆形式,亦或者是token,先假设是cookie+session
登陆后的cookie
-
刷新后我们看接口访问,setcookie所携带的信息,明显是少了。
清除cookie后查看接口
-
登陆后我们在看下接口,明显多了不少。其中cookie中某些字段,就是包含了用户的登陆信息。
登陆口查看接口
-
因此我们可以推测出,现在不少网页登陆后还能保持登陆状态,就是通过cookie把关键的用户标识信息,比如userid等之类的,带到了服务器去认证。服务器有sessionid来对应,从而获取到用户的一些关键字段,查到用户的信息。但是cookie是没办法跨站点获取的,比如在a.com的cookie是没办法在b.com下去获取到的。这边就延伸出xss攻击。如果在跨域请求的时候,记得要设置Access-Control-Allow-Credentials: true ,这样才能带上cookie。
总结下
- session通常指的是服务器,由服务器去生成sessionid,我们在浏览器查看本地的session storage的时候,会发现是没有东西的。
- cookie,只有4KB的大小限制,它只用于存一些用户的关键信息,或者token,一般是后端sessionid生成后,存入到cookie。为了防止cookie被窃取,我们可以设置httponly,意思就是不让js去读写cookie。
localstoreage的存储大小有5M,相比起cookie已经是非常多了。也有同源策略限制。仅仅保存在客户端,不会带给服务器。通常我们会用它存些静态的配置,或者是字符串。
token就是一个令牌,简单 token 的组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)。我们可看下如下的流程
- 客户端发送用户名和密码给到服务器
- 服务器验证账号和密码,签发一个token
- 客户端拿到这个token,可以把token存到cookie或者存到localstorage。每次发送请求带上cookie或者是放在head头里面,都可以。具体是要看怎么协商方案。
- 服务器接收到请求,验证token,如果验证通过。可以正常访问。
token一半会伴随着refresh token,如果token有效期过了,按照正常逻辑,需要用户在输入账号和密码来登陆。从而生成token,但是这样会比较麻烦,经常让用户去输入。我们可以拿token和refresh token,在去刷新到有效的token出来。
网友评论