http是无状态的,第一次访问服务器需要输入账号密码,关闭网页,再次访问服务器,服务器不知道又是你来访问的,又要再次输入账号密码数据库校验,很麻烦。那怎么保持登录状态呢
1、cookie:
每次http请求都自动带数据给服务器的技术
存储:浏览器
销毁:超过有效期
流程:
1、http访问服务器,服务器set-cookie(name,value值)返回cookie给浏览器,cookie存储在浏览器。
2、此后浏览器访问服务器时,会将set-cookie里面的值放到HTTP请求头里面的cookie发送到服务器,服务器对cookie进行校验验证,一般结合session进行校验
2、session(会话)
组成:
1、会话时间(结束会话的时间)
2、唯一SessionID,没有规律的字符串
存储:在服务器/数据库
销毁:关闭网页、调用销毁函数
2.1cookie与session
比较SessionID
过程:
1、用户携带账号密码首次访问服务器,服务器调用数据库验证成功,服务器创建Session(SessionID、会话时间)存在服务器中。
2、服务器把SessionID、会话时间加到set-cookie里面,会话时间对应设置为cookie的有效期,返回cookie到浏览器。
3、利用每一次http请求携带cookie的特点,下次访问会自动发送SessionID给服务器,服务器校验SessionID
补充:服务器在发送SessionID时会对含有SessionID的cookie进行签名,即使被黑客试图破解修改了sessionID,修改后的SessionID会变成服务器识别不了的字符串,也就难以破解
缺点:SessionID存储在服务器/数据库
1、SessionID存在服务器中,当大量用户访问服务器时,服务器面临要存储大量SessionID,如果有多台服务器,服务器避免超载,会分享一些用户给其他服务器,其他服务器通用的SessionID才能避免用户再次输入账号密码,这些都不行
2、如果让数据库存储SessionID,数据库万一崩溃了,又影响服务器获取SessionID
3、引出token:
Token 其实就是访问资源对凭证。一般是用户通过用户名和密码登录成功之后,服务器将登录凭证做数字签名,加密之后得到的字符串作为token
例子:
token是健身房vip会员卡,办卡留下的姓名就是用户唯一标识,下次来健身房只需要出示vip会员卡就可以进入健身房
存储:浏览器的Cookie或Local Storage
token校验机制
1、当客户端第一次请求时,发送用户信息至服务器(用户名、密码),服务器对用户信息使用HS256算法及密钥进行签名,再将这个签名和数据一起作为Token一起返回给客户端
2、服务器不保存Token,客户端保存Token(比如放在Cookie里或者Local Storage里)
3、当客户端再次发送请求时,在请求信息中将Token一起发给服务器
4、服务器用同样的HS256算法和同样的密钥,对数据再进行一次签名,和客户端返回的Token的签名进行比较,如果验证成功,就向客户端返回请求的数据
token对比session
1、这种基于token的认证方式相比传统的session认证方式更节约服务器资源,并且对移动端和分布式更加友好。其优点如下:
2、支持跨域访问:cookie是无法跨域的,而token由于没有用到cookie(前提是将token放到请求头中),所以跨域后不会存在信息丢失问题
3、无状态:token机制在服务端不需要存储session信息,因为token自身包含了所有登录用户的信息,所以可以减轻服务端压力
4、更适用CDN:可以通过内容分发网络请求服务端的所有资料 更适用于移动端:当客户端是非浏览器平台时,cookie是不支持的,采用token认证方式会简单很多
5、无需考虑CSRF:由于不再依赖cookie,所以采用token认证方式不会发生CSRF,所以也就无需考虑CSRF的防御
4、JWT
jwt是token的一种实现方式
组成: header、payload、signature
header:声明用什么算法生成签名
payload:一些特定数据
signature:header + payload生成的 签名,保存在服务端
校验机制
1、用户登录服务器,服务器生成一个jwt包括header、payload、signature三部分,header + payload生成签名(signature部分),保存在服务端
2、服务器发送jwt给浏览器,jwt存储在浏览器的cookie或storage
3、用户每次请求都会把jwt发送给服务器,服务器接收到用户的jwt,提取来自用户jwt的 header + payload生成的签名,与之前保存在服务端的签名进行校验。 用户就不用输入账号密码了
session cookie 与token/jwt
1、在分布式微服务技术日趋流行的今天,大型网站的设计都尽量避免使用 session 实现 HTTP 状态化。
2、session简单粗暴,在服务端维护会话信息,在客户端保存session id,服务端能够轻易地把会话控制在自己的手中,但服务集群化产生了session共享的负担;
3、jwt(token)只在客户端保存会话信息,服务端通过密钥校验会话,(相比session)拿时间换空间,卸下了服务端集群共享会话信息的负担,同时也加大了服务端控制会话的难度。
4、token可以跨域,cookie不能跨域
参考
博主:技术蛋老师