前端要理解的cookies和token的区别

本文探讨了前端中常见的用户认证机制——cookies和JWT(JSON Web Tokens)的区别。cookies常用于保存session_id,但存在拓展性和跨域问题。JWT则通过在客户端存储经过签名的数据,实现了无状态认证,简化了服务器的session管理,但同时也带来了一些挑战,如无法中途撤销token、数据安全性等。文章详细解析了JWT的数据结构、签名过程及其优缺点,并提供了JWT在Node.js(Express)中的使用示例。
摘要由CSDN通过智能技术生成

常用的cookie

互联网服务离不开用户认证,一般流程是下面这样:

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

这种模式的问题在于,拓展性不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求session数据共享,每台服务器都能够读取session。

举个例子,A网站和B网站是同一家公司的关联服务,现在要求,用户只要在其中一个网站登录,再访问另外一个网站就会自动登录,请问如何实现?

一种解决方案是session数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的有优点是架构清晰,缺点是工程量比较大。另外如果持久层挂了,就会单点失败。

另一种方案是服务器索性不保存session数据了,所有数据都保存在客户端,每次请求都发回服务器。

JWT就是这种方案的一个代表。

JWT?

JWT的原理是,服务器认证后,生成一个JSON对象,发回给用户,就像下面这样

{
   
	"姓名": "张三",
	"角色": "管理员",
	"到期时间": "2022年3月24日22:46:32"
}

以后,用户与服务端通信的时候,都要发回这个JSON对象。服务器只靠这个对象认定用户身份,同时为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(见后文)。

服务器就不保存任何session数据了,也就是说,服务器变成无状态了,从而笔记容易实现拓展。

JWT的数据结构

实际的JWT大概就像下面这样

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VySWQiOiI2MjM5ZTU4MWFlNmVjZmM4ZTBhMDNjOTYiLCJpYXQiOjE2NDc5NjE0NzYsImV4cCI6MTY0ODA0Nzg3Nn0.
edkqlsbRY0s1ccAklVFBzufeCTKyPKhVcGslKh2YBt4

它是一个很长的字符串,中间用点(. )分隔成三个部分,注意,JWT内部是没有换行的,这里知识为了方便展示,将它写成了几行。

JWT的三个部分一次如下:

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

写成一行就是下面这样

Header.Payload.Signature

Header

header部分是一个JSON对象,描述JWT的原数据,通常是下面的这样子;

{
   
	"alg": "HS256",
	"typ": "JWT"
}

上面代码中,alg 属性表示签名的算法,默认是HMAC SHA256;
typ 属性表示这个令牌(token)的类型,JWT令牌统一写成JWT;
最后,将上面的JSON对象使用Base64URL算法转成字符串。

Payload

Payload部分也是一个JSON对象,用来存放实际需要传递的数据。JWT规定了7个官方字段供选用&

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whoopsina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值