浏览器与服务端持久化通信的方式

浏览器与服务端持久化通信的方式

Cookie

Cookie就是一些数据,用于存储服务器返回给客服端的信息,客户端进行保存。在下一次访问该网站时,客户端会将保存的cookie一同发给服务器,服务器再利用cookie进行一些操作。利用cookie我们就可以实现自动登录,保存游览历史,身份验证等功能。

Session

Set-Cookie: session=xxx

存在cookie中,来自服务端的身份认证id,服务端通过这个id查找信息,数据存在服务端。

  • 数据存储在服务端,安全:white_check_mark:
  • 容量大:white_check_mark:
  • 占用服务器资源:x:
  • 分布式集群需要统一session,redis是一个解决方案:x:
  • 跨域问题:x:

token

JWT (json web token) 在网络和应用之间安全传递信息的开放标准。用于身份验证和非敏感数据的传递,不需要服务端存储数据。

头部.载荷.待服务端检验部分

默认sha256对称加密,密钥在服务器端,也可选用非对称加密。

公钥加密的只能用私钥解密,私钥签发的签名只能公钥验证

具体实现:

  • JWS json web signature 内容做签名确保不被篡改

  • JWE json web encryption 对内容本身做加密,更安全

使用场景:

  1. 用户登录身份验证
  2. 密码重置,服务器生成包含用户信息的JWT并组成一个链接发给用户邮箱

补充:基于api key的认证方式:客户端(应用程序后端)使用私钥加密生成签名,加上公钥一起发给api提供方,api提供方用公钥验证签名

JWT cookie api key
有状态
场景 前后端,后端之间 前后端 后端之间
可撤销性
生成方式 认证通过后生成 认证通过后生成 预先分配

缺点:

  • 无法真正logout,有了jwt后端就不去修改数据库信息使得用户logout了,解决方法是退出时主动注销token
  • 用户信息无法同步,假设后端数据库里用户信息已经改变,前端发的jwt后端还是直接信任的。解决方法是用户关联信息变化时,可以用soket通知前端更新,或者对用户信息做一个版本控制,验证信息是只判断版号,如果版号异常,就在响应的响应头或附加载荷离添加新的信息
  • token泄漏无法立刻无效化 解决方法是:后端不能完全信任前端的token 给token加上有效期和自动续签程序,在接近过期时间的时候在响应头提供新的token (后端也要对token做备份,不存在备份的token统一视为已过期)这一点应该不用考虑,jwt的防止篡改

()

发表评论