关于cookie与WebStorage和token的那些事
10分钟了解cookie与WebStorage和token的那些事
前言
这篇文章主要介绍的cookie,localstorage和SessionStorage的区别起源和介绍,其中token为新技术所以介绍比较多全文大约3000字阅读大约10分钟,读完之后你就能明白cookie,localstorage和SessionStorage和token之间的区别以及token生成的原理以及使用方式,后面附上的token验证的思路欢迎补充
介绍
HTTP协议是stateless
(无状态)的,每个请求都会获得一个响应消息,响应结束之后服务器不会记录任何关于客户端的访问信息
但是在实际开发中当用户登录之后需要让服务器知道用户登陆了,然后执行对应的操作所以我们就需要使用一些技术来让服务器知道我们登录了
cookie:曲奇饼干
cookie是90年代就有的技术,本质是服务器生成的“k=v”的字符串对以分号分隔,当用户向服务器请求之后随着消息头(set-cookie)消息头发送给客户端,这个消息是存储在window.document.cookie
中的,当发送请求的时候,浏览器会自动把cookie放在消息头中(cookie项下)发送给服务器
cookie是有长度限制的:4KB
WebStorage:客户端存储
这项技术是在2015年HTML5提供新的技术,分为SessionStorage / localStorage
两个对象,本质上是从服务器返回到客户端的数据,客户端自己保存在浏览器上,下次请求时从自己的本地存储中读取数据然后作为数据发送给服务器
Webstorage保存的大小限制为8MB
Session:服务器端存储
关于Session:九十年代末,Java/PHP/.NET等服务器端技术厂家提出的技术,本质上就是服务器端为每个客户端开辟一段存储空间(保存在服务器端的文件/内存/数据库中),以cookie的形式返回给客户端一个会话编号(这个便是实际上就是一个很长的识别符,用来验证身份的)当客户端访问时就会发送这个编号,服务器识别了这个编号就可以找到之前存储的一些数据,就相当于我去健身房办了一张卡(服务器记住我
),然后充值后(登陆后
)以后来消费就不用钱(登录
)了,直接用这张卡进行消费
缺点:如果在大型项目如高并发集群的时候就会导致验证失效的情况
Token:令牌(最新的技术)
Token是服务端生成的一串字符串
,用作客户端进行请求的一个令牌,比如:当第一次登录后,服务器生成一个Token然后把将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
其实简单理解就是:
举个例子:某公司开发了一款APP为了安全在用户在登录成功之后就用账号密码加上过期之间等使用算法生成一个加密字符串然后返回给客户端,当客户端请求的时候再去解密验证其中的完整性,验证成功就给予后续操作,失败之后就返回(此思路仅为举例并非所有的token生成方式都是如此
)
token的原理
- 将荷载
payload
,以及Header
信息进行Base64加密,形成密文payload密文,header密文。(Header和payload下面会讲)
- .将形成的密文用句号链接起来,用服务端秘钥进行HS256加密(不知道的戳这里:RS256,HS256与SHA-256)(目前用HS256算法加密的比较多),生成签名。
- 将前面的两个密文后面用’
.
'与签名拼接起来形成最终的token返回给服务端
具体生成流程如下
-
用户请求时携带生成的token(token分为三部分分别是
header密文
,payload密文
和签名
)到服务端,服务端解析第一部分(header密文),用Base64解密,可以知道用了什么算法进行签名,现在常用的为HS256后面将使用HS256进行讲解。 -
服务端使用原来的秘钥与密文(
header
·+payload
用’.
'来分隔)同样进行HS256运算,然后用生成的签名与token携带的签名进行对比,如果一致就说明token合法,不一致则说明原文被修改所有不合法。 -
判断是否过期:客户端通过用
Base64
解密第二部分(payload
),可以知道荷载中授权时间,以及有效期。通过这个与当前时间对比发现token是否过期。
通过token实现身份验证的思路
- 用户执行登录等操作后服务器进行验证,校验成功后就返回Token给客户端。
- 客户端收到数据后保存在客户端(local,session)(我一般是直接设置为cookie)
- 客户端每次请求数据/调用API携带Token到服务器端。
- 服务器端采用
filter
过滤器校验(token为三部分以.
来分割),校验成功则返回请求数据,校验失败则返回错误码