Http是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是独立的,服务端不法确认当前访问者的身份信息,无法分辨上次的请求发送者和这次的发送者是不是一个人。所以必须主动维护一个状态,这个状态用于告知服务端前后两个请求是否来自统一浏览器。而这个状态需要通过cookie或者session去实现。

Cookie

Cookie不是内置对象,Cookie由服务端产生的,再发给客户端保存。 具体的东西,指的是浏览器中可以永久储存的一种数据,数据储存功能。 本地缓存,可以提高访问服务器的效率,但安全性较差! Cookie是客户端技术,储存在客户端,会在下次向同一服务器再发送请求时被携带并发送到服务器上。 不可跨域,每个cookie都会绑定单一的域名,无法正在别的域名下获取使用,一级域名和二级域名是允许使用的。

Session

会话 session是一种记录服务器和客户端会话状态的机制 sesssion是基于coookie实现的,session存储在服务器端,而sessionld储存在服务器端,sessionld会被储存到客户端的cookie中。 Session是服务端技术 用户登录后服务器会为登录用户创建一个session,session会保存在用户浏览器的cookie中,当用户登录成功后,cookie会随着后边的每个请求一起发送。服务器会通过cookie中的sessionid找到内存中的session数据,来验证用户身份,从而在响应中返回相应的状态。

认证流程

  1. 用户向服务器发送用户名和密码。
  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
  3. 服务器向用户返回一个 session_id,写入用户的 Cookie。
  4. 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
  5. 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

    弊端

    扩展性不好,单机没问题,但如果是服务器集群,就需要每一台服务台都能够读取session。
    一种解决方法就是session数据持久化,写入数据库或别的持久层。服务收到请求后,都向持久层请求数据。
    这种方案优点是架构清晰,但缺点是工程量比较大。
    还有一种方案是服务器不保存session数据,所有的数据保存在客户端,每次请求都发回服务器。这就是JWT

    Session和Cookie的区别

    安全性:Session比Cookie安全
    存取值类型:Cookie只支持存字符串数据,想要设置其他类型需要转换成字符串,Session可以存任意数据类型
    有效期:Cookie可设置为长时间保持,比如经常使用的登录功能,Session一般失效时间较短,客户端关闭或者Session超时都会失效。
    存储大小:单个Cookie保存的数据不能超过4k,Session可储存数据远高于Cookie,但访问量过多,会占用过多的服务器资源。

    Token(令牌)

    token是服务端产生的 Token,令牌,随机性不可预测

特征

  1. 无状态,可扩展
  2. 支持移动设备
  3. 跨程序调用
  4. 安全

验证过程

  1. 用户通过用户名和密码发送请求
  2. 程序验证
  3. 程序返回一个签名的token给客户端
  4. 客户端储存token,并且每次用于发送请求
  5. 服务端验证token并返回数据

image.png

验证流程

客户端第一次请求时,发送用户信息(用户名,密码)到服务器,服务器用户的信息使用HS256算法及密钥进行签名,再将这个签名和数据一起作为Token返回给客户端
服务器不保存Token,客户端保存Token(放在cookie里或者Local Storage里)
当客户端再次发送请求时,在请求信息中将Token一起发送给服务器
服务器用相同的HS256算法和相同的秘钥,对数据再一次签名,和客户端返回的Token的签名进行比较,如果验证成功,就向客户端返回请求的数据

优势

无状态,可扩展

客户端存储的Tokens是无状态的,而且能够被扩展。不存储Session信息

安全性

发送token,而不是发送cookie能够防止CSRF(跨站请求伪造)。
token有时效,一段时间后需要用户重新验证。

可扩展性

token能够创建与其他程序共享权限的程序,可以提供可选的权限给第三方应用程序。当用户想让另外一个应用程序访问它们的数据时,可以通过建立自己的API,得出特殊权限的tokens。

多平台跨域

CORS(跨域资源共享),只要有用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。

JWT(json web token)

流行的跨域认证解决方案,是一种认证授权机制。 JWT是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。 数字签名 它将用户消息加密到token里,服务器不保存任何用户消息。 服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证

6a63f6246b600c3392c95c525b2d6d07d8f9a165.jpeg