Session和Token

这是一篇关于 Session 和 Token 的文章。

Session和Token

我们之前聊过了Cookie和Cache在网络领域的区别,这次我们来聊一下Session和Token。

Session (会话)

Session 是指在服务器端保存的一个数据对象,用来保存登录用户的信息。

Session由几部分组成:

  1. 会话ID: 唯一标识一个会话,每次会话开始时,服务器都会生成一个唯一的会话ID。
  2. 会话数据: 存储在服务器端的会话数据,用来保存登录用户的信息。
  3. 会话时间: 指的是会话的有效期,如果会话时间过期,则需要重新登录。

Session使用流程:

  1. 用户输入账号密码,向服务器发送一个请求。
  2. 服务器验证账号密码,如果验证成功,则生成一个唯一的Session ID和会话时间保存在本地,并把这两样东西返回给客户端。
  3. 客户端收到Session ID,把Session ID存储在Cookie中,并随后向服务器发送请求。
  4. 之后的每次消息都会带着Session ID的Cookie,服务器根据Session ID来识别用户。
  5. 直到会话时间结束,或者用户主动退出,服务器删除Session ID,那么下次再访问服务器时,就需要重新登录,输入账号密码。

总结:

  • session可以理解为在服务器端的存储用户登录信息,用来标识用户身份。

Token (令牌)

那么我们可以得知,Session其实会为服务器带来较大的存储压力和性能开销,为什么我们不能把这个验证的内容在客户端进行存储呢? 况且,如果我们是分布式部署的,那么可能换一台服务器就丢失了Session信息。

所以我们引出了Token的概念。

Token由三部分组成,第一个是签名算法,第二个是密钥,第三个是数据。

签名算法: 确定我们要使用的加密算法,用于对Token数据进行签名,防止数据被篡改。

密钥: 用于对Token数据进行加密,防止数据被窃取。这个是服务器端持有。

数据: 也就是Payload,存储着实际的内容,保存登录用户的信息,如用户名、密码、权限等。

访问流程:

  1. 用户输入账号密码,向服务器发送一个请求。
  2. 服务器验证账号密码,如果验证成功,则生成一个Token,并把Token返回给客户端,服务器自己只剩下一个签名密文。
  3. 客户端收到Token,把Token存储在Cookie中,并随后向服务器发送请求。
  4. 客户端之后的每次请求都会附带Token,服务器用自己的签名密文验证Token,如果验证成功,则返回数据。

总结:

  • token可以理解为在客户端存储用户登录信息,用来标识用户身份,减少服务器的存储压力。

JWT (JSON Web Token)

JWT是一种基于JSON的轻量级的安全Token格式,可以用于在各个服务之间传递安全信息。

一般在Java Web里面,用于用户登录身份验证。

JWT由三部分组成,第一部分是Header,第二部分是Payload,第三部分是签名。

Header: 包含了签名算法和Token类型。

Payload: 存储着实际的内容,保存登录用户的信息,如用户名、密码、权限等。

签名: 用于对Token数据进行签名,防止数据被篡改。