身份令牌 | 会话保持:JWT是什么?

297 阅读4分钟

你知道你现在正在浏览的网站是怎么识别你的身份信息的吗?

系统如何知道是你点击了三连,是你发送的评论?

今天就带大家了解一下网站背后身份信息的识别原理。

如今普遍的互联网通讯协议都是通过HTTP进行的,HTTP是一种超文本传输协议,说人话就是应用程序的媒体内容传输的规范,其通讯特征是一次请求一次响应,是一种无状态通讯协议,所谓无状态性就是说上一次通讯的关系会丢失。举个例子你谈了个女朋友,你们第一次出去约会的时候就已经建立好了恋人关系,那么下一次你们再出去约会是不是就可以直接步入正题了?但是无状态性就表示,你们下一次约会也同样需要从新建立恋人关系,相当于是再从普通朋友从新升温建立好感,最后升级为恋人。不仅是下一次,之后的每一次约会都是,是不是感觉特别麻烦?那么如何让客户端的登录状态与服务器之间长期保持呢?

**

首先举个例子方便大家对原理有个基本认识,我们把服务器想象成一座古代的城池,那么客户端发送的请求就像是世界各地来拜访或交易的商人,城池规定想要进入必须先进行登记,商人需要将自己的身份信息进行上报,上报信息后城池的管理者会为商人签发一枚通行令牌,有了通行令牌后商人就可以自由进入城池,签发令牌的目的是为了避免每次商人来交易时都需要上报身份信息,因为这样实在太过麻烦,有了通信令牌以后商人再此来交易时就只需要交出令牌给守卫查看,守卫识的令牌有效后便放人进入。

好了现在你大概了解了网站对身份信息识别的基本原理,那我们再从程序员角度理解一遍:

首先用户输入用户名和密码登录到某个网站,客户端发送用户输入的用户名和密码到服务器,服务器对其进行身份信息校验,也就是识别用户名密码是否有效,校验成功后将用户身份信息签发为通行令牌,服务器会保存一份令牌样本方便后续的对比,然后向客户端回复这个通行令牌。客户端接收到令牌后保存到上下文中,后续用户所有的请求操作都会携带这个身份令牌。

那客户端拿到这个令牌有什么用呢?

举个例子,你在浏览我的文章时进行了点赞操作,客户端发送点赞请求,同时也会携带登录时返回的通行令牌。服务器接收到请求后,首先会对令牌进行校验,识别为有效身份令牌后才会允许操作,服务处理完成后返回客户端成功处理响应,然后就点赞成功了。

接下来再带大家了解一下目前最流行的身份令牌技术JWT,全称是JSON Web Token,指的是一种规范,这种规范允许我们使用JWT在两个组织之间传递安全可靠的信息,常用于 Token 的认证授权机制,也就是之前提到的身份令牌工作方式,JWT 本质上就是一组字串,通过“.”切分成三个部分;

  • Header: 令牌头部,记录了整个令牌的类型和签名算法
  • Payload: 令牌载荷,记录了保存的主体信息,比如你要保存的用户信息就可以放到这里
  • Signature(签名) :令牌签名,按照头部固定的签名算法对整个令牌进行签名,该签名的作用是:保证令牌不被伪造和篡改
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Header 和 Payload 都是 JSON 格式的数据,Signature 由 Payload、Header 和 Secret(密钥)通过特定的计算公式和加密算法得到。

令牌头部和 令牌载荷都是JSON 格式的数据,我们可以通过BASE64解码还原。 令牌签名则是由令牌载荷、令牌头部和密钥通过特定的计算公式和加密算法得到。

通过JWT令牌机制我们就能保证客户端和应用服务器之间的会话状态了

关注我,学习更多编程知识!