青训营计算机网络知识学习| 青训营

175 阅读2分钟

http是无状态协议,也就是说客户端对于每个http请求,是不知道哪个客户端发起的。

这就意味着每次用户请求都要进行用户认证。

解决方法有:

Cookie:

cookie是一种客户端会话技术,每次发起http请求,请求头携带cookie数据,服务端也可以通过在响应头给客户端设置Set-Cookie;通过cookie方式,可以将用户状态(登录信息、及会话期间的其他信息)保存在客户端,客户端请求携带状态信息,以此传递用户状态。

如果用cookie传递信息,容易信息泄露,并且cookie有大小限制。

Session:

Session是将用户的会话信息保存在服务端,用一个sessionId来跟踪这个会话信息,sessionId通过cookie方式来和客户端之间进行传递。

如果服务端是分布式部署的话,会出现session不共享的问题。

Token:

Token与session的流程差不多,区别是token是用保存在redis中的,token一般是一个随机字符串(UUID)作为key,value是用户ID(用于识别用户的登录信息),并且有一个过期时间,token字符串还要传递给客户端一份,每次请求带着token,如果redis中存在相应的token,就表示认证成功;如果请求没带着token或者redis中没有相应token,则会生成一个新的token字符串,保存在redis一份,传给客户端一份。

缺点是每次请求都要查询一次redis,给redis带来压力,还要占用redis的空间。

JWT:

Json Web Token,他不像session和token是基于存储和验证的,他是基于解析+验证的;JWT登录流程需要额外的一个认证服务器,客户端发起登录请求时(浏览器没有JWT),会到认证服务器去申请到JWT,然后向web应用服务器发起请求,带着JWT,应用服务器验证JWT,检查登录信息。

JWT字符串组成:[header].[payload].[signature]

header部分和payload部分都是json格式,通过base64编码成字符,

signature部分是【base64编码处理后的header和payload字符串和secret拼接起来,然后进行一个单向加密算法加密,生成signature部分】secret是保存在服务器的。

header字符串,payload字符串和signature字符串三个部分通过.连接,组成JWT字符串。

应用服务器验证的时候,通过前两部分header,signature,加上服务器才有的secret,用header保存的加密算法进行加密,比较生成的JWT和传来的是否相同就行了。

优点:JWT字节占用小,并且不占用服务器资源。