Session和Token
我们之前聊过了Cookie和Cache在网络领域的区别,这次我们来聊一下Session和Token。
Session (会话)
Session 是指在服务器端保存的一个数据对象,用来保存登录用户的信息。
Session由几部分组成:
- 会话ID: 唯一标识一个会话,每次会话开始时,服务器都会生成一个唯一的会话ID。
- 会话数据: 存储在服务器端的会话数据,用来保存登录用户的信息。
- 会话时间: 指的是会话的有效期,如果会话时间过期,则需要重新登录。
Session使用流程:
- 用户输入账号密码,向服务器发送一个请求。
- 服务器验证账号密码,如果验证成功,则生成一个唯一的Session ID和会话时间保存在本地,并把这两样东西返回给客户端。
- 客户端收到Session ID,把Session ID存储在Cookie中,并随后向服务器发送请求。
- 之后的每次消息都会带着Session ID的Cookie,服务器根据Session ID来识别用户。
- 直到会话时间结束,或者用户主动退出,服务器删除Session ID,那么下次再访问服务器时,就需要重新登录,输入账号密码。
总结:
- session可以理解为在服务器端的存储用户登录信息,用来标识用户身份。
Token (令牌)
那么我们可以得知,Session其实会为服务器带来较大的存储压力和性能开销,为什么我们不能把这个验证的内容在客户端进行存储呢? 况且,如果我们是分布式部署的,那么可能换一台服务器就丢失了Session信息。
所以我们引出了Token的概念。
Token由三部分组成,第一个是签名算法,第二个是密钥,第三个是数据。
签名算法: 确定我们要使用的加密算法,用于对Token数据进行签名,防止数据被篡改。
密钥: 用于对Token数据进行加密,防止数据被窃取。这个是服务器端持有。
数据: 也就是Payload,存储着实际的内容,保存登录用户的信息,如用户名、密码、权限等。
访问流程:
- 用户输入账号密码,向服务器发送一个请求。
- 服务器验证账号密码,如果验证成功,则生成一个Token,并把Token返回给客户端,服务器自己只剩下一个签名密文。
- 客户端收到Token,把Token存储在Cookie中,并随后向服务器发送请求。
- 客户端之后的每次请求都会附带Token,服务器用自己的签名密文验证Token,如果验证成功,则返回数据。
总结:
- token可以理解为在客户端存储用户登录信息,用来标识用户身份,减少服务器的存储压力。
JWT (JSON Web Token)
JWT是一种基于JSON的轻量级的安全Token格式,可以用于在各个服务之间传递安全信息。
一般在Java Web里面,用于用户登录身份验证。
JWT由三部分组成,第一部分是Header,第二部分是Payload,第三部分是签名。
Header: 包含了签名算法和Token类型。
Payload: 存储着实际的内容,保存登录用户的信息,如用户名、密码、权限等。
签名: 用于对Token数据进行签名,防止数据被篡改。